windows下opencv配置
最近有个大作业,有需求要在QT下使用opencv
原本想着先将opencv编译完成,然后在vscode上验证,最后直接在QT内配置即可
结果是不同的编译器编译出来的opencv是不一样的
比如要在QT下使用opencv,就要用QT的编译代码的编译器去编译opencv
所以才有了下述的vscode和QT配置两个环节。
VScode
编译
下载opencv源码,选择sources下载
地址:https://opencv.org/releases
安装CMake,选择installer下载
地址:https://cmake.org/download/
打开CMake-gui,选择源码路径,新建build为编译路径,配置用MinGW编译
第一次会出现红色警告信息,再按一次Configure就好了,没问题就可以Generate生成Makefile
然后在编译路径打开命令行,开始编译
mingw32-make
我在编译过程中报错:gcc: error: long: No such file or directory
解决:CMake配置中取消OPENCV_ENABLE_ALLOCATOR_STATS勾选
编译完成后就可以安装
mingw32-make install
安装成功后会出现一个install文件夹,这个install文件夹内就包含后续所需的文件
把install下的x64/mingw/bin路径加入环境变量,重开机
测试
测试代码:
#include "opencv2/opencv.hpp"
#include "iostream"
int main(void)
{
cv::Mat img = cv::imread("图片的绝对路径");
if (img.empty())
{
std::cout << "error!" << std::endl;
return -1;
}
cv::imshow("", img);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}
假设上述编译安装install的路径为path,则我们可以通过以下命令编译
g++ -g main.cpp -o main.exe -I path/install/include -L path/install/x64/mingw/lib -l opencv_core430 -l opencv_imgcodecs430 -l opencv_highgui430
-I
指定头文件目录,-L
指定库目录,-l
为链接库(最后三位数字表示版本,我的版本为4.30)
我通过命令行可以正常编译生成main.exe,但是运行就会有无法定位程序输入点等问题
然后我尝试将上述命令配置进vscode,也很容易,主要就是配置tasks.json
发现要指定当前工作目录为mingw64的路径,程序才能正常运行
即"cwd": "F:/mingw-w64/mingw64/bin"
而这样子设置随之带来的就是代码里的路径都要设置为绝对路径(比如图片路径)
而且用c++的_getcwd()函数,获得的也是上述路径
还好只是用于验证环境,要是这样子拿来开发估计会崩溃
QT
以下编译过程最终没有使用,出现了QT和Opencv版本不均的问题
编译
要在QT内使用opencv,就要用QT编译的编译器编译opencv,有点拗口hh
QT使用的编译器在QT的安装目录下可以看见
例如我的是F:\QT5.9.0\Tools\mingw530_32\bin
需要将这个路径添加到环境变量中,然后在cmake中选择这个编译器编译
编译过程出现下列两个问题:
出错:member CMakeFiles\opencv_core.dir/objects.a(vs_version.rc.obj) in archive is not an object
解决方法:添加OPENCV_VS_VERSIONINFO_SKIP
出错:undefined reference to `_imp__opj_image_destroy@4’
解决方法:去除勾选WITH_OPENJPEG
编译完同样install,然后把install下的x64/mingw/bin文件夹加入环境变量,重开机
测试
测试代码:
#include "mainwindow.h"
#include <QApplication>
#include <opencv2/opencv.hpp>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// MainWindow w;
cv::Mat image = cv::imread("图片的绝对路径");
if (image.empty())
{
std::cout << "error" << "\n";
return -1;
}
cv::imshow("show", image);
cv::waitKey();
// w.show();
return a.exec();
}
同样假设编译安装install的路径为path,需要再在QT的.pro文件中加入
INCLUDEPATH += path/install/include/
LIBS += path/install/x86/mingw/lib/libopencv_*.a
测试的时候发现图片没法正常显示,一直显示灰色的,鼠标放上去就在转圈圈
怀疑可能是版本不兼容的问题(Opencv版本太高而QT版本太低)
为了快速验证想法(其实也是懒得再编译一次),直接下载用同样QT编译器编译生成的文件
下载链接:https://github.com/huihut/OpenCV-MinGW-Build
我的QT的编译器是mingw530_32
,可以找到对应的文件
发现对应的opencv版本是3.4.5,一定程度上验证了版本差别太大的想法
下载完成后,同样把bin加入环境变量(顺便把刚刚编译后不能使用的环境变量删掉),重开机
然后同样在QT的.pro加入对应路径的include和lib
正常运行√
而且没有存在上述vscode中的路径错误的问题