图像匹配算法之ORB
来源:互联网 发布:mac 好用的卸载软件 编辑:程序博客网 时间:2024/05/17 04:24
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\features2d\features2d.hpp>
#include<opencv2\calib3d\calib3d.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
Mat queryImage, trainImage;
queryImage = imread("1-301.bmp", 0);
trainImage = imread("1-200(1).bmp",0);
Mat src1 = imread("1-301.bmp", CV_LOAD_IMAGE_GRAYSCALE);
Mat src2 = imread("1-200(1).bmp", CV_LOAD_IMAGE_GRAYSCALE);
if (!src1.data || !src2.data)
{
cout << "Error reading images " << std::endl;
return -1;
}
ORB orb;
vector<KeyPoint> queryKeyPoint, trainKeyPoint;
Mat queryDescriptor, trainDescriptor;
orb(queryImage, Mat(), queryKeyPoint, queryDescriptor);
orb(trainImage, Mat(), trainKeyPoint, trainDescriptor);
drawKeypoints(queryImage, queryKeyPoint, queryImage);
drawKeypoints(trainImage, trainKeyPoint, trainImage);
cout << queryKeyPoint.size() << endl;
cout << trainKeyPoint.size() << endl;
imshow("query", queryImage);
imshow("train", trainImage);
//NORM_L1, NORM_L2, NORM_HAMMING, NORM_HAMMING2
BFMatcher matcher(NORM_L2);
vector<DMatch> matches;
matcher.match(queryDescriptor, trainDescriptor, matches);
vector<DMatch> ransac_matches;
vector<Point2f> queryPoint(matches.size()), trainPoint(matches.size());
for (int i = 0; i<matches.size(); i++)
{
queryPoint[i] = queryKeyPoint[matches[i].queryIdx].pt;
trainPoint[i] = trainKeyPoint[matches[i].trainIdx].pt;
}
vector<unsigned char> inlierMask(matches.size());
Mat H = findHomography(queryPoint, trainPoint, RANSAC, 3, inlierMask);
for (size_t i = 0; i<inlierMask.size(); i++)
{
if (inlierMask[i])
{
ransac_matches.push_back(matches[i]);
}
}
Mat image_match;
// drawMatches(queryImage,queryKeyPoint,trainImage,trainKeyPoint,matches,image_match);
drawMatches(queryImage, queryKeyPoint, trainImage, trainKeyPoint, ransac_matches, image_match);
namedWindow("image_match", WINDOW_NORMAL);
imshow("image_match", image_match);
waitKey(0);
vector<Point2f> obj_corners(4);
obj_corners[0] = cvPoint(0, 0); obj_corners[1] = cvPoint(src1.cols, 0);
obj_corners[2] = cvPoint(src1.cols, src1.rows); obj_corners[3] = cvPoint(0, src1.rows);
vector<Point2f> scene_corners(4);
perspectiveTransform(obj_corners, scene_corners, H);
line(image_match, scene_corners[0] + Point2f(src1.cols, 0), scene_corners[1] + Point2f(src1.cols, 0), Scalar(0, 255, 0), 4);
line(image_match, scene_corners[1] + Point2f(src1.cols, 0), scene_corners[2] + Point2f(src1.cols, 0), Scalar(0, 255, 0), 4);
line(image_match, scene_corners[2] + Point2f(src1.cols, 0), scene_corners[3] + Point2f(src1.cols, 0), Scalar(0, 255, 0), 4);
line(image_match, scene_corners[3] + Point2f(src1.cols, 0), scene_corners[0] + Point2f(src1.cols, 0), Scalar(0, 255, 0), 4);
namedWindow("Good Matches & Object detection", WINDOW_NORMAL);
imshow("Good Matches & Object detection", image_match);
waitKey(0);
return 0;
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\features2d\features2d.hpp>
#include<opencv2\calib3d\calib3d.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
Mat queryImage, trainImage;
queryImage = imread("1-301.bmp", 0);
trainImage = imread("1-200(1).bmp",0);
Mat src1 = imread("1-301.bmp", CV_LOAD_IMAGE_GRAYSCALE);
Mat src2 = imread("1-200(1).bmp", CV_LOAD_IMAGE_GRAYSCALE);
if (!src1.data || !src2.data)
{
cout << "Error reading images " << std::endl;
return -1;
}
ORB orb;
vector<KeyPoint> queryKeyPoint, trainKeyPoint;
Mat queryDescriptor, trainDescriptor;
orb(queryImage, Mat(), queryKeyPoint, queryDescriptor);
orb(trainImage, Mat(), trainKeyPoint, trainDescriptor);
drawKeypoints(queryImage, queryKeyPoint, queryImage);
drawKeypoints(trainImage, trainKeyPoint, trainImage);
cout << queryKeyPoint.size() << endl;
cout << trainKeyPoint.size() << endl;
imshow("query", queryImage);
imshow("train", trainImage);
//NORM_L1, NORM_L2, NORM_HAMMING, NORM_HAMMING2
BFMatcher matcher(NORM_L2);
vector<DMatch> matches;
matcher.match(queryDescriptor, trainDescriptor, matches);
vector<DMatch> ransac_matches;
vector<Point2f> queryPoint(matches.size()), trainPoint(matches.size());
for (int i = 0; i<matches.size(); i++)
{
queryPoint[i] = queryKeyPoint[matches[i].queryIdx].pt;
trainPoint[i] = trainKeyPoint[matches[i].trainIdx].pt;
}
vector<unsigned char> inlierMask(matches.size());
Mat H = findHomography(queryPoint, trainPoint, RANSAC, 3, inlierMask);
for (size_t i = 0; i<inlierMask.size(); i++)
{
if (inlierMask[i])
{
ransac_matches.push_back(matches[i]);
}
}
Mat image_match;
// drawMatches(queryImage,queryKeyPoint,trainImage,trainKeyPoint,matches,image_match);
drawMatches(queryImage, queryKeyPoint, trainImage, trainKeyPoint, ransac_matches, image_match);
namedWindow("image_match", WINDOW_NORMAL);
imshow("image_match", image_match);
waitKey(0);
vector<Point2f> obj_corners(4);
obj_corners[0] = cvPoint(0, 0); obj_corners[1] = cvPoint(src1.cols, 0);
obj_corners[2] = cvPoint(src1.cols, src1.rows); obj_corners[3] = cvPoint(0, src1.rows);
vector<Point2f> scene_corners(4);
perspectiveTransform(obj_corners, scene_corners, H);
line(image_match, scene_corners[0] + Point2f(src1.cols, 0), scene_corners[1] + Point2f(src1.cols, 0), Scalar(0, 255, 0), 4);
line(image_match, scene_corners[1] + Point2f(src1.cols, 0), scene_corners[2] + Point2f(src1.cols, 0), Scalar(0, 255, 0), 4);
line(image_match, scene_corners[2] + Point2f(src1.cols, 0), scene_corners[3] + Point2f(src1.cols, 0), Scalar(0, 255, 0), 4);
line(image_match, scene_corners[3] + Point2f(src1.cols, 0), scene_corners[0] + Point2f(src1.cols, 0), Scalar(0, 255, 0), 4);
namedWindow("Good Matches & Object detection", WINDOW_NORMAL);
imshow("Good Matches & Object detection", image_match);
waitKey(0);
return 0;
}
参考博客
1.http://blog.csdn.net/quincuntial/article/details/50461692
2.http://blog.csdn.net/yhhyhhyhhyhh/article/details/54407916
阅读全文
0 0
- 图像匹配算法之ORB
- OpenCV图像匹配算法之orb
- ORB图像匹配
- 基于ORB特征提取算法图像匹配 python实现
- Orb匹配算法代码
- ORB算法特征匹配
- OpenCv学习之利用ORB算法完成图像拼接
- 图像匹配算法之brisk
- 图像匹配算法研究之surf算法
- 图像匹配算法研究之sift算法
- 图像匹配算法研究之surf算法
- 图像匹配算法研究之sift算法
- 图像匹配算法研究之sift算法
- opencv3中ORB算法描述与匹配
- ORB 特征点检测匹配算法
- 图像特征检测,ORB算法分析
- Opencv学习之ORB算法
- OpenCV图像匹配算法之sift
- Spring MVC原理及用法
- iSCSI
- Happiness
- 整数与IP地址间的转换
- Spring注入中byType和byName的总结
- 图像匹配算法之ORB
- HBase基础教程--1.2.X版本--基础知识篇(二)
- 1-jQuery源码之块级作用域
- 如何判断一个SOCKET连接是否已经断开
- 定时器
- 支持emoji表情
- 求n!的算法和C 实现
- vue(2) -- vue在watch中监听对象属性的变化
- Intellij Idea创建基于Maven的SpringMVC+MyBatis项目