https://me.youkuaiyun.com/qq_42299461
接着上篇博客说到的因为新版本opencv某些算法模块被迁移到了opencv_contrib。我们需要自己(¥*&…%—#操作一下。
https://blog.youkuaiyun.com/qq_42299461/article/details/103614034
1.安装Cmake
Cmake 官网 https://cmake.org/download/
下载好之后 解压 找到bin文件夹中cmake-gui点击运行
2.使用CMake生成OpenCV源代码工程的解决方案
第一步:首先运行cmake-gui
第二步:指定OpenCV的安装路径
如图,单击‘Browse Source'按钮,在弹出的对话框中指定OpenCV安装时源代码的存储路径。
第三步:指定解决方案的存储路径
单击对话框中的’Browse Build'按钮,在弹出的对话框中指定存放生成的opencv的解决方案的路径。
第四步:第一次Configure
路径都设置好后,点击图片的所示的【Configure】按钮,进行第一次配置过程。
然后会弹出如图所示的编译器选择的对话框。
先选定‘Use default native compilers',然后可以发现下拉列表中提供几十种编译器供选择。因为我们安装了Visual Studio,所以这里会默认选择对应版本的Visual Studio编译器,即之后会生成对应Visual Studio版本的sln解决方案。
确认无误后,单击'finish'按钮。于是CMake开始第一次源代码配置过程。如图所示。
CMake处理过程中可能会出现错误
先不用太在意
………………………………………………
看到进度条读到尽头,出现了Configuring done字样,第一次的源码配置就完成了,如下图
在变量区中找到OPENCV_EXTRA_MODULES_PATH,将其选择为opencv_contrib/modules目录
并勾选BUILD_opencv_world(看首字母往上找菜单)
因为我后来使用的代码用到的sfit算法,所以还需要找到 OPENCV_ENABLE_NONFREE 勾选上。
要不然后续在测试的时候总是报异常错误(The function/feature is not implemented)。
再点击configure。
第五步:第二次Configure
第一次配置完成后,还需要进行第二次配置,于是再次点击“Configurie"按钮
第六步:单击Generate,成功生成项目
出现"Generating done"字样,就表示大功告成了,可以去之前指定的路径(/mybuild)下寻找生成的解决方案了。
打开刚刚生成的“OpenCV.sln"解决方案,可以看到庞大的工程(一个包含了67个项目的解决方案)。
3.使用visual studio生成带有opencv_contrib接口的opencv库
第一步:在visual studio中打开OpenCV.sln
在上面工作完成的情况下,CMake Genarate成功,打开 \\你安装的opencv目录\opencv\mbuild目录下,找到OpenCV.sln,然后使用相应的visual studio打开加载该解决方案。
第二步:在visual studio中右侧:
在解决方案资源管理器中右击解决方案 "OpenCV",选择重新生成解决方案
在解决方案资源管理器中的CMakeTargets
目录中,右击INSTALL
,选择仅用于项目
下的仅生成INSTALL
到此为止,这个额外的OpenCV库就安装成功了,接下来我们需要重新配置一下环境,类似于之前配置Visual Studio2019h和OpenCV环境。
首先,为计算机添加系统环境变量。
然后打开Visual Studio 属性管理器中右击选择设置,VC++目录,包含目录,添加:如图:
附上测试代码:
#include <iostream>
#include <opencv2/opencv.hpp> //头文件
#include <opencv2/xfeatures2d.hpp>
using namespace cv; //包含cv命名空间
using namespace std;
int main()
{
Ptr<Feature2D> f2d = xfeatures2d::SIFT::create();
//读入图片
Mat img_1 = imread("test1.png");
Mat img_2 = imread("test2.png");
vector<KeyPoint> keypoints_1, keypoints_2;
f2d->detect(img_1, keypoints_1);
f2d->detect(img_2, keypoints_2);
Mat descriptors_1, descriptors_2;
f2d->compute(img_1, keypoints_1, descriptors_1);
f2d->compute(img_2, keypoints_2, descriptors_2);
BFMatcher matcher;
vector<DMatch> matches;
matcher.match(descriptors_1, descriptors_2, matches);
Mat img_matches;
drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_matches);
imshow("【match_img】", img_matches);
waitKey(0);
}