【OpenCV】OpenCV3中的SURF特征点的寻找和匹配

2024-03-11 06:58

本文主要是介绍【OpenCV】OpenCV3中的SURF特征点的寻找和匹配,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


不多说什么了,直接上代码吧:

#include <iostream>
#include <stdio.h>
#include "opencv2/core.hpp"
#include "opencv2/core/utility.hpp"
#include "opencv2/core/ocl.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/features2d.hpp"
#include "opencv2/calib3d.hpp"
#include "opencv2/imgproc.hpp"
#include"opencv2/flann.hpp"
#include"opencv2/xfeatures2d.hpp"
#include"opencv2/ml.hpp"using namespace cv;
using namespace std;
using namespace cv::xfeatures2d;
using namespace cv::ml;int main()
{Mat a = imread("box.png", IMREAD_GRAYSCALE);    //读取灰度图像Mat b = imread("box_in_scene.png", IMREAD_GRAYSCALE);Ptr<SURF> surf;      //创建方式和2中的不一样surf = SURF::create(800);BFMatcher matcher;Mat c, d;vector<KeyPoint>key1, key2;vector<DMatch> matches;surf->detectAndCompute(a, Mat(), key1, c);surf->detectAndCompute(b, Mat(), key2, d);matcher.match(c, d, matches);       //匹配sort(matches.begin(), matches.end());  //筛选匹配点vector< DMatch > good_matches;              int ptsPairs = std::min(50, (int)(matches.size() * 0.15));cout << ptsPairs << endl;for (int i = 0; i < ptsPairs; i++){good_matches.push_back(matches[i]);}Mat outimg;drawMatches(a, key1, b, key2, good_matches, outimg, Scalar::all(-1), Scalar::all(-1),vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);  //绘制匹配点std::vector<Point2f> obj;std::vector<Point2f> scene;for (size_t i = 0; i < good_matches.size(); i++){obj.push_back(key1[good_matches[i].queryIdx].pt);scene.push_back(key2[good_matches[i].trainIdx].pt);}std::vector<Point2f> obj_corners(4);obj_corners[0] = Point(0, 0);obj_corners[1] = Point(a.cols, 0);obj_corners[2] = Point(a.cols, a.rows);obj_corners[3] = Point(0, a.rows);std::vector<Point2f> scene_corners(4);Mat H = findHomography(obj, scene, RANSAC);      //寻找匹配的图像perspectiveTransform(obj_corners, scene_corners, H);line(outimg,scene_corners[0] + Point2f((float)a.cols, 0), scene_corners[1] + Point2f((float)a.cols, 0),Scalar(0, 255, 0), 2, LINE_AA);       //绘制line(outimg,scene_corners[1] + Point2f((float)a.cols, 0), scene_corners[2] + Point2f((float)a.cols, 0),Scalar(0, 255, 0), 2, LINE_AA);line(outimg,scene_corners[2] + Point2f((float)a.cols, 0), scene_corners[3] + Point2f((float)a.cols, 0),Scalar(0, 255, 0), 2, LINE_AA);line(outimg,scene_corners[3] + Point2f((float)a.cols, 0), scene_corners[0] + Point2f((float)a.cols, 0),Scalar(0, 255, 0), 2, LINE_AA);imshow("aaaa",outimg);cvWaitKey(0);
}


运行图: 
这里写图片描述



