OpenCV总结Word下载.docx
《OpenCV总结Word下载.docx》由会员分享,可在线阅读,更多相关《OpenCV总结Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
8Matimg_src;
9VideoCapturevido_file("
tree.avi"
10for(;
11{
12vido_file>
>
img_src;
13imshow("
video_src"
//可以事先不用新建一个窗口
14charc=(char)waitKey(47);
15if(c==27)
16{
17break;
18}
19}
20return0;
21}
三、opencv驱动摄像头并显示出来。
3
4usingnamespacecv;
5
6intmain(intargc,unsignedchar*argv[])
9VideoCapturecam(0);
12cam>
camera"
14charc=(char)waitKey(30);
以下的环境改为:
opencv2.4.2+vs2010
四、opencv打开摄像头并对摄像头内视频进行canny边缘检测。
代码为:
1//cam_test.cpp:
定义控制台应用程序的入口点。
4#include"
5#include<
opencv2/core/core.hpp>
6#include<
7#include<
opencv2/imgproc/imgproc.hpp>
8#include<
iostream>
9
10#pragmacomment(lib,"
opencv_core242.lib"
)
11#pragmacomment(lib,"
opencv_highgui242.lib"
12#pragmacomment(lib,"
opencv_imgproc242.lib"
13
14usingnamespacecv;
15usingnamespacestd;
16
17intmain(intargc,constchar**argv)
18{
19
20VideoCapturecap(0);
//openthedefaultcamera
21if(!
cap.isOpened())//checkifwesucceeded
22return-1;
23Matedges;
24namedWindow("
edges"
1);
25for(;
26{
27Matframe;
28cap>
frame;
//getanewframefromcamera
29cvtColor(frame,edges,CV_BGR2GRAY);
30GaussianBlur(edges,edges,Size(7,7),1.5,1.5);
31Canny(edges,edges,0,30,3);
32imshow("
edges);
33if(waitKey(30)>
=0)break;
34}
35//thecamerawillbedeinitializedautomaticallyinVideoCapturedestructor
36return0;
37}
总结系列_2(vc,opencv,Qt等错误调试,续...)
本文将总结一些在使用opencv+vs过程中碰到的error。
1.程序编译通过,运行时出现如下错误:
解决方法:
a.可能是读取文件时出现错误,比如说读图片,视频等文件名字或路径弄错了。
2.编译程序通过,运行时出现如下错误:
解决方法:
a.可能是数据类型不对,比如说在该语句中gray_diff.at<
unsignedchar>
(i,j)=255;
本来gray_diff中的数据类型是unsignedchar的,如果你写成了gray_diff.at<
int>
或者是写成其它的就会报类似的错误。
3.当编译通过,运行程序一段时间后出现如下提示:
a.可能是读取的地址无效,比如说你去读取一副图片,但是你给的图片目录中没有该文件的话就会出现类似错误。
4.如果自己单独写一个头文件,比如说gmm.hpp,头文件中也包含了opencv用到的系统头文件,但是在gmm.hpp中应用opencv自带的变量类型时会报错。
比如说gmm.hpp 的内容为,已被main.cpp包含进去了。
gmm.hpp内容如下图所示:
编译是报错如下:
则原因是没有使用opencv的命名空间,加入一句usingnamespacecv;
即可。
以后要注意了,使用了opencv的头文件后,要同时使用其命名空间,否则是会报错的。
5.如果生成项目时,出现如下错误提示:
则说明你在头文件中定义了变量,且这个头文件有被2个或2个以上的源文件包含了。
因此可以得出结论,尽量不要在头文件中定义变量,如果要定义的话,就需要在前面加一个static关键字。
6.当用单步调试,变量监视器来监视Mat型变量时,查看Mat型里面的data数据(特别是其数据类型为浮点数时),有可能出现如下显示:
这并不是说明这个Mat类型数据有错误,只是变量监视显示不出来而已,可能有如下2个原因:
一是该变量只能显示unsignedchar型的数据,其他非此类的数据显示可能有误;
二是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.#IN000,有下面几种可能。
一是该变量(一般是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源文件必须去实现该槽函数,否则会出现类似undefined
reference
to
MainWindow:
:
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结构体内部:
int
nSize
ID
nChannels
alphaChannel
depth
char
colorModel[4]
channelSeq[4]
dataOrder
origin
align
width
height
struct_IplROI*
roi
struct_IplImage*
maskROI
void*
imageId
struct_IplTileInfo*
tileInfo
imageSize
char*
imageData
widthStep
BorderMode[4]
BorderConst[4]
imageDataOrigin
而Mat结构体包含一个Mat头部(头部中记录的是矩阵的大小,存储方式等等)和一个指向矩阵的指针。
所以2者还是有很大区别的,所以说程序不能自动将他们转换是有原因的,因为Mat结构更加复杂。
3.读取图片的方式不同。
在c版本中读取图片用的是cvLoadImage;
比如说cvLoadImage(“lena.jpg”);
在c++版本中,读取图片用的是imread;
比如说imread(“lena.jpg”);
当然这2种的lena图片都是放入工程目录下的。
但是这里有一点非常不同的是,cvLoadImage()中的参数为constchar*类型,而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知识点,续...)
得到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<
Point>
&
c=contours(0);
MatCnew;
Cnew=Mat(c);
6.Scalar与CvScalar类似,都是标量,用于存储像素值的,有4个通道,每个通道可存double型,其内部定义为:
typedef
structCvScalar
{
doubleval[4];
}CvScalar;
7.当图像像素值为hsv空间时,hsv中3个分量的取值范围为[0180],[0255],[0,255].
8.opencv中的NAN表示是非数字,即Not
ANumber,INF表示无穷大,比如+INF:
正无穷,-INF:
负无穷。
9.RGB空间是类似人眼工作机制,被各种显示设备采用。
HSV,HLS是描述颜色更自然的方法,去掉最后一个元素可以使算法对光照不敏感。
YCrCb在jpeg中广泛使用。
Lab是在感知上比较均匀的颜色空间,适合度量2个颜色之间的距离。
10.在使用zeros函数时,如果是用这个zeros(int
rows,int
cols,int
type),注意第一个参数为rows,即图像的高度。
如果是用zeros(Size
size,int
type)而size又为Size(cols,
rows),其第一个参数为cols,即图像的宽度。
即Mat大小先是高度然后是宽度,而size大小显示宽度然后是高度。
11.
SizewholeSize;
Pointroiofs;
img.locateROI(wholeSize,roiofs);
locateROI在此处是如果img图像是从其它父图像中某一部分得来的,那么其父图像的大小尺寸就为wholeSize了,img图像左上角那个点相对于父图像的左上角位置就为点roiofs了。
12.在opencv学习中,经常会读一些基于1.0版本的opencv代码,如果我们需要在2.0以后版本中使用已有的代码,遇到的问题最多的就是Mat和IplImage*之间的转换,现在举个例子来简单说明一下这2者之间的转换。
假设已经定义:
Matsrc;
IplImage*img;
并且也假设src或者img中已经有了数据。
则如果需要将src转换到img,应该使用下面的语句:
img=&
src.operatorIplImage();
如果是将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并不是指unsignedint,而是指的是unsignedshortint,因为在OpenCV框架中,int不是16位的,而是32位的。
没想到我使用OpenCV一年了,今天才弄清楚这个。
19.坐标体系中的零点坐标为图片的左上角,X轴为图像矩形的上面那条水平线;
Y轴为图像矩形左边的那条垂直线。
该坐标体系在诸如结构体Mat,Rect,Point中都是适用的。
(虽然网上有学着说OpenCV中有些数据结构的坐标原点是在图片的左下角,但是我暂时还没碰到过)。
20.在使用image.at<
TP>
(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安装简介)
环境:
XPSP3+32位系统+VS2010+opencv2.4.2
步骤1:
到这来选择下载opencv2.4.2.exe.
步骤2:
双击exe解压到自己想安装的目录,我这来是解压完后的目录为:
C:
\ProgramFiles\opencv2.4.2
步骤3:
配置环境变量,在系统环境变量和用户环境变量下均配置下面2个环境变量(没有测试过是否2个地方都需要配置)
变量名:
变量值:
PATH:
C:
\ProgramFiles\opencv2.4.2\build\x86\vc10\bin
TBB:
\ProgramFiles\opencv2.4.2\build\common\tbb\ia32\vc10
步骤4:
新建一个VS控制台项目,主函数代码改为如下:
//opencv2_4_2test.cpp:
opencv2/hig