总结系列_2(vc,opencv,Qt等错误调试,续...)
本文将总结一些在使用opencv+vs过程中碰到的error。
1.程序编译通过,运行时出现如下错误:
解决方法:
a.可能是读取文件时出现错误,比如说读图片,视频等文件名字或路径弄错了。
2. 编译程序通过,运行时出现如下错误:
解决方法:
a.可能是数据类型不对,比如说在该语句中gray_diff.at<unsigned char>(i,j)=255;
本来gray_diff中的数据类型是unsigned char的,如果你写成了gray_diff.at< int>(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源文件必须去实现该槽函数,否则会出现类似undefined reference to MainWindow::on_pushButton_clicked()的错 误,该错误是由于在UI中删除了某些不用的按钮造成的。
11.如果用Qt的控制台建立程序,运行程序时出现下面的错误提示:
这是因为控制台程序不能使用Qt的界面(本程序中使用了QMessageBox),因此需要在工程pro的代码中把QT – gui给去掉,否则会报类似的这种错误。
12.如果是在OpenCV中出现如下错误:
则表示是imshow函数需要还来不及显示完成就被其它的函数给中断了,这可能在回调函数中出现这种情况。