VS2022安装并配置opencv-4.7.0和扩展库contrib
VS2022安装并编译配置opencv-4.7.0和扩展库contrib
一、安装VS2022
VS2022专业版下载器下载:(链接直接下载)
百度网盘:
链接: https://pan.baidu.com/s/1XeV2wu1m-YNZea9xaW-zRA 提取码: pqk2
下好vs2022的在线安装的一个工具Visual Studio Installer ,然后勾选C++桌面开发,通用windows平台开发。
安装路径选自定义一个文件夹,安装在软件盘下比较好管理软件,记得要新建两个文件夹,一个放VS2022软件文件,
一个放缓存文件,后面选择下载完后在一起安装软件。

安装完成之后界面如下,我们点击创建新项目,然后选择空项目或控制台项目,区别就在于控制台项目会给你写好一个helloworld,还有一些教程注释,这里就不多赘述我们选择空项目。



二、安装CMake
可以自己去官网上下载exe文件安装使用
这里直接上文件版一键运行的CMake链接:
链接: https://pan.baidu.com/s/14cQKP7hPPNV5XdyNlf-Eaw 提取码: 9dub
下载好文件后直接在bin文件里点exe文件可以直接使用了。

三、opencv4.7.0下载\CMake编译opencv源码和扩展库
用了CMake编译的方式就不要用opencv.exe的安装方式了
opencv4.7.0、opencv_contrib-4.12.0、cmake编译源码缺失文件(需要FQ下载)链接:
链接: https://pan.baidu.com/s/1rqkLFtmq9rx5LWwpsDrhUQ 提取码: a553
然后cmake里上面的选opencv-4.7.0的路径,下面的选你刚刚创建的文件夹我这里是opencv-windows:

之后会出现这个框,按照图片上的选就行,如果你是VS别的版本你就选你自己的,第二个是你不选就默认x64就是64位,如果说你选VS2022的时候下面两个框卡住重叠了,下面的按钮,你随便选一个其他的再选回来,他就出来了。

然后就finish,等他自己跑完(时间快慢依据电脑性能而异,较大的影响是运行内存):
跑完之后就是一片红:

这很正常不要怕,之后还有几个选项要勾选,

有一个Search框,里面按照图片打字母就行 ,这个就是使能不免费的opencv,嵌入式的兄弟们应该经常见到ENABLE,这里就是把一些专利的不免费的算法启用,我们不用来商用,人家不会告我们的,放心好了。

这个就是刚刚扩展包的路径,我们不是把他放进opencv-4.7.0里面了吗,就把路径选好,这里注意:一定要一直选到modules 这个文件夹!!!!!

这个解释一下,world就是全世界的意思,勾选这个,编译出来的库都会被集成为一个库,你不选的话就会生成很多独立的库,看你自己的喜好,我比较喜欢分开,这样项目移植比较好高,而且运行效率会更快,没有其他的冗余。 这几个弄好之后就多来几遍configure,直到界面变白:

这个时候关键的来了,这里如果你选择generate完全是ok的,之后的操作去看别的博客都是能配好,都能用,但是有些模块如果你用上了会直接报错,因为有些东西他并没有下载,我们把下面的框给向上拖:

会有这样一段警告,这是告诉我们有些数据下载失败,详情可以去看CMakeDownloadLog.txt,学过cmake的兄弟应该就很懂,没学过的也不要紧张,说白点就是打开那个你自己一开始新建的那个文件夹,我这里就是opencv-weindows文件夹,把那里面的那个这个txt文件打开:

打开一看,全是密密麻麻的字符,大家不要被吓到了,无从下手,好多博客讲这个的时候看的都有点费劲,这里我教大家咋看,你只要去找出现这个#try 1这个就行,每次都找这个,然后它上面对应的就是:

这句话的意思就是你从这个https这个下载链接下载这个文件,然后改成这个对应文件夹下的这个文件的名字覆盖掉,比如说这个 压缩包,我们把这个http这个复制一下,然后用迅雷下载,(挂个**)

下好之后,这样:

我这里已经把它放在这个路径下了,可以很清楚看到一个是0kb,就是下载失败的,然后我们把下载好的这个名字改成那个0kb的压缩包,然后替换掉就可以了。这里注意一个点,如果有习惯跟我一样的,喜欢把文件的扩展名显示出来的,比如说main.cpp,不显示就是main 类型是cpp文件,显示就是名称就叫main.cpp,一定要注意文件的后缀名字,比如:

这有一个也是要手动替换的,我们发现迅雷也下载不了,这个时候就需要挂**了,把那个http的链接在 浏览器打开,

可以看到打开之后是一些cmake的语法,这里我们就需要另存为,然后保存:
有小伙伴看到这个红圈圈的了,这里是一个要注意的点,CMakeDownloadLog.txt里面要的是.cmake后缀的文件,即是cmake类型文件,而这里系统默认是txt文件了,所以把文件扩展名打开显示的道友,一定要注意文件后缀,没打开的道友也要自己观察哦,细节决定一切,说不定看完我的文章你变的更细节了,你女神就因为你注重细节和你在一起了,hhh 。
当然,有些小伙伴看到这说,哎呀,我没有**啊,咋办呀。没关系,我已经下载了好了一份,到时候会跟已经编译好的库都给放一起的,有**想动手和没**想动手的小伙伴都可以尝试这个流程,当然有不想动手的,文章末尾的链接直接下载好使用就好了,但我还是希望大家动动手,因为我这绝对是到现在为止最详细的教程,之后我也会在B站录制视频演示流程。
接着往下,等我们把文件都替换好了之后,点击configure,完成之后,看看还有没有提示你要阅读这个CMakeDownload.txt查看细节,有的话继续重复步骤下就好了。(每个opencv版本的文件都不一样,不是通用的,如果看到我这篇博客的道友们用的是4.8.0或者更老的版本,就只能自己手动下了,但是流程是一样的,这是我配置了不下10次总结出来的,跨平台的opencv我也配置好多次了,因为vscode的代码看起来更舒服,而且MSVC跨平台没有g++好)。

