当前位置 : 首页 » 文章分类 :  开发  »  Qt Creator中无法使用OpenCV2中新函数的解决办法

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文件中,以便于修改。我这里的头文件目录是:

INCLUDEPATH +=  C:\OpenCV2.4.4\opencv\build\include\
                C:\OpenCV2.4.4\opencv\build\include\opencv\
                C:\OpenCV2.4.4\opencv\build\include\opencv2

这里说明一下,如果在qmake.conf文件中配置include和lib文件目录,则#include后面的OpenCV头文件会加下划线,说明IDE找不到这些头文件,而且写函数的时候没有自动补全。但是编译时没有错,因为构建的时候可以找到这些目录。如果在pro文件中配置include和lib文件目录,IDE就知道了这些目录,所以写函数的时候还有自动补全,更利于检查错误。
包含进opencv2的头文件

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>

试了opencv2中的imread()函数,有自动补全提示,说明编译器已经找到了这些头文件。
注:如果没有函数的自动补全提示,先检查下是否声明了opencv中的cv命名空间,opencv2中的这些函数和变量都在cv命名空间中,如下:

//OpenCV命名空间
using namespace cv;

但构建的时候会出现:
undefined reference to 'cv::imread(std::string const&, int)'
说明编译器找不到lib库文件

(2)找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新添加的东西。

(3)dll的问题
这时虽然编译没问题了,但运行的时候还是有问题(此时已经将对应的dll文件拷贝到system32文件夹下了),说程序异常终止,知道可能是缺dll文件。
进debug目录直接运行exe文件,按照提示缺少哪些文件去网上找,前两个都找到了,第三个是libstdc++-6.dll,找了好几个都说dll文件本身有错误。把MinGW目录下的这个dll文件复制过去也说是同样的错误。于是搜索错误信息,于是找到opencv中文网的下面一片文章,和我的错误一模一样:
http://www.opencv.org.cn/forum/viewtopic.php?t=23817

新手求助,_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文件,这样里面就有了新的函数。不过比较麻烦。

上一篇 OpenCV中Mat结构和Qt中QImage结构RGB排列顺序不同

下一篇 qobject_cast用法

阅读
1,249
阅读预计5分钟
创建日期 2013-04-01
修改日期 2017-07-12
类别
标签
百度推荐