因为准备学习三维重构的算法,最近开始接触c++的opencv,vs真的不如clion好用,吐槽一下。。。
opencv3出来后有了很多的变换,这里用来记录一下,防止以后踩坑,每次因为版本不兼容报错头都大了
#include<opencv2//opencv.hpp>
#include<iostream>
#include<iostream>
#include<vector>
#include<opencv2\core\core.hpp>
#include<opencv2\features2d\features2d.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace std;
using namespace cv;
int main()
{
//读取图片
Mat rgbd1 = imread("C:/Users/lenovo/Desktop/1.JPG");
Mat rgbd2 = imread("C:/Users/lenovo/Desktop/1.JPG");
//这里是和opencv2不同的地方,以前是ORB orb(),现在ORB是虚函数,然后添加了智能指针,可 以自动delete!
Ptr<ORB> orb = ORB::create(1000); //1000是匹配点个数
vector<KeyPoint> Keypoints1, Keypoints2;
Mat descriptors1, descriptors2;
//这里detect和compute合并为了一个函数
orb->detectAndCompute(rgbd1, Mat(), Keypoints1, descriptors1);
orb->detectAndCompute(rgbd2, Mat(), Keypoints2, descriptors2);
//可视化,显示关键点
Mat ShowKeypoints1, ShowKeypoints2;
drawKeypoints(rgbd1, Keypoints1, ShowKeypoints1);
drawKeypoints(rgbd2, Keypoints2, ShowKeypoints2);
namedWindow("Keypoints1", WINDOW_NORMAL);
namedWindow("Keypoints2", WINDOW_NORMAL);
imshow("Keypoints1", ShowKeypoints1);
imshow("Keypoints2", ShowKeypoints2);
waitKey(0);
//Matching
vector<DMatch> matches;
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce");
matcher->match(descriptors1, descriptors2, matches);
cout << "find out total " << matches.size() << " matches" << endl;
//可视化
Mat ShowMatches;
drawMatches(rgbd1, Keypoints1, rgbd2, Keypoints2, matches, ShowMatches);
namedWindow("matches", WINDOW_NORMAL);
imshow("matches", ShowMatches);
waitKey(0);
return 0;
}
上面是代码,注意imread后面是绝对路径,不要想着放在一个工程里就行,下面是效果啦
物体很多的时候效果一般,很多错误