当txt文件configure完成之后成这个样子了,就算真正意义上的configure成功了,建议多configure几次,可能一次之后还是会有提示一些其他的,你就接着configure就完事了,没提示你要下载就说明文件齐全了,另外两个警告不用管,一个是跟python相关的,我们不用python,还有一个是CMP0148,这个是cmake新版本之后出的警告,感兴趣的可以去cmake官网或者GitHub上的cmake仓库看文档。
当上面的过程确定成功了,就可以开始generate了,generate done之后

四、VS2022编译完整版opencv
点图上这个圈圈,然后vs2022就会打开:

按照图上点生成,注意上面那个Debug,如果你选Debug就是调试模式,release就是发布模式,所以这里你需要生成两边,注意要选x64。
两种模式都生成成功之后,可以看到刚刚install文件下生成了许多lib文件:

路径的话就是 opencv-windows\install\x64\vc17\lib,我的是这样,你的对应你的就好了,可以看到很多lib文件,具体lib文件和dll文件的区别建议去网上看看,也挺重要的。如果,在configure的时候你选择了opencv_world, 那么你的lib库应该就只有opencv_world470,opencv_world470d,opencv_img_hash470,opencv_img_hash470d这四个ilb文件。
五、VS2022中配置opencv环境
详细配置方式参考链接:VS2015——opencv3.4.2扩展库安装 - 量子与太极 - 博客园
六、测试代码
#include<iostream> #include<string> #include<opencv2/opencv.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> #include<opencv2/features2d/features2d.hpp> using namespace std; using namespace cv; //计算原始图像点位在经过矩阵变换后在目标图像上对应位置 Point2f getTransformPoint(const Point2f originalPoint, const Mat& transformMaxtri); int main(int argc, char* argv[]) { Mat image01 = imread("Resources/Parking1.png"); Mat image02 = imread("Resources/Parking2.png"); imshow("拼接图像1", image01); imshow("拼接图像2", image02); //灰度图转换 Mat image1, image2; cvtColor(image01, image1, COLOR_BGR2GRAY); cvtColor(image02, image2, COLOR_BGR2GRAY); //提取特征点 Ptr<SIFT>siftDetector = SIFT::create(800); // 海塞矩阵阈值 vector<KeyPoint> keyPoint1, keyPoint2; Mat imageDesc1, imageDesc2; siftDetector->detectAndCompute(image1, Mat(), keyPoint1, imageDesc1, false); siftDetector->detectAndCompute(image2, Mat(), keyPoint2, imageDesc2, false); //获得匹配特征点,并提取最优配对 FlannBasedMatcher matcher; vector<DMatch> matchePoints; matcher.match(imageDesc1, imageDesc2, matchePoints, Mat()); sort(matchePoints.begin(), matchePoints.end()); //特征点排序 //获取排在前N个的最优匹配特征点 vector<Point2f> imagePoints1, imagePoints2; for (int i = 0; i < 10; i++) { imagePoints1.push_back(keyPoint1[matchePoints[i].queryIdx].pt); imagePoints2.push_back(keyPoint2[matchePoints[i].trainIdx].pt); } //获取图像1到图像2的投影映射矩阵,尺寸为3*3 Mat homo = findHomography(imagePoints1, imagePoints2, RANSAC); Mat adjustMat = (Mat_<double>(3, 3) << 1.0, 0, image01.cols, 0, 1.0, 0, 0, 0, 1.0); Mat adjustHomo = adjustMat * homo; //获取最强配对点在原始图像和矩阵变换后图像上的对应位置,用于图像拼接点的定位 Point2f originalLinkPoint, targetLinkPoint, basedImagePoint; originalLinkPoint = keyPoint1[matchePoints[0].queryIdx].pt; targetLinkPoint = getTransformPoint(originalLinkPoint, adjustHomo); basedImagePoint = keyPoint2[matchePoints[0].trainIdx].pt; //图像配准 Mat imageTransform1; warpPerspective(image01, imageTransform1, adjustMat * homo, Size(image02.cols + image01.cols + 10, image02.rows)); //在最强匹配点的位置处衔接,最强匹配点左侧是图1,右侧是图2,这样直接替换图像衔接不好,光线有突变 Mat ROIMat = image02(Rect(Point(basedImagePoint.x, 0), Point(image02.cols, image02.rows))); ROIMat.copyTo(Mat(imageTransform1, Rect(targetLinkPoint.x, 0, image02.cols - basedImagePoint.x + 1, image02.rows))); namedWindow("拼接结果", 0); imshow("拼接结果", imageTransform1); waitKey(); return 0; } //计算原始图像点位在经过矩阵变换后在目标图像上对应位置 Point2f getTransformPoint(const Point2f originalPoint, const Mat& transformMaxtri) { Mat originelP, targetP; originelP = (Mat_<double>(3, 1) << originalPoint.x, originalPoint.y, 1.0); targetP = transformMaxtri * originelP; float x = targetP.at<double>(0, 0) / targetP.at<double>(2, 0); float y = targetP.at<double>(1, 0) / targetP.at<double>(2, 0); return Point2f(x, y); }






本文部分内容引用于博文链接:https://blog.csdn.net/qq_54842070/article/details/132507605

浙公网安备 33010602011771号