问题记录,在使用vs的时候,opencv环境配置成功后,遇到问题解决方案。
环境:window 10 + opencv2.4.13 + vs2022
注意:我是在电脑上已经存在opencv4.5.5的情况下,继续配置其他版本的opencv
环境配置过程:
配置的步骤如下:
- 1)opencv官网下载opencv2.4.13,并解压到指定目录。本文解压目录为D:\opencv2.4.13
- 2)配置电脑环境变量:电脑-->右键“属性”-->左侧导航栏“高级适配器配置”-->"高级“-->"环境变量”-->"系统变量“-->双击"Path"-->添加下列路径
D:\opencv2.4.13\opencv\build\x64\vc12\bin
- 3)VS2022中新建一个项目
- 4) 先将x86改为x64,再进行下一步
- 5) 右键-》项目名字-》属性(最后一行)
- 6)进入属性界面,选择“VC++ 目录"-->"包含目录"-->添加以下三个目录
- 7)在VC++目录下设置库目录
- 8)添加附加依赖项 连接器-》输入-》添加依赖项
- OpenCV2.4.13配置的lib库
- debug模式,添加以下库:
opencv_calib3d2413d.lib
opencv_contrib2413d.lib
opencv_core2413d.lib
opencv_features2d2413d.lib
opencv_flann2413d.lib
opencv_gpu2413d.lib
opencv_highgui2413d.lib
opencv_imgproc2413d.lib
opencv_legacy2413d.lib
opencv_ml2413d.lib
opencv_nonfree2413d.lib
opencv_objdetect2413d.lib
opencv_ocl2413d.lib
opencv_photo2413d.lib
opencv_stitching2413d.lib
opencv_superres2413d.lib
opencv_ts2413d.lib
opencv_video2413d.lib
opencv_videostab2413d.lib
- release模式,添加以下库:
opencv_calib3d2413.lib
opencv_contrib2413.lib
opencv_core2413.lib
opencv_features2d2413.lib
opencv_flann2413.lib
opencv_gpu2413.lib
opencv_highgui2413.lib
opencv_imgproc2413.lib
opencv_legacy2413.lib
opencv_ml2413.lib
opencv_nonfree2413.lib
opencv_objdetect2413.lib
opencv_ocl2413.lib
opencv_photo2413.lib
opencv_stitching2413.lib
opencv_superres2413.lib
opencv_ts2413.lib
opencv_video2413.lib
opencv_videostab2413.lib
- 9)先点应用-->确定,否则白费!!!
- 10)保存属性表,见下面链接:
VS配置属性表,保存Opencv配置信息_龙龙就是龙龙的博客-CSDN博客_opencv属性表
以上是opencv的配置过程。
问题1:
vs找不到msvcp120d .dll,无法继续执行代码。重新安装可能会解决此问题。
网上找了很多个解决方式,都没成功,终于在这边博主中博文中,解决了此问题:
压缩包 链接:https://pan.baidu.com/s/1VcYtdr2p87FInO61i-55yA
提取码:jtkw
环境:win10 vs2015 c++ opencv3.4.0
截图:
解决方式(不要怀疑下面写错了,是正确的):
第一步: 下载压缩包,并解压;
第二步: 32位的msvcp120d 和msvcr120d放到了C:\Windows\SysWOW64,
第三步: 64位的msvcp120d 和msvcr120d放到了C:\Windows\System32。
重新启动成功!
vs找不到msvcp120d .dll,无法继续执行代码。重新安装可能会解决此问题。_猫爪子挠的博客-CSDN博客
配置完环境之后,运行我需要的代码:
/************************************************************************
* Brief: FAST特征点提取以及FREAK描述子的图像匹配,基于OpenCV2.4.8
************************************************************************/
#include <opencv2/core/core.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/nonfree/features2d.hpp>
#include <opencv2/features2d.hpp>
#include <opencv2/legacy/legacy.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <iostream>
#include <vector>
using namespace std;
using namespace cv;
int main()
{
Mat img1_src = imread("C:/Users/820PC2/Desktop/img1.png", 0);
Mat img2_src = imread("C:/Users/820PC2/Desktop/img2.png", 0);
//FastFeatureDetector fast(40);
SurfFeatureDetector fast(2000, 4);
FREAK extractor;
vector<KeyPoint> keypoints1, keypoints2;
Mat descriptor1, descriptor2;
vector<DMatch> final_matches;
vector<DMatch> matches;
double t = (double)getTickCount();
fast.detect(img1_src, keypoints1);
fast.detect(img2_src, keypoints2);
//drawKeypoints(img1_src,keypoints1,img1_src,Scalar(0,255,0));
//drawKeypoints(img2_src,keypoints2,img2_src,Scalar(0,255,0));
extractor.compute(img1_src, keypoints1, descriptor1);
extractor.compute(img2_src, keypoints2, descriptor2);
BFMatcher matcher(NORM_HAMMING, true);//暴力匹配,并且进行crosscheck,就是说第二个参数选择true。
matcher.match(descriptor1, descriptor2, matches);
final_matches = matches;
cout << "number of total_matches : " << final_matches.size() << endl;
//接下来是RANSAC剔除误匹配
vector<Point2f> querymatches, trainmatches;
vector<KeyPoint> p1, p2;
for (int i = 0; i < final_matches.size(); i++)
{
p1.push_back(keypoints1[final_matches[i].queryIdx]);
p2.push_back(keypoints2[final_matches[i].trainIdx]);
}
for (int i = 0; i < p1.size(); i++)
{
querymatches.push_back(p1[i].pt);
trainmatches.push_back(p2[i].pt);
}
cout << querymatches[1] << " and " << trainmatches[1] << endl;
vector<uchar> status;
Mat h = findHomography(querymatches, trainmatches, status, CV_FM_RANSAC, 10);
int index = 0;
vector<DMatch> super_final_matches;
for (int i = 0; i < final_matches.size(); i++)
{
cout << status[i];
if (status[i] != 0)
{
super_final_matches.push_back(final_matches[i]);
index++;
}
}
cout << "number of inlier_matches : " << index << endl;
Mat imgMatch;
drawMatches(img1_src, keypoints1, img2_src, keypoints2, super_final_matches, imgMatch);
imshow("imgMatch", imgMatch);
t = ((double)getTickCount() - t) / getTickFrequency();
cout << " total time [s] : " << t << endl;
waitKey(0);
cout << "结束" << endl;
return 0;
}
FAST特征点提取以及FREAK描述子的图像匹配:可以比较友好的提取图像中的敏感区域。