【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、运行结果三、总结一、

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Nginx中location实现多条件匹配的方法详解

《Nginx中location实现多条件匹配的方法详解》在Nginx中,location指令用于匹配请求的URI,虽然location本身是基于单一匹配规则的,但可以通过多种方式实现多个条件的匹配逻辑... 目录1. 概述2. 实现多条件匹配的方式2.1 使用多个 location 块2.2 使用正则表达式

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

关于Gateway路由匹配规则解读

《关于Gateway路由匹配规则解读》本文详细介绍了SpringCloudGateway的路由匹配规则,包括基本概念、常用属性、实际应用以及注意事项,路由匹配规则决定了请求如何被转发到目标服务,是Ga... 目录Gateway路由匹配规则一、基本概念二、常用属性三、实际应用四、注意事项总结Gateway路由

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

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

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

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

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

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

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