Qt Creator中无法使用OpenCV2中新函数的解决办法


按上篇文章《Qt4.8下应用OpenCV2.4.4搭建环境详细步骤(Win7系统)》
 
在Qt Creator中配置了OpenCV2.4.X,但是只能使用opencv1.0的函数,opencv2中的函数,例如:imread(),Mat结构等都不能使用。
 
找原因:
 
(1)看头文件有没有问题
 
将include和lib目录的配置由qmake.conf文件中改到工程中的pro文件中,以便于修改。
 
这里说明一下,如果在qmake.conf文件中配置include和lib文件目录,则#include后面的opencv头文件会加下划线,说明IDE找不到这些头文件,而且写函数的时候没有自动补全。但是编译时没有错,因为构建的时候可以找到这些目录。如果在pro文件中配置include和lib文件目录,IDE就知道了这些目录,所以写函数的时候还有自动补全,更利于检查错误。
 
包含进opencv2的头文件
 
#include<opencv2/core/core.hpp>
 
#include<opencv2/highgui/highgui.hpp>
 
试了opencv2中的imread()函数,有自动补全提示,说明编译器已经找到了这些头文件。
 
但构建的时候会出现:
 
undefined reference to `cv::imread(std::string const&, int)' 等
 
说明编译器找不到lib库文件
 
(3)找lib库文件的问题
 
lib文件的包含如下:
 
LIBS += C:\opencv\build\x86\vc10\lib\opencv_core243d.lib\
 
      C:\opencv\build\x86\vc10\lib\opencv_highgui243d.lib\
 
      C:\opencv\build\x86\vc10\lib\opencv_imgproc243d.lib\
 
按说没有问题,网上也都是这样配的,但是我这里就一直有问题。
 
情况是这样的:
 
①不加这些lib文件,当然opencv1和opencv2的函数都不能用,都说undefined reference
 
②加上这些lib文件,opencv1中的函数能用,opencv2中新添加函数和结构不能用,例如:Mat结构,imread函数,VideoCapture结构等
 
这说明,opencv2新添加的函数和结构不在这些lib文件中。
 
后来,又新添加了几个lib文件:
 
C:\opencv\build\x86\mingw\lib\libopencv_core243.dll.a\
 
C:\opencv\build\x86\mingw\lib\libopencv_highgui243.dll.a\
 
C:\opencv\build\x86\mingw\lib\libopencv_imgproc243.dll.a
 
这次编译没问题了,说明这些lib文件里有opencv2新添加的东西。
 
(4)dll的问题
 
这时虽然编译没问题了,但运行的时候还是有问题(此时已经将对应的dll文件拷贝到system32文件夹下了),说程序异常终止,知道可能是缺dll文件。
 
进debug目录直接运行exe文件,按照提示缺少哪些文件去网上找,前两个都找到了,第三个是” libstdc++-6.dll”,找了好几个都说dll文件有错误。把MinGW目录下的这个dll文件复制过去也说是同样的错误。于是搜索错误信息,于是找到opencv中文网的下面一片文章,和我的错误一模一样:

====================================================

新手求助,_ZNSt9exceptionD2Ev错误


我是OpenCV的新手···我用OpenCV2.4最新版本结合CodeBlock配置的环境。并使用Opencv带的样例测试。编译通过了,但是一运行就会报错无法定位程序输入点_ZNSt9exceptionD2Ev于动态链接库libstdc++-6.dll我不明白这是什么错误,请高手帮助····谢谢了

Re:新手求助,_ZNSt9exceptionD2Ev错误
我不清楚你用什么编译器来编译你自己写的opencv程序,以我的经验,你需要用一个4.6.x版本的mingw来链接官方的opencv2.4的库。因为官方opencv2.4的库是用mingw4.6.x版本编译的。


谢谢现在我试试等下给你回复呵呵


我换了最新的版本MinGW,结果显示还是无法定位程序输入点_ZdlPv 于动态链接库libstdc++-6.dll

我前面都和你说了,不能用最新版的MinGW,只能用4.6.x版本的MinGW

http://sourceforge.net/projects/mingwbuilds/files/host-windows/releases/4.6.3/32-bit/threads-win32/dwarf/x32-4.6.3-release-win32-dwarf-rev0.7z/download
用这个版本肯定可以。

===========================================

看了大神的恢复,知道了是MinGW的版本问题,又下载了一个MinGW,把libstdc++-6.dll文件拷过去,果然OK了。现在可以用OpenCV2中的函数了。

 

总结一下:

(1)下载的OpenCV2.4.X版本,已经编译好的lib文件中,只有C:\opencv\build\x86\mingw\lib

这个目录下的lib文件有opencv2的新函数,而C:\opencv\build\x86\vc10\lib这个目录下的lib文件中没有opencv2的新函数,所以一开始包含这个目录下的lib文件会找不到新函数的实现。

(2)另一种使用opencv2的方法就是用cmake自己编译生成dll和lib文件,这样里面就有了新的函数。不过比较麻烦。

相关内容