//-------------读取模板------------cv::Mat img_object = imread("/storage/emulated/0/ApplePearFace/imgTemp.jpg");//-------------图像处理---------cv::Mat img_scene(yimage);/*// 检测surf特征点int minHessian = 400;OrbDescriptorExtractor detector(minHessian);std::vector<KeyPoint> keypoints_1, keypoints_2;detector.detect(img_1, keypoints_1);detector.detect(img_2, keypoints_2);//-- Step 2: Calculate descriptors (feature vectors)OrbDescriptorExtractor extractor;Mat descriptors_1, descriptors_2;extractor.compute(img_1, keypoints_1, descriptors_1);extractor.compute(img_2, keypoints_2, descriptors_2);//-- Step 3: Matching descriptor vectors with a brute force matcherBFMatcher matcher(NORM_L2);std::vector< DMatch > matches;matcher.match(descriptors_1, descriptors_2, matches);//-- Draw matchesMat img_matches;drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_matches);*/// 读取数据//cv::Mat img_object = cv::imread("doll01.jpg");//cv::Mat img_scene = cv::imread("doll012.jpg");if (!img_object.data || !img_scene.data) {cout << "Error reading images." << endl;return 0;}// 构建特征检测器和描述子提取器cv::Ptr<cv::FeatureDetector> detector = cv::FeatureDetector::create("ORB");cv::Ptr<cv::DescriptorExtractor> descriptor = cv::DescriptorExtractor::create("ORB");// 检测特征点vector<cv::KeyPoint> kp_object, kp_scene;detector->detect(img_object, kp_object);detector->detect(img_scene, kp_scene);// 计算描述子cv::Mat desp_object, desp_scene;descriptor->compute(img_object, kp_object, desp_object);descriptor->compute(img_scene, kp_scene, desp_scene);/*if (desp_object.type() != CV_32F) {desp_object.convertTo(desp_object, CV_32F);}if (desp_scene.type() != CV_32F) {desp_scene.convertTo(desp_scene, CV_32F);}*/// 匹配描述子vector<cv::DMatch> matches;cv::FlannBasedMatcher matcher(new cv::flann::LshIndexParams(20, 10, 2));matcher.match(desp_object, desp_scene, matches);//cout << "Find total " << matches.size() << " matches." << endl;// 筛选匹配//double min_dist = 100000;//for (int i = 0; i < matches.size(); i++) {//	float a = matches[i].distance;//	if (a < min_dist) {//		min_dist = matches[i].distance;//	}//}//vector<cv::DMatch> good_matches;//for (int i = 0; i < matches.size(); i++) {////	if (matches[i].distance < 3 * min_dist) {//		good_matches.push_back(matches[i]);//	}//}// 显示匹配//cout << "Good matches=" << matches.size() << endl;cv::Mat img_matches;cv::drawMatches(img_object, kp_object, img_scene, kp_scene, matches, img_matches);// 定位目标cv::vector<cv::Point2f> obj_points;cv::vector<cv::Point2f> scene;for (int i = 0; i < matches.size(); i++) {obj_points.push_back(kp_object[matches[i].queryIdx].pt);scene.push_back(kp_scene[matches[i].trainIdx].pt);}cv::Mat H = cv::findHomography(obj_points, scene, CV_RANSAC);cv::vector<cv::Point2f> obj_corners(4);cv::vector<cv::Point2f> scene_corners(4);obj_corners[0] = cv::Point(0, 0);obj_corners[1] = cv::Point(img_object.cols, 0);obj_corners[2] = cv::Point(img_object.cols, img_object.rows);obj_corners[3] = cv::Point(0, img_object.rows);cv::perspectiveTransform(obj_corners, scene_corners, H);cv::line(img_matches, scene_corners[0] + cv::Point2f(img_object.cols, 0), scene_corners[1] + cv::Point2f(img_object.cols, 0), cv::Scalar(0, 255, 0), 4);cv::line(img_matches, scene_corners[1] + cv::Point2f(img_object.cols, 0), scene_corners[2] + cv::Point2f(img_object.cols, 0), cv::Scalar(0, 255, 0), 4);cv::line(img_matches, scene_corners[2] + cv::Point2f(img_object.cols, 0), scene_corners[3] + cv::Point2f(img_object.cols, 0), cv::Scalar(0, 255, 0), 4);cv::line(img_matches, scene_corners[3] + cv::Point2f(img_object.cols, 0), scene_corners[0] + cv::Point2f(img_object.cols, 0), cv::Scalar(0, 255, 0), 4);cv::Mat dstSize;cv::resize(img_matches, dstSize, Size(2 * h, w));


这篇关于【OpenCV】OpenCV3中的SURF特征点的寻找和匹配的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/797007

相关文章

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

hdu 3065 AC自动机 匹配串编号以及出现次数

题意: 仍旧是天朝语题。 Input 第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。 在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

opencv 滚动条

参数介绍:createTrackbar( trackbarname , "hello" , &alpha_slider ,alpha_max ,  on_trackbar )  ;在标签中显示的文字(提示滑动条的用途) TrackbarName创建的滑动条要放置窗体的名字 “hello”滑动条的取值范围从 0 到 alpha_max (最小值只能为 zero).滑动后的值存放在

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

寻找身高相近的小朋友

题目描述: 小明今年升学到小学一年级,来到新班级后发现其他小朋友们身高参差不齐,然后就想基于各小朋友和自己的身高差对他们进行排序,请帮他实现排序。 输入描述: 第一行为正整数H和N,0<H<200,为小明的身高,0<N<50,为新班级其他小朋友个数。第二行为N个正整数H1-HN,分别是其他小朋友的身高,取值范围0<Hi<200(1<=i<=N),且N个正整数各不相同。 输出描述: 输出

POJ 3057 最大二分匹配+bfs + 二分

SampleInput35 5XXDXXX...XD...XX...DXXXXX5 12XXXXXXXXXXXXX..........DX.XXXXXXXXXXX..........XXXXXXXXXXXXX5 5XDXXXX.X.DXX.XXD.X.XXXXDXSampleOutput321impossible

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据