前些天编译了最新版本opencv4,但是电脑内还有个opencv3.2,有时候二者共享链接库文件即libopencv*.so.XX,之类的路径没有配好的话,即使是使用简单的imread()函数,在QT中也会出现错误:
mainwindow.cpp:33: error: undefined reference to `cv::imread(cv::String const&, int)'
mainwindow.cpp:36: error: ‘CV_BGR2RGB’ was not declared in this scope
cvtColor(src,src,CV_BGR2RGB);
^~~~~~~~~~
另外在opencv4中cvtColor()函数第三个参数有点变化:
COLOR_RGB2GRAY取代了CV_RGB2GRAY,以此类推其他色彩空间。
磨刀不误砍柴工。所以有必要再把Ubuntu 电脑内的opencv环境变量配置再弄清楚。
首先检查main.cpp查看头文件是否有问题,一般情况下出现上面两种错误,说明Qt中opencv的环境变量位置不正确。
即通过修改.pro文件:
.pro文件末行添加如下路径:
INCLUDEPATH += /usr/local/include \
/usr/local/include/opencv4 \
/usr/local/include/opencv4/opencv2
LIBS += /usr/local/lib/libopencv*
稍微说明一下上面的路径:
INCLUDEPATH 为自己为Ubuntu电脑所编译的opencv的头文件目录(也可称为include目录)
LIBS 为Ubuntu电脑内opencv的共享链接库(.so.4.1即版本号),在windows中被称为动态链接库(即.dll文件也是带有版本号的)。
Ubuntu中opencv的共享链接库为(我编译的是4.1版本因此为):
libopencv_xphoto.so.4.1
libopencv_xfeatures2d.so.4.1等等(许多图像处理可用到的库我就不一一列举)
因此可以在QT中LIBS += /usr/local/lib/libopencv* 设置*通配符即可,而不用一一都给写上(PS:如果不嫌麻烦也可都写上,效果一样)
ubutnu终端中输入:
ldconfig -p |grep opencv
默认情况下编译opencv4等其他版本如果没有修改CMAKE_PREFIX_PATH中的路径。则都会存在/usr/local/lib目录下。
于是lib库目录就为:LIBS += /usr/local/lib/libopencv*
usr即(Unix system resources)下。(/usr/lib下也有一个opencv3.2版本,这个貌似是之前用的其他的一些程序安装的。)
注意:如果结果没有自己想要的opencv版本,此时需要查看一下系统环境变量中共享链接库搜索位置了!!!
终端执行:
cd /etc/ld.so.conf.d/
ls
sudo vi opencv.conf
将/usr/local/lib ,/usr/lib编辑写入。ESC 后wq保存退出即可。
/usr/lib/x86_64-linux-gnu/(这条可以不加,因为我的低版本opencv的lib在这里)
在比较新的opencv版本中一般只包括一个头文件#include
因此,如何给QT配置正确的头文件路径呢?
Ubuntu终端依次打开::
sudo vi /etc/ld.so.conf
编辑后保存。
将自己编译的opencv4头文件路径添加进去。
include /usr/local/include
include /usr/local/include/opencv4
include /usr/local/include/opencv4/opencv2
更新并保存配置:
sudo ldconfig
注意:如果找不到/usr/local路径,就要去看一下路径在不在环境变量内:没有的话添加如下图内容即可。
sudo vi /etc/bash.bashrc
以上两个步骤即完成了Opencv4配置工作。下面回到QT中实践。
1.打开QT Creator,新建一个项目名为test,选择Qt Consle Applacation后面一直确定默认就行了,注意一下项目路径。
2.test.pro文件:添加下面内容:
INCLUDEPATH+=/usr/local/include \
/usr/local/include/opencv4 \
/usr/local/include/opencv4/opencv2
LIBS += /usr/local/lib/libopencv*
3.源程序main.cpp中实现一个打开图片功能:(这里路径注意双斜杠,我的单斜杠总是报错。。)
#include
#include
using namespace cv;
int main(int argc, char *argv[])
{
Mat src;
src=imread("//home//ziyuan//Documents//Tracking//2B_1.jpg");
namedWindow("src",0);
imshow("src",src);
waitKey(0);
return 0;
}
结果会打开一个控制台程序窗口和一个图片显示窗口:
完毕,可以开始其他内容。