【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

相关文章

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Python如何将OpenCV摄像头视频流通过浏览器播放

《Python如何将OpenCV摄像头视频流通过浏览器播放》:本文主要介绍Python如何将OpenCV摄像头视频流通过浏览器播放的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完... 目录方法1:使用Flask + MJPEG流实现代码使用方法优点缺点方法2:使用WebSocket传输视

HTML5 中的<button>标签用法和特征

《HTML5中的<button>标签用法和特征》在HTML5中,button标签用于定义一个可点击的按钮,它是创建交互式网页的重要元素之一,本文将深入解析HTML5中的button标签,详细介绍其属... 目录引言<button> 标签的基本用法<button> 标签的属性typevaluedisabled

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O