最近在vs2019中使用openCV进行图像处理,需要用QT设计交互界面,软件的组合使用与运行环境的配置搞了两天,目前已经配置成功,此文章记录这次的操作历程,以便以后出现问题时,可以审视目前的安装过程以得到解决方法。
目录
一、opencv拓展库的下载以及编译。
1.1、安装cmake
1.2、下载opencv和拓展库
1.3、cmake编译
1.4、vs打开INSTALL.vcxproj的工程文件
1.4.1 方法一:
1.4.2 方法二
二、环境配置
三、qt配置opencv;
3.1、配置
3.1.1 方法1: 手动输入
3.1.2、方法2:用包含外部库的形式:
3.2、代码测试
3.2.1在release下测试
3.2.2在debug下测试
四、vs2019配置opencv
4.1、vs2019 配置属性表
4.2、vs配置opencv拓展库测试
五、在vs里出现不能识别python38_d.lib
电脑先安装VS2019,qt5.15.2,Cmake3.22(注意勾选添加环境变量选项),
Cmake3.22官方下载下图中的第一个,这个安装过程简单,
去opencv官网下载,点击library后出现releases,找到自己想要的版本后,点击windows下载,双击后设置解压路径;
再去下图中网站下载opencv的拓展库,点击右下角橘色的“克隆/下载”
再将两个解压后的文件放在同一个文件夹下,本文在台式机上放置在D:\opencv4.5.3\opencv文件夹里面,同时新建一个文件夹命名为opencv_newbuild,如下图蓝色栏所示,这里面准备放Cmake编译后的文件
打开Cmake软件,先设置如下图两个文件夹路径,设置成下图中间的形式,第一栏设置为opencv源码的文件夹,第三栏为刚新建的opencv_newbuild。
第一次点击configure后,因为本地已经安装vs2019,可以设置成下图,采用MSVC2019编译。
再点击finish。之后会出现一大片红色,先不用管。
在search里面搜索 OPENCV_EXTRA_MODULES_PATH,添加opencv_contrib库的modules路径
搜索nonfree,这是Opencv的一个专利库,要使用就在后面打勾,同时搜索world,打勾,只生成一个综合整理后的lib文件。再点一次configure,
可以多点几次 configure,直到没出现红的,可以去下图路径找到灰色框文件
打开它,里面没有什么链接之类的说明,如下图,则成功。
对于出现红色的解决方法网上也有大量的解决方法,需要手动解决,可以参考其他的解决方案,目前本人这种流程操作完成后没有遇到什么问题。
再点generate,完成后,generate右边的open project不再是灰色,在下图路径可以找到一个INSTALL.vcxproj的工程文件,
在debug和64位下,生成解决方案,漫长的等待后 。
会出现不能打开python38_d.lib的情况,不用管这个问题(也可以在配置时取消含python的选项)。继续下一步
再点install ——>仅用于项目——> 仅生成install(B),等会就成功。
同样的操作在release下再进行一次。
(在笔记本电脑重新编译时用的这个方法):在用vs打开后,点《批生成》,如下图
接着选择
右键点击我的电脑——属性——高级系统设置——环境变量后,在系统变量里找到Path,点击编辑,编辑 下图所示的路径。
配置好的QT在 .pro 文件中手动输入opencv带拓展库重新编译的头文件路径和库文件
INCLUDEPATH +=D:\opencv4.5.3\opencv\opencv_newbuild\install\include
LIBS +=D:\opencv4.5.3\opencv\opencv_newbuild\install\x64\vc16\bin\libopencv_*.dll
方法1和2为dedug下的路径设置形式,见下图左下角
网上找一个代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//setWindowTitle("QT + OpenCV4");
Mat src = imread("C:\\Users\\Desktop\\p1.jpg"); //不能有中文路径,不然出错
Mat img;
//cvtColor(src, img, COLOR_BGR2RGB);
namedWindow("name",WINDOW_NORMAL);
imshow("name",src);
//ui->label->setPixmap(QPixmap::fromImage(QImage(img.data, img.cols, img.rows, img.step, QImage::Format_RGB888)));
}
MainWindow::~MainWindow()
{
delete ui;
}
注意不能出现中文路径和文件名,不然会出现下面的错误。
注意:下面为在笔记本上重新编译配置的图。不过与上述路径基本一致。
台式机的路径为
D:\opencv4.5.3\opencv\opencv_newbuild
笔记本的路径为
D:\opencv4.5.3\opencvNewBuild 相比台式机的少建立一个文件夹opencv,这个文件夹多余,没什么用。下图为在台式机的路径。
新建debug和release属性表,在以后新建项目时就可以不用重新配置,直接复制debug和release的两个属性表到新建项目文件夹里面,添加现有的这两个属性表即可。在下图新建的两个属性表分别为NewOpenCvContrib_debug和NewOpenCvContrib_Release。
NewOpenCvContrib_debug编辑如下图,包含目录和库目录里面分别设置文件夹路径为:
//包含目录
D:\opencv4.5.3\opencvNewBuild\install\include
//库目录
D:\opencv4.5.3\opencvNewBuild\install\x64\vc16\lib
在链接器的附加依赖库项填入 opencv_world453d.lib
NewOpenCvContrib_Release的包含目录和库目录与NewOpenCvContrib_debug一样,只是链接器的附加依赖库项填入 opencv_world453.lib。
在debug和release时,往往找不到动态链接程序,需要在C盘的windows文件下的两个子文件夹system32或syswow64里面
同时复制这两个文件。
在网上找了 一段代码测试,在debug和release两种情况下都可以正确运行显示。
#include
#include
#include "opencv2/core.hpp"
#include "opencv2/features2d.hpp"
#include "opencv2/xfeatures2d.hpp"
#include "opencv2/highgui.hpp"
using namespace cv;
using namespace cv::xfeatures2d;
using namespace std;
int main()
{
Mat img = imread("读取自己的一个图片文件", IMREAD_GRAYSCALE);
if (img.empty())
{
printf("could not load image...\n");
return -1;
}
namedWindow("原图:", WINDOW_NORMAL);
imshow("原图:", img);
int minHessian = 400;
Ptr detector = SURF::create(minHessian);
vector keypoints;
detector->detect(img, keypoints);
Mat img_keypoints;
drawKeypoints(img, keypoints, img_keypoints, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
namedWindow("key points", WINDOW_NORMAL);
imshow("key points", img_keypoints);
waitKey(0);
return 0;
}
DEBUG下运行结果
release下运行结果
关于在vs里出现不能识别python38_d.lib的情况,是在台式机上出现的,在笔记本上没有出现。台式机没有安装python,但安装的是anaconda和pycharm,在出现不能识别问题后,就安装了python以及其debug的版本,也按照网上教程修改anaconda里面的文件,两个方法并没有解决问题。但笔记本没安装anaconda和pycharm,只安装的python,没有出现不能识别python38_d.lib的情况。可以试着总结下,在cmake编译opencv前,提前安装个python及其debug的版本后,应该不会出现不能识别python38_d.lib的情况。