OpenCV总结Word下载.docx

上传人:b****5 文档编号:20975481 上传时间:2023-01-26 格式:DOCX 页数:15 大小:207.01KB
下载 相关 举报
OpenCV总结Word下载.docx_第1页
第1页 / 共15页
OpenCV总结Word下载.docx_第2页
第2页 / 共15页
OpenCV总结Word下载.docx_第3页
第3页 / 共15页
OpenCV总结Word下载.docx_第4页
第4页 / 共15页
OpenCV总结Word下载.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

OpenCV总结Word下载.docx

《OpenCV总结Word下载.docx》由会员分享,可在线阅读,更多相关《OpenCV总结Word下载.docx(15页珍藏版)》请在冰豆网上搜索。

OpenCV总结Word下载.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机硬件及网络

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1