简单的寻求中心点和选择角度程序处理速度极慢

JasperD 2017-06-09 05:29:37
加精
代码如下,时间测算一帧5000ms,试过并行运行,只优化400ms。。
#include<opencv2/nonfree/features2d.hpp> //使用SiftFeatureDetector需要加上此头文件
#include<opencv2\opencv.hpp>
#include<iostream>
#include<fstream>
#include "iostream"
#include "highgui.h"
#include "cv.h"
#include "cxcore.h"
#include <opencv/cxcore.h>

using namespace cv;
using namespace std;
#define ERROR 1234
CvBox2D Box2D;

void drawCross(CvArr* img, CvPoint2D32f point, CvScalar color, int size, int thickness)
{
//绘制横线
cvLine(img, cvPoint(point.x - size / 2, point.y), cvPoint(point.x + size / 2, point.y), color, thickness, 8, 0);
//绘制竖线
cvLine(img, cvPoint(point.x, point.y - size / 2), cvPoint(point.x, point.y + size / 2), color, thickness, 8, 0);
return;
}
CvSeq *GetAreaMaxContour(CvSeq *contour)
{//在给定的contour中找到面积最大的一个轮廓,并返回指向该轮廓的指针
double contour_area_temp = 0, contour_area_max = 0;
CvSeq * area_max_contour = 0;//指向面积最大的轮廓
CvSeq* c = 0;
//printf( "Total Contours Detected: %d\n", Nc );
for (c = contour; c != NULL; c = c->h_next)
{//寻找面积最大的轮廓,即循环结束时的area_max_contour
contour_area_temp = fabs(cvContourArea(c, CV_WHOLE_SEQ)); //获取当前轮廓面积
if (contour_area_temp > contour_area_max)
{
contour_area_max = contour_area_temp; //找到面积最大的轮廓
area_max_contour = c;//记录面积最大的轮廓
}
}
return area_max_contour;
}
void getCenter(IplImage *img){
IplImage *src = img;
int data[16] =
{
0, 0, 0, 0,
0, 0, 1, 0, ///图像的腐蚀
0, 1, 1, 0,
0, 0, 0, 0
};
IplConvKernel *Element = cvCreateStructuringElementEx(4, 4, 2, 2, CV_SHAPE_RECT, data);;
cvSmooth(src, src, CV_MEDIAN, 5, 5, 0, 0);
cvErode(src, src, Element, 2);
// ***********************************************/
IplImage *src_RGB = cvCreateImage(cvGetSize(src), 8, 3);
IplImage *ZeroImage = cvCreateImage(cvGetSize(src), 8, 3);
cvZero(ZeroImage);
src_RGB = cvCloneImage(src); //copy Image
IplImage *src_gray = cvCreateImage(cvGetSize(src), 8, 1);
IplImage *Canny_Image = cvCreateImage(cvGetSize(src), 8, 1);
IplImage *Threshold = cvCreateImage(cvGetSize(src), 8, 1);
cvCvtColor(src, src_gray, CV_RGB2GRAY);
//cvNamedWindow("GRAY", 0);
//cvResizeWindow("GRAY", 500, 500);
//cvShowImage("GRAY", src_gray);//显示灰色图像


//转为二值化图像
cvThreshold(src_gray, Threshold, 150, 255, CV_THRESH_BINARY);//参数调整阈值大小影响图像取轮廓 150阈值
//cvNamedWindow("Threshold", 0);
//cvResizeWindow("Threshold", 500, 500);
//cvShowImage("Threshold", Threshold);
CvMemStorage *storage = cvCreateMemStorage(0);
CvSeq * Image_Seq;

//使用canny算法提取图像的轮廓
cvCanny(Threshold, Canny_Image, 125, 255, 3);
//使用cvfindcontour函数提取轮廓
cvFindContours(Canny_Image, storage, &Image_Seq, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE);


cvDrawContours(src_RGB, Image_Seq, CV_RGB(200, 65, 45), CV_RGB(100, 165, 45), 2, 2, 8);
cvDrawContours(ZeroImage, Image_Seq, CV_RGB(200, 65, 45), CV_RGB(255, 2555, 255), 2, 2, 8);


CvSeq * Cal_Contours = GetAreaMaxContour(Image_Seq);
CvPoint2D32f Array[4];

for (; Cal_Contours != 0; Cal_Contours = Cal_Contours->h_next)
{ //show Angle to Image
CvSeq* InterCon = Cal_Contours->v_next;
for (; InterCon != 0; InterCon = InterCon->h_next)
{
Box2D = cvMinAreaRect2(Cal_Contours);


CvBox2D FitBox;
FitBox = cvMinAreaRect2(Cal_Contours);
// cvFitEllipse2(Cal_Contours);
// printf("Cal_Contours of angle %f",Box2D.angle);
CvBox2D ellipse = cvFitEllipse2(Cal_Contours);
cvBoxPoints(FitBox, Array);
cvEllipseBox(src_RGB, ellipse, CV_RGB(255, 255, 0)); //在图上画椭圆
printf("%f %f ", Array[0].x, Array[0].y);
float a = (Array[0].x + Array[1].x + Array[2].x + Array[3].x) / 4;
float b = (Array[0].y + Array[1].y + Array[2].y + Array[3].y) / 4;
printf("%f %f ", a, b);
printf("\n");
cvLine(ZeroImage, cvPoint(Array[0].x, Array[0].y), cvPoint(Array[1].x, Array[1].y), CV_RGB(114, 45, 255), 2, 8);
cvLine(ZeroImage, cvPoint(Array[1].x, Array[1].y), cvPoint(Array[2].x, Array[2].y), CV_RGB(114, 45, 255), 2, 8);
cvLine(ZeroImage, cvPoint(Array[2].x, Array[2].y), cvPoint(Array[3].x, Array[3].y), CV_RGB(114, 45, 255), 2, 8);
cvLine(ZeroImage, cvPoint(Array[3].x, Array[3].y), cvPoint(Array[0].x, Array[0].y), CV_RGB(114, 45, 255), 2, 8);
drawCross(ZeroImage, Box2D.center, cvScalar(0, 0, 255), 200, 10);//十字中点


//在图上画圆
//cvCircle(ZeroImage,cvPoint((int)Box2D.center.x,(int)Box2D.center.y) ,50,CV_RGB(45,89,56),2,8);
////draw RectAngle to Image
// CvRect rect= cvBoundingRect(Cal_Contours);
// cvRectangle(ZeroImage,cvPoint(rect.x,rect.y),cvPoint(rect.x+rect.width ,rect.y+rect.width),CV_RGB(114,45,255),2,8);
}
}


//显示图像
cvNamedWindow("ZeroImage", 0);
cvResizeWindow("ZeroImage", 500, 500);
cvShowImage("ZeroImage", ZeroImage);
//cvNamedWindow("src", 0);
//cvResizeWindow("src", 500, 500);
//cvShowImage("src", Canny_Image);
//cvNamedWindow("src_RGB", 0);
//cvResizeWindow("src_RGB", 500, 500);
//cvShowImage("src_RGB", src_RGB);






return;

}
int getSift(IplImage *img){
Mat c_src2(img, true);
Mat c_src1 = imread("s2.jpg");

Mat src1 = imread("s2.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat src2;
cvtColor(c_src2, src2, CV_RGB2GRAY);
if (!src1.data || !src2.data)
{
std::cout << " --(!) Error reading images " << std::endl; return -1;
}


///***************************************************


//sift feature detect
SurfFeatureDetector detector;
vector<KeyPoint> kp1, kp2;

detector.detect(src1, kp1);
detector.detect(src2, kp2);
SurfDescriptorExtractor extractor;
Mat des1, des2;//descriptor
extractor.compute(src1, kp1, des1);
extractor.compute(src2, kp2, des2);
Mat res1, res2;
int drawmode = DrawMatchesFlags::DRAW_RICH_KEYPOINTS;
drawKeypoints(c_src1, kp1, res1, Scalar::all(-1), drawmode);//在内存中画出特征点
drawKeypoints(c_src2, kp2, res2, Scalar::all(-1), drawmode);
cout << "size of description of Img1: " << kp1.size() << endl;
cout << "size of description of Img2: " << kp2.size() << endl;

BFMatcher matcher(NORM_L2);
vector<DMatch> matches;
matcher.match(des1, des2, matches);
Mat img_match;
drawMatches(src1, kp1, src2, kp2, matches, img_match);//,Scalar::all(-1),Scalar::all(-1),vector<char>(),drawmode);

//cout << kp1.at(matches.at(1).queryIdx).angle << endl;
//cout<<kp2.at(matches.at(1).trainIdx).angle << endl;


//投票表决,获得近似的角度
int angle_count[361] = { 0 };
int count = 0;
#pragma omp parallel for
for (int i = 0; i < matches.size(); i++)
{
int index = kp2.at(matches.at(i).trainIdx).angle - kp1.at(matches.at(i).queryIdx).angle + 0.5;

//fileo << kp2.at(matches.at(i).trainIdx).angle - kp1.at(matches.at(i).queryIdx).angle << endl;

index = index > 0 ? index : index + 360;

//cout << index << endl;
angle_count[index]++;
}
int maxindex = 0;
#pragma omp parallel for
for (int i = 0; i < 361; i++)
{
//cout << i << " " << angle_count[i]<<endl;
if (angle_count[i] >= angle_count[maxindex])
{
maxindex = i;
}
}
maxindex = (maxindex - 360) < 0 ? maxindex : (maxindex - 360);
cout << "旋转角度:" << maxindex - 1 << endl;

//对临界值的处理,存在一些问题
int down, up;
down = maxindex - 1 < 0 ? maxindex : maxindex - 1;
up = maxindex + 1 > 360 ? maxindex : maxindex + 1;
double angle = 0;
count = 0;
#pragma omp parallel for
for (int i = 0; i < matches.size(); i++)
{
double temp = kp2.at(matches.at(i).trainIdx).angle - kp1.at(matches.at(i).queryIdx).angle;
if (temp >= down&&temp <= up)
{
count++;
angle += temp;
}
}
angle /= count;
cout << "精确角度:" << angle - 0.2 << endl;

cout << "number of matched points: " << matches.size() << endl;
cvNamedWindow("matches", 0);
cvResizeWindow("matches", 500, 500);
imshow("matches", img_match);
////////////////////////////中心点
return 0;
}


int main(int argc, char* argv[])
{
//ofstream fileo("data.txt");
IplImage* pFrame = NULL;
//获取摄像头
CvCapture* pCapture = cvCreateCameraCapture(-1);
//创建窗口
cvNamedWindow("video", 0);
cvResizeWindow("video", 640, 480);
//显示视屏
while (true)

{
double start,end, t1, t2;

start = (double)cvGetTickCount();//记下开始的时钟计数,以便计算函数或用户代码执行时间
pFrame = cvQueryFrame(pCapture);
if (!pFrame)break;
cvShowImage("video", pFrame);
IplImage *img = pFrame;

getCenter(img);

getSift(img);

if (waitKey(33) == 'q')
break;
end = (double)cvGetTickCount();//记下结束的时钟计数
t1 = (end - start) / ((double)cvGetTickFrequency()*1000.);//计算运行时间,以毫秒为单位
printf("Run time without OpenMP = %g ms\n", t1);


}

cvReleaseCapture(&pCapture);
cvDestroyWindow("video");
cvWaitKey();
return 0;
}
...全文
2716 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
大大的道道的 2017-09-15
  • 打赏
  • 举报
回复
用openmp 开多线程优化。。 或者利用金字塔,即把图像宽高一倍后再提取surf 特征点,这样每缩小一倍,性能就提升4倍。。。。
z371135857 2017-08-31
  • 打赏
  • 举报
回复
来看看学习 ..........
pugongyingpgyidc 2017-07-14
  • 打赏
  • 举报
回复
火龙果ovo 2017-07-07
  • 打赏
  • 举报
回复
很有用的文章,支持支持
nettman 2017-07-06
  • 打赏
  • 举报
回复
hah_dalong 2017-06-27
  • 打赏
  • 举报
回复
好帖帮顶666666666666666666666666666666666666
  • 打赏
  • 举报
回复
66666666666666
hugh_z 2017-06-17
  • 打赏
  • 举报
回复
6666666666666666
hugh_z 2017-06-15
  • 打赏
  • 举报
回复
6666666666666666
JasperD 2017-06-14
  • 打赏
  • 举报
回复
实在受不了了,有偿优化,简单功能。会的可以加我Q 407208188 价格面谈
JasperD 2017-06-14
  • 打赏
  • 举报
回复
引用 8 楼 wangyaninglm 的回复:
对了,楼上的启发我了,可以用profile这种东西看看你的耗时到底ka在啥地方,再有针对性的优化
做过这个测试了,优化了一部分,重点还是在surf这个函数上,实时的摄像头数据进行surf处理的话时间有点跟不上,大概处理一帧就要900ms
JasperD 2017-06-14
  • 打赏
  • 举报
回复
引用 7 楼 ljheee 的回复:
断点 看一下,哪里最耗时,再定位
已经做过,初步优化了,加了mask把surf的区域减小,但是这个surf的函数是时间最长的目前,只能是换个算法,或者找个方式优化
ljheee 2017-06-12
  • 打赏
  • 举报
回复
断点 看一下,哪里最耗时,再定位
shiter 2017-06-12
  • 打赏
  • 举报
回复
对了,楼上的启发我了,可以用profile这种东西看看你的耗时到底ka在啥地方,再有针对性的优化
cattpon 2017-06-11
  • 打赏
  • 举报
回复
learning~
hugh_z 2017-06-10
  • 打赏
  • 举报
回复
6666666666666
nettman 2017-06-10
  • 打赏
  • 举报
回复
cattpon 2017-06-10
  • 打赏
  • 举报
回复
learning~
qq_33464485 2017-06-10
  • 打赏
  • 举报
回复
学习了 受教了
《Core Java》介绍和我的课程计划 李冰Email: bing.li@asu.eduWeChat: libertymama2021年4月15日 这是我第一次通过录屏的方式讲授主流程序设计技术。从今年二月底至今,我已经录制了105讲52.5小时的视频课程。通过这段时间的工作,我认为借助互联网强大的传播能力,这种新型教育方式完全具备超越传统实体模式的巨大优势,一定会成为未来教育的发展趋势。我会积极投入到这项事业当中,尽我所能提供更多高质量在线教学课程。 一、本课程内容 本课程将以Cay Horstmann的经典著作《Core Java》(第11版,2019年)为蓝本面向广大程序设计爱好者以及专业人员讲授基础Java程序设计技术。对于主流程序设计语言的教学,教材的选用对教学效果具有决定意义。我虽然有大量Java语言开发经验,但并没有时间和精力按照我自己的理解写一部教材。在这种情况下,不妨在现有资料中做出恰当选择。在长期Java程序开发过程中,我收集的各种Java程序设计书籍超过50部。它们包括基础技术、设计模式、并发技术、数据处理、网络通信、性能优化、代码测试以及高级技巧等多个方面。通过对这些书籍的比较,我认为《Core Java》是全面介绍Java技术的经典教材。它篇幅宏大,对Java标准版(Java Standard Edition – JSE)大大小小各种问题做了细致入微的介绍。对学习者来说,它无疑是众多介绍Java基础技术书籍中的最佳选择。 为了方便学习者掌握本书,我对全书内容进行了摘要并编纂成幻灯片。在这个准备过程中,即使作为拥有大量程序设计经验的我来说,我也发现了我对一些细节认识的模糊,有的甚至从来没有接触过。事实上,这些细节对于我们提高程序质量是大有裨益的。作为基础程序设计技术的经典之作,本书除了有翔实完整的描述外,还包括大量具有充分说服力的程序示例。这体现了计算机科学作为当代最重要的科学分支之一所独有的理性诉求。为了使学习者更深入了解每一项技术,我还额外增添了很多程序示例,更加丰富了本课程的内容。这些示例使得全书所有论述都是建立在代码支持的基础上,成为学习Java程序设计技术最坚实的保证。 还有一点我需要说明的是,作为本课程的主讲者,我并不是简单地照本宣科。根据我的研发和教学经验,对程序设计这样一门复杂技术来说,主讲者以往和当前所从事的研发工作对讲课质量有着至关重要的影响。我会把我在研发中的实际体会融入在整个讲课过程中。对所有重要技术,除了清晰阐述原作者观念以外,我会提供我个人的评价供学习者参考;同时,我还会收集其他资料作为辅助,使得对特定技术的解释更加充分。通过多角度的观察体验,促使学习者全面透彻理解Java语言。我认为这种个性多元的教学方式是帮助大家掌握程序设计的关键所在。 由于本书的庞大容量,我还没有足够时间完成全书的录制。我会坚持完成所有课程,估计在六月中会完成第一卷全部十二章内容;在八月底完成第二卷的录制。保守估计,完成后全部幻灯片页数会超过3,000页;程序示例个数超过700个;全部代码程序会超过15,000行;全部视频课程时长至少会达到150小时,即300讲。当前,我已经完成本书第一卷前五章和第六章部分内容的录制,现在共有105讲(52.5小时)的视频,幻灯片达到1,222页。其中包括212个程序示例,共5,130行代码。在完成本书的全部录制之后,本课程将成为国内全网范围内时间最长和内容最丰富的Java基础技术视频教材。 当然,《Core Java》这本书也有它的不足。在全面覆盖Java标准版的同时,对一些重点问题的介绍深度上有欠缺。这对于一部力图囊括所有Java基础技术的教材来说也在所难免。为了弥补这个不足,我将在其他课程中予以弥补。这些课程也同样是基于知名经典著作进行介绍。我的初步计划涉及的著作包括:Steven John Metker的《Design Patterns Java Workbook》、Brian Goetz等的《Java Concurrency In Practice》、Elliotte Rusty Harold的《Java Network Programming》、Charlie Hunt和Binu John的《Java Performance》、Ira Forman和Nate Forman的《Java Reflection in Action》以及Maurice Naftalin和Philip Wadler的《Java Generic and Collections》。另外,我还计划把最新出版的其他重要英文程序设计专著在不侵犯版权的前提下,以视频方式呈现给大家。 二、本课程的理念 一项事业一定会有它的理想。程序设计的理想当然是能够完成伟大软件作品。 我们虽然都会在现实中不得不做出一些妥协,但理想总是唯一能够激发我们最大创造力的催化剂,它同样是带给我们最大快乐的源泉。我们也许在不断降低曾经的理想维度,但我们也同时都会在人生每一个寂静时刻扪心自问深刻反省。那些对我们自己灵魂发出的询问,就是我们不会屈服的个性展示。换句话说,面对理想时,我们自始自终都有来自内在天赋的支持。 当然,除了我们的天赋,为了理想,我们同样需要付出巨大的劳动。这些劳动不仅仅是学习和研发过程的坚持,更多的还是抵御外在环境对我们理想意想不到的干扰。其实,无论是否有那些干扰,在外人看来艰辛的劳动对于拥有理想的我们永远是最大的快乐。 对于程序设计来说,我个人伴着理想和辛勤劳动走了很长的路。即使如此,我只能说我对程序设计略知一二,甚至对做出高质量程序的解决之道还有些迷惑了。但我的这些付出,至少使我坚信没有任何灵丹妙药可以实现所谓“在零基础上几日登天”,我也不认为这样做程序的人会真正快乐。事实上,理想只会离这种模式的程序设计更远。 三、我的经验 作为本课程的主讲者,我应该具备一些基本素质。我希望我的经验能够得到各位的认可。 我现有程序代码量达到1,300,000行,其中Java有950,000行,其他语言有350,000行。至少,我在我的人际圈内没有发现超过这个数目的人。 此时此刻,我还在进行两个重要软件项目的研发。第一个是《新万维网》。它是对传统万维网(WWW)的重大改进。当前版本持续开发超过十年,基础层已经建立,我正在努力修改新版界面。我认为这个产品在学术和市场两个方面都会有很好前景。这个项目现在拥有代码行数882,224。从这个角度看,很可能是我国学界最大的软件研究项目。 另一个项目是《GreatFree: 面向互联网环境的通用分布式程序设计技术》。通过我的大量对比,这是国际学界在互联网环境下第一个具备通用开发能力的程序设计技术。尽我所知,我国在程序设计领域的贡献很少,我的这个成果具备首创价值。我正在把它以新的语言形式展现出来。这应该是我国在计算机领域贡献的第一个程序设计语言。现有成果已经开源,大家可以从GitHub上找到,链接是:http://github.com/greatfree/wind。 我当前还在大学任教。我在国际知名企业也有一些工作和实习经验。我曾经工作和实习过的机构包括:北京大学、西安工业大学、IBM研究中心(纽约)和贝尔实验室(北京)等。我还曾在美国亚利桑那州立大学获得过计算机科学博士学位。 四、英文问题 本课程的教材和幻灯片全部使用英文。英文是科技领域的官方语言,所有最新科技成果都是以英文方式呈现的。随着互联网技术的广泛普及,通过网络我们可以轻易获得足够多的英文资料。这对提高我们的程序设计技术和能力有极大帮助。另外,我认为当前大学普遍存在专业教育和英文教育割裂的现象,这是非常荒唐的。对于母语非英文的人来说,通过英文学习专业是掌握英文最佳甚至是唯一可行的学习方式。英文对于程序设计的帮助是决定性的。寻找一个编程中具体问题的答案,英文搜索结果要远好于中文。对于程序设计人员,英文还有更特别的意义,毕竟程序是英文写的。英文差,完全会导致程序质量大幅下降。最后,我着重需要强调的是,英文能够培养一个人科学理性的思维能力,对提高程序质量有着潜移默化的推动作用。 我多年在大学的教学中一直采取以英文学习专业的方式。实践告诉我,这种方式是成功的,普遍受到学生欢迎。我在我任教过的大学总是最受欢迎的老师之一,这和我的英文教学方式分不开。另外,在我的视频课程中,我对每一张幻灯片都有详细的中文口语解释和大量的程序示例。我认为英文不仅不会影响学习质量,反而会促进对具体程序设计技术的理解,毕竟英文更能反映出技术的本质。相比于大量不精确的翻译书籍,我认为直接学习英文原著是最好的选择。与此同时,借助视频技术实现音像并茂,可以生动展示英文教学内容,一定对提高学习者能力有本质上的提高。我认为大家是会欢迎这种模式的。英文不是学习科技的障碍,恰恰相反,它是我们通向科技巅峰的桥梁。 五、可能的学习者 《Core Java》这本书虽然讨论的是基础Java技术,但它翔实全面的风格其实对每一个对程序设计技术感兴趣专业和非专业人士都会有价值。 第一,没有任何程序设计经验的初学者。相比于其他主流语言,Java是经过长期演化后形成的程序设计技术。Java彻底摆脱了早期机器语言的影响,不存在任何对于机器特征过分依赖的编程方式;Java和互联网技术结合得更加紧密,适合学习者初步掌握互联网开发技术;Java采用面向对象程序设计风格,这是当前被普遍接受和推荐的程序设计理念;还有,相比于其他语言,Java的程序呈现方式更加简化。正是由于上述原因,Java是初学者学习程序设计的恰当选择。 第二,需要全面了解Java技术的程序设计人员。根据我的经验,一个程序员完全掌握一门程序设计语言的所有细节是非常困难的,一般都会存在对某个分支或者部分细节缺乏了解的现象。本课程的全面性会帮助程序员查漏补缺,以较小代价对模糊不清的枝节问题进行了解,从而完善自身的程序设计技术,并迅速在实际研发过程中将所学体现出来。 第三,致力于从事基础软件系统开发的Java程序设计人员。本课程讲授的Java标准版是Java最重要的技术。事实上,Java所有的开发能力集中体现在标准版当中,而非其他任何版本(如Java Enterprise Edition – JEE),更不是其他众多架构(Frameworks)所能代替的。在实际开发中,由于Java标准版一些主要技术使用难度相对较大,很多开发人员会有意回避使用它,转而去借助各种架构进行开发,从而快速完成应用软件的建立。从软件工程角度看,这种做法无可厚非。这些架构不要求研发人员具备深厚的基础知识和技能,只需通过简单配置或者简化的脚本语言编程就可以完成高层应用软件开发。但是长此以往,这种做法会逐渐降低程序设计人员的技术能力。只通过架构开发应用的研发人员大都会失去开发复杂基础软件系统的能力。本课程讲授的Java标准版是Java核心技术,对这个技术的全面掌握是开发基础软件系统不可或缺的。 六、怎样掌握Java程序设计技术 事实上,我不认为只通过这个课程就可以真正掌握Java程序设计技术。这个认识对任何程序设计技术课程都是成立。作为一门需要高度实践经验的科学技术,程序设计课程或者书籍只能是辅助的和启发式的。我认为无论使用何种开发技术何种开发理念,真正决定程序质量的永远是人,而不是单独的某项技术。对于一个高水平的程序设计师来说,他完全可以使用相对落后的技术做出高质量的软件;而低水平的程序设计人员,无论使用任何先进工具都无法保证程序水准。因此,我在课堂上经常和学生们说,你们要坚持“每天编程序”。更重要的是,这个程序应该学生独立思考后设想出的一个软件,每天坚持逐步把它做出来。当这个软件达到特定规模时,设计者才会真正领悟到程序设计的核心价值、各种技术的科学理性意义乃至程序设计的乐趣。 最后,除了“每天编程序”,其实我在课堂上对学生还有一个建议,就是“每天读英文”。前两天,我在网上看到一篇文章。它展示了钱学森先生1933年6月在国立交通大学读书时参加《水力学》考试的试卷。我惊讶地发现这份试卷完全是英文作答。这意味着在遥远的八十八年前,我国大学已经开始使用英文进行专业教育了。遗憾的是,在当前我国主要大学里,竟然还做不到这点。我希望大家能够理解我对英文学习重要性的一再重复:在我们这个全新时代,在一个富有朝气的学科中以英文为蓝本展开自己的理想!  

4,246

社区成员

发帖
与我相关
我的任务
社区描述
OpenCV相关技术交流专区
计算机视觉人工智能opencv 技术论坛(原bbs) 广东省·深圳市
社区管理员
  • OpenCV
  • 幻灰龙
  • OpenCV中国团队
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

OpenCV中国团队官方博客:https://blog.csdn.net/opencvchina

试试用AI创作助手写篇文章吧