CMake编译:
Configure
编译问题1:
解决方法:OPENCV_GENERATE_SETUPVARS ,取消勾选
方法:通过以下Url,下载ippicv_2020_win_intel64_20191018_general.zip文件
opencv_3rdparty/ippicv at ippicv/master_20191018 · opencv/opencv_3rdparty · GitHub
完成之后,添加该文件到E:\software\opencv_4.7.0\sources\3rdparty\ippicv文件夹中
打开ippicv.cmake,将以下语句注释,可通过 #[[ 注释内容]] 注释掉
再次Configure,不再报错
若还报错,将.zip文件名称修改为 报错的文件名(879741a7946b814455eee6c6ffde2984-ippicv_2020_win_intel64_20191018_general.zip)
再次Configure,done...
继续...
查找OPENCV_EXTRA_MODULES_PATH,将值设置为opencv_contrib-4.7.0下modules路径即:E:\software\opencv_4.7.0\sources\opencv_contrib-4.7.0\modules
再次Configure
编译问题3:以下15个文件加载失败
解决方法:在目标文件夹下新建downloads文件夹
再新建两个文件夹,用于放置准备下载的文件
依次将15个的每个https://raw.githubusercontent.com/opencv/opencv_3rdparty/fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d/vgg_generated_120.i添加到GitHub Proxy下载,完成之后,放置到上面所述的文件夹中
继续...
勾选BUILD_opencv_world,为了将所有的lib文件都集成到一个opencv_world450d.lib中方便配置
勾选OPENCV_ENABLE_NONFREE,为了使用具有专利保护的算法
取消勾选不需要的部分 test ,java,python,BUILD_DOCS,BUILD_PACKAGE,BUILD_EXAMPLES
再次Configure,Generating done
打开项目
E:\software\opencv_4.7.0\opencv_contrib\install\x64\vc16\bin
重启VS 2019编译器,新建项目
右键---属性 ,设置所有配置、所有平台,VC++中,包含目录、库目录设置如下:
链接器,输入,附加依赖项 添加 opencv_world470d.lib,opencv_world470.lib
代码测试参考:SIFT
#include
#include
using namespace std;
using namespace cv;
int main()
{
Mat imageL = imread("20230523_1.jpg");
Mat imageR = imread("20230523_2.jpg");
/*imshow("1", imageL); imshow("2", imageR); waitKey(); return 0;*/
//提取特征点方法
//SIFT
Ptr sift = SIFT::create();
//ORB
//Ptr orb = ORB::create();
//SURF
//Ptr surf = xfeatures2d::SURF::create();
//特征点
std::vector keyPointL, keyPointR;
//单独提取特征点
sift->detect(imageL, keyPointL);
sift->detect(imageR, keyPointR);
//画特征点
Mat keyPointImageL;
Mat keyPointImageR;
drawKeypoints(imageL, keyPointL, keyPointImageL, Scalar::all(-1),
DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
drawKeypoints(imageR, keyPointR, keyPointImageR, Scalar::all(-1),
DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
//显示窗口
namedWindow("KeyPoints of imageL",WINDOW_FREERATIO);
namedWindow("KeyPoints of imageR",WINDOW_FREERATIO);
//显示特征点
imshow("KeyPoints of imageL", keyPointImageL);
imshow("KeyPoints of imageR", keyPointImageR);
//特征点匹配
Mat despL, despR;
//提取特征点并计算特征描述子
sift->detectAndCompute(imageL, Mat(), keyPointL, despL);
sift->detectAndCompute(imageR, Mat(), keyPointR, despR);
//Struct for DMatch: query descriptor index, train descriptor index, train image index
and distance between descriptors.
//int queryIdx –>是测试图像的特征点描述符( descriptor )的下标,同时也是描述符对应特征点
(keypoint)的下标。
//int trainIdx –> 是样本图像的特征点描述符的下标,同样也是相应的特征点的下标。
//int imgIdx –>当样本是多张图像的话有用。
//float distance –>代表这一对匹配的特征点描述符(本质是向量)的欧氏距离,数值越小也就说明两
个特征点越相像。
vector matches;
//如果采用 flannBased 方法 那么 desp通过orb的到的类型不同需要先转换类型
if (despL.type() != CV_32F || despR.type() != CV_32F)
{
despL.convertTo(despL, CV_32F);
despR.convertTo(despR, CV_32F);
}
Ptr matcher = DescriptorMatcher::create("FlannBased");
matcher->match(despL, despR, matches);
//计算特征点距离的最大值
double maxDist = 0;
for (int i = 0; i < despL.rows; i++)
{
double dist = matches[i].distance;
if (dist > maxDist)
maxDist = dist;
}
//挑选好的匹配点
vector< DMatch > good_matches;
for (int i = 0; i < despL.rows; i++)
{
if (matches[i].distance < 0.5 * maxDist)
{
good_matches.push_back(matches[i]);
}
}
Mat imageOutput;
drawMatches(imageL, keyPointL, imageR, keyPointR, good_matches, imageOutput);
namedWindow("picture of matching",WINDOW_FREERATIO);
imshow("picture of matching", imageOutput);
waitKey(0);
return 0;
}
测试结果: