已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
总结系列_1(opencv需常用的小工程,续.)本文中将列出opencv需常用的最小工程,以方便今后做测试用。工程环境为vs2010+opencv2.3.1一、opencv读取图片并显示出来。代码为:#include stdafx.h#include using namespace cv;int main(int argc,unsigned char* argv) Mat img_src; for (;) img_src=imread(lena.jpg); imshow(lena_show,img_src); waitKey(30); return 0; 二、opencv读取avi文件并显示出来:注意有些avi格式的视频是读不出来的。代码为: 1 #include stdafx.h 2 #include 3 using namespace cv; 5 int main(int argc,unsigned char* argv) 7 8 Mat img_src; 9 VideoCapture vido_file(tree.avi);10 for (;)11 12 vido_file img_src;13 imshow(video_src,img_src);/可以事先不用新建一个窗口14 char c=(char)waitKey(47);15 if (c=27)16 17 break; 18 19 20 return 0;21 三、opencv驱动摄像头并显示出来。代码为: 1 #include stdafx.h 2 #include 3 4 using namespace cv; 5 6 int main(int argc,unsigned char* argv) 7 8 Mat img_src; 9 VideoCapture cam(0);10 for (;)11 12 cam img_src;13 imshow(camera,img_src);/可以事先不用新建一个窗口14 char c=(char)waitKey(30);15 if (c=27)16 17 break; 18 19 20 return 0;21 以下的环境改为:opencv2.4.2+vs2010四、opencv打开摄像头并对摄像头内视频进行canny边缘检测。代码为: 1 / cam_test.cpp : 定义控制台应用程序的入口点。 4 #include stdafx.h 5 #include 6 #include 7 #include 8 #include 9 10 #pragma comment( lib, opencv_core242.lib )11 #pragma comment( lib, opencv_highgui242.lib )12 #pragma comment( lib, opencv_imgproc242.lib )13 14 using namespace cv;15 using namespace std;16 17 int main( int argc, const char *argv )18 19 20 VideoCapture cap(0); / open the default camera21 if(!cap.isOpened() / check if we succeeded22 return -1;23 Mat edges;24 namedWindow(edges,1);25 for(;)26 27 Mat frame;28 cap frame; / get a new frame from camera29 cvtColor(frame, edges, CV_BGR2GRAY);30 GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);31 Canny(edges, edges, 0, 30, 3);32 imshow(edges, edges);33 if(waitKey(30) = 0) break;34 35 / the camera will be deinitialized automatically in VideoCapture destructor36 return 0;37 总结系列_2(vc,opencv,Qt等错误调试,续.) 本文将总结一些在使用opencv+vs过程中碰到的error。1.程序编译通过,运行时出现如下错误:解决方法:a.可能是读取文件时出现错误,比如说读图片,视频等文件名字或路径弄错了。2. 编译程序通过,运行时出现如下错误: 解决方法: a可能是数据类型不对,比如说在该语句中gray_diff.at(i,j)=255; 本来gray_diff中的数据类型是unsigned char的,如果你写成了gray_diff.at(i,j)=255;或者是写成其它的就会报类似的错误。3. 当编译通过,运行程序一段时间后出现如下提示:解决方法:a. 可能是读取的地址无效,比如说你去读取一副图片,但是你给的图片目录中没有该文件的话就会出现类似错误。4.如果自己单独写一个头文件,比如说gmm.hpp,头文件中也包含了opencv用到的系统头文件,但是在gmm.hpp中应用opencv自带的变量类型时会报错。比如说gmm.hpp的内容为,已被main.cpp包含进去了。gmm.hpp内容如下图所示:编译是报错如下:则原因是没有使用opencv的命名空间,加入一句using namespace cv;即可。以后要注意了,使用了opencv的头文件后,要同时使用其命名空间,否则是会报错的。5. 如果生成项目时,出现如下错误提示:则说明你在头文件中定义了变量,且这个头文件有被2个或2个以上的源文件包含了。因此可以得出结论,尽量不要在头文件中定义变量,如果要定义的话,就需要在前面加一个static关键字。6.当用单步调试,变量监视器来监视Mat型变量时,查看Mat型里面的data数据(特别是其数据类型为浮点数时),有可能出现如下显示:这并不是说明这个Mat类型数据有错误,只是变量监视显示不出来而已,可能有如下2个原因:一是该变量只能显示unsigned char型的数据,其他非此类的数据显示可能有误;二是Mat型内部数据不同点对应的数据可能不同,所以也有可能显示不出来。7. 重装系统前用的xp+opencv2.3.1+vs2010,opencv打开摄像头正常,重装系统后用的xp+opencv2.4.2+vs2010,程序没有变化,opencv运行这些程序时打开摄像失败,但是用运行opencv1.0sample中有关摄像头的exe正常。另外摄像头驱动正常,比如qq视频,xp系统自带摄像头软件都能运行。这是什么原因呢? 后面在网上查,他们都说opencv2.0以前只支持VWF驱动,这个是微软比较老的驱动。到opencv2.0以后就采用VedioCapture类,支持DirectShow类。难道是我摄像头的驱动过低?后面试了很多摄像头的驱动,从01年的到11年的,都不行。最后也测试了这个VideoCapture类读取视频avi文件功能,发现也不顺利。后面自己重新建立了一个工程,采用同样的代码就顺利运行了。(因为刚装opencv2.4.2,所以我拿的是以前在opencv2.3.1下没写完的代码,屏蔽之,加入摄像头测试代码的),看来可能是2.3.1下的某些东西影响了吧。总之,能工作就好!8.当调试时变量显示为-1.#IN00 0,有下面几种可能。一是该变量(一般是float类型)在debug模式下没有进行初始化导致的。二是有可能是计算出来的值越界了,比如说无穷大或者无穷小的float数了,有可能是除了分母为0的数。9. 为什么opencv2.4.2中新建的视频的窗口名字会出现乱码呢?有时候甚至名字都不显示出来。且本应该有的滑动条也显示不出来或者乱套了。这是因为如果在debug环境下,则对应的dll库后面都应该加有d字样,比如opencv_core242d.dll,如果用的是opencv_core242.dll,则就有可能出现窗口名字乱码,甚至连滑动条都不能显示的情况。同理如果在release下用带有d字样结尾的dll则会直接内存报错,所以此时只能用不带d的dll。一句话,debug下用debug下对应的dll,release下用release对应的dll即可。10. 在qt中如果定义在头文件中定义了槽函数,则在cpp源文件必须去实现该槽函数,否则会出现类似undefinedreferencetoMainWindow:on_pushButton_clicked()的错误,该错误是由于在UI中删除了某些不用的按钮造成的。11.如果用Qt的控制台建立程序,运行程序时出现下面的错误提示:这是因为控制台程序不能使用Qt的界面(本程序中使用了QMessageBox),因此需要在工程pro的代码中把QT gui给去掉,否则会报类似的这种错误。12.如果是在OpenCV中出现如下错误:则表示是imshow函数需要还来不及显示完成就被其它的函数给中断了,这可能在回调函数中出现这种情况。总结系列_3(opencv中c版本和c+版本区别体验,续.)1. 显示窗口大小的改变方法不同。在c版本中,定义一个窗口时用cvNamedWindow.比如说cvNamedWindow(“src”,0);后面的参数为0表示窗口大小可以手动改变,否则窗口的大小是自适应图片大小的。而在c+版本中定义一个窗口用namedWindow.比如说namedWindow(“src”,1);不管后面第二个参数是多少,都不能手动更改窗口的大小,因为它的尺寸是根据图片大小自动生成的。 并且要看到手动调整窗口大小的效果,还需要配合cvShowImage(“src”,img);也就是说如果后面显示用c+版本的imshow(“src”,img);也是看不到手动调整图片大小的效果的。2. 显示图片的函数不同。在opencv的c版本中,显示图片用cvShowImage;比如说,cvShowImage(“src”,img);并且这里的img是IplImage*类型,所以如果你定义的img是Mat类型的话就用不了,因为程序不能自动将Mat类型转换成IplImage*类型。在opencv的c+版本中,显示图片用的是imshow;比如说,imshow(“src”,img);当然这里的img就是Mat类型了。也就是说如果这里的img用IplImage*就不行了,程序不能自动将IplImage*转换成Mat类型。通过上面2点应该注意到,如果要手动改变图片的尺寸,就必须cvNamedWidow(“src”,0);cvShowImage(“src”,img)一起用。其中img是IplImage*类型。 当然cvNamedWindow(“src”,0)也可以和imshow(“src”,img)一起用,其中img是Mat类型,但是这样达不到自动改变窗口大小的目的。因为一般情况下,namedWindow(“src”,1)和imshow(“src”,img)一起用的。下面来看看IplImage结构体内部:intnSizeintIDintnChannelsintalphaChannelintdepthcharcolorModel 4charchannelSeq 4intdataOrderintoriginintalignintwidthintheightstruct _IplROI *roistruct _IplImage *maskROIvoid *imageIdstruct _IplTileInfo *tileInfointimageSizechar *imageDataintwidthStepintBorderMode 4intBorderConst 4char *imageDataOrigin而Mat结构体包含一个Mat头部(头部中记录的是矩阵的大小,存储方式等等)和一个指向矩阵的指针。所以2者还是有很大区别的,所以说程序不能自动将他们转换是有原因的,因为Mat结构更加复杂。3. 读取图片的方式不同。在c版本中读取图片用的是cvLoadImage;比如说cvLoadImage(“lena.jpg”);在c+版本中,读取图片用的是imread;比如说imread(“lena.jpg”);当然这2种的lena图片都是放入工程目录下的。但是这里有一点非常不同的是,cvLoadImage()中的参数为const char*类型,而imread()中的参数是const &string型,这两种是完全不同的,在opencv中也不能自动转换好他们,混合使用c和c+函数一起编写opencv代码时要小心。4. 路径表示方式不同。在c版本中路径之间用2个双右斜线,即”/”。用1个斜线”/”会报错。在c+版本中路径之间用1个或者2个甚至更多个斜线都是可以的。5. c版本的OpenCV只能同时对图片设置一个感兴趣的区域ROI,而C+版本的OpenCV可以同时设置几个ROI。另外在复制的时候,c版本的OpenCV中如果设定了ROI等参数的时候,cvCopy只是复制被设定的区域,复制到一个和所设定参数相吻合的新的IplImage中,而cvClongImage则是将整个IplImage结构复制到新的IplImage中,其中的ROI等参数也会一同复制。新的IplImage将会和原来的一模一样。总结系列_5(opencv知识点,续.)1. 得到Mat类型img的size,可以使用函数img.size(),注意这里有括号。但是在需得到img的行和列时,不需要使用括号,即使用img.rows和img.cols.2. 已经定义好了img为Mat型,但是没有初始化,在后面程序的任何一个位置可以使用下面的代码初始化img,比如img=Mat(*1,*2),其中*1是矩形区域的大小,*2是数组内数据类型。3. 在opencv中像素点的数据类型能找到对应类似char,int,float,double的,比如说是分别为CV_8UC1,CV_16UC1,CV_32FC1, CV_64FC1,一定要注意是没有这一说法的CV_16FC1。4. 在对opencv工程进行debug时,如果想查看Mat型内部的数据,直接在变量监视器里面看是不行的,且观察时其内部还有可能报错。最好是将Mat类型数据cout到屏幕终端观察。5. 将一个vector类型的变量转换成一个Mat型变量,可以采用下面的方法:Vector& c=contours(0);Mat Cnew; Cnew=Mat(c); 6.Scalar与CvScalar类似,都是标量,用于存储像素值的,有4个通道,每个通道可存double型,其内部定义为:typedefstruct CvScalar double val4;CvScalar;7.当图像像素值为hsv空间时,hsv中3个分量的取值范围为0 180,0 255,0,255.8.opencv中的NAN表示是非数字,即NotA Number,INF表示无穷大,比如+INF:正无穷,-INF:负无穷。9.RGB空间是类似人眼工作机制,被各种显示设备采用。HSV,HLS是描述颜色更自然的方法,去掉最后一个元素可以使算法对光照不敏感。YCrCb在jpeg中广泛使用。Lab是在感知上比较均匀的颜色空间,适合度量2个颜色之间的距离。10.在使用zeros函数时,如果是用这个zeros(introws, intcols, inttype),注意第一个参数为rows,即图像的高度。如果是用zeros(Sizesize, inttype)而size又为Size(cols,rows),其第一个参数为cols,即图像的宽度。即Mat大小先是高度然后是宽度,而size大小显示宽度然后是高度。11. Size wholeSize;Point roiofs;img.locateROI(wholeSize, roiofs);locateROI在此处是如果img图像是从其它父图像中某一部分得来的,那么其父图像的大小尺寸就为wholeSize了,img图像左上角那个点相对于父图像的左上角位置就为点roiofs了。12. 在opencv学习中,经常会读一些基于1.0版本的opencv代码,如果我们需要在2.0以后版本中使用已有的代码,遇到的问题最多的就是Mat和IplImage*之间的转换,现在举个例子来简单说明一下这2者之间的转换。假设已经定义: Mat src; IplImage* img; 并且也假设src或者img中已经有了数据。则如果需要将src转换到img,应该使用下面的语句:img = &src.operator IplImage();如果是将img转换到src,则直接使用下面的语句:src = Mat(img);这是opencv基于c版本和c+版本混合编程的处理方法。13. 在opencv的core.hpp里面有AutoBuffer()函数,该函数为自动分配一段指定大小的内存,并且可以指定内存中数据的类型。14.调用Mat:copyTo()函数时,如果需要有mask操作,则不管源图像是多少通道的,其mask矩阵都要定义为单通道,另外可以对一个mask矩阵画一个填充的矩形来达到使mask矩阵中对应ROI的位置的值为设定值,这样就不需要去一一扫描赋值了。15. 在使用OpenCV的Mat矩阵且需要对该矩阵进行扫描时,一定要注意其取值顺序,比如说列和行的顺序,如果弄反了,则经常会报内存错误。16.在使用OpenCV内部的判断条件时应该使用CV_Assert()函数,而不是CV_ASSERT()。17. 通过实验测试发现,虽然经过calcHist()函数计算过后的直方图保存在hist中,这里hist是一个Mat类型,并且如果计算的是一维的直方图的话,则hist是一个列向量。18.当Mat中数据的类型为CV_16UC1的时候,这里的16U并不是指unsigned int,而是指的是unsigned short int,因为在OpenCV框架中,int不是16位的,而是32位的。没想到我使用OpenCV一年了,今天才弄清楚这个。19. 坐标体系中的零点坐标为图片的左上角,X轴为图像矩形的上面那条水平线;Y轴为图像矩形左边的那条垂直线。该坐标体系在诸如结构体Mat,Rect,Point中都是适用的。(虽然网上有学着说OpenCV中有些数据结构的坐标原点是在图片的左下角,但是我暂时还没碰到过)。20. 在使用image.at(x1, x2)来访问图像中点的值的时候,x1并不是图片中对应点的x轴坐标,而是图片中对应点的y坐标。因此其访问的结果其实是访问image图像中的Point(x2, x1)点,即与image.at(Point(x2, x1)效果相同。21. 如果所画图像是多通道的,比如说image图像的通道数时n,则使用Mat:at(x, y)时,其x的范围依旧是0到image的height,而y的取值范围则是0到image的width乘以n,因为这个时候是有n个通道,所以每个像素需要占有n列。但是如果在同样的情况下,使用Mat:at(point)来访问的话,则这时候可以不用考虑通道的个数,因为你要赋值给获取Mat:at(point)的值时,都不是一个数字,而是一个对应的n维向量。22. 多通道图像在使用minMaxLoc()函数是不能给出其最大最小值坐标的,因为每个像素点其实有多个坐标,所以是不会给出的。因此在编程时,这2个位置应该给NULL。总结系列_7(opencv2.4.2+vs2010安装简介)环境: XP SP3 +32位系统+ VS2010 + opencv2.4.2步骤1: 到这来选择下载 opencv2.4.2.exe .步骤2: 双击exe解压到自己想安装的目录,我这来是解压完后的目录为:C:ProgramFilesopencv2.4.2步骤3: 配置环境变量,在系统环境变量和用户环境变量下均配置下面2个环境变量(没有测试过是否2个地方都需要配置) 变量名: 变量值:PATH: C:Program Filesopencv2.4.2buildx86vc10bin TBB: C:Program Filesopencv2.4.2buildcommontbbia32vc10步骤4:新建一个VS控制台项目,主函数代码改为如下:/ opencv2_4_2test.cpp : 定义控制台应用程序的入口点。#include stdafx.h#include #include #pragma comment( lib, opencv_core2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 乡村直播销售员的直播互动设计
- 度建筑设计师个人工作计划与目标设定
- 高端社区节水型排水系统规划及实践
- 网约车驾驶员收入分析报告与职业发展规划建议
- 高级宠物基因编辑师面试流程及技巧
- 审计师工作流程详解及自我发展规划
- 仓库智能化升级改造项目实施计划
- 智能化房地产评估报告系统建设实施计划
- 年度造林工作要点通知书
- 广东理工学院专插本入学通知书
- 建筑装饰石材知识培训课件
- 全国数智产业发展研究报告(2024-2025)
- 涂装作业人员安全培训课件
- 新版中华民族共同体概论课件第六讲“五胡入华”与中华民族大交融(魏晋南北朝时期)-2025年版
- 人工智能+跨界融合智能电网安全稳定运行分析报告
- 2025年中国宠物用羊奶粉行业市场全景分析及前景机遇研判报告
- 辽医药护理中职单招题库及答案解析
- 2025年电工职业技能鉴定试卷(初级工)实操试题及答案解析
- 2025年P气瓶充装证模拟考试题及答案
- 小学生心理健康教育课程的设计与实施研究
- 2025全国消防安全培训课件
评论
0/150
提交评论