Opencv C++ SIFT特征提取(单图像,多图像)+如何设置阈值+如何对文件夹进行批处理+如何设置掩膜裁剪影像

这篇具有很好参考价值的文章主要介绍了Opencv C++ SIFT特征提取(单图像,多图像)+如何设置阈值+如何对文件夹进行批处理+如何设置掩膜裁剪影像。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、何谓SITF特征提取,它有什么作用?

SIFT(Scale-Invariant Feature Transform)是一种用于图像处理和计算机视觉的特征提取算法。由David Lowe于1999年首次提出,它是一种非常有效的局部特征描述符,具有尺度不变性、旋转不变性和对部分遮挡的鲁棒性。

SIFT特征提取的主要步骤包括:

  1. 尺度空间极值检测(Scale-Space Extrema Detection):通过不同尺度的高斯模糊图像,检测图像中的局部最小和最大值,形成尺度空间。

  2. 关键点定位(Key Point Localization):在尺度空间中,通过对极值点的局部区域进行拟合,找到关键点的准确位置。

  3. 关键点方向分配(Orientation Assignment):为每个关键点分配一个主方向,使得描述子具有旋转不变性。

  4. 描述子生成(Descriptor Generation):在关键点的周围区域计算局部梯度,生成具有尺度和旋转不变性的特征描述子。

SIFT特征提取的作用:

  1. 物体识别和图像匹配:SIFT特征可以用于在不同图像中寻找相似的局部特征,从而实现物体识别和图像匹配。

  2. 目标跟踪:SIFT特征对于目标在不同尺度和角度下的稳定性使其成为目标跟踪任务中的有力工具。

  3. 全景图像拼接:在全景图像拼接中,SIFT特征可以用于检测并匹配图像中的关键点,实现图像的自动对准和拼接。

  4. 图像检索:通过将图像中的SIFT特征转化为高维特征向量,可以用于图像检索,找到包含相似特征的图像。

  5. 图像配准:在医学图像处理等领域,SIFT特征可以用于图像配准,即将不同图像对齐以进行比较和分析。

总体而言,SIFT特征提取在计算机视觉领域中被广泛应用,特别是在需要处理具有尺度和旋转变化的图像时。

二、代码展示

1.必要的准备

建议先安装好OpenCV_contrib:

【一步到位】Visual Studio20xx+OpenCV4.5.1+opencv_contrib的安装与配置-CSDN博客

2.代码实例

在OpenCV 4.x版本中,SIFT算法已经从 xfeatures2d 模块移到了 cv 命名空间下。以下是一个基于C++和OpenCV 4.5.1的简单SIFT特征点提取的示例代码:

(1)——对单一图片进行特征点提取

该代码实现了两个功能,一是对输入的图像进行了特征点提取,二是统计了一共有多少个特征点。

#include <opencv2/opencv.hpp>

int main() {
	// 读取图像
	cv::Mat image = cv::imread("D://lena.jpg");

	if (image.empty()) {
		std::cerr << "Error: Could not read the image." << std::endl;
		return -1;
	}

	// 创建SIFT检测器
	cv::Ptr<cv::SIFT> detector = cv::SIFT::create();

	// 检测关键点和计算描述子
	std::vector<cv::KeyPoint> keypoints;
	cv::Mat descriptors;
	detector->detectAndCompute(image, cv::noArray(), keypoints, descriptors);

	// 在图像上绘制关键点
	cv::Mat outputImage;
	cv::drawKeypoints(image, keypoints, outputImage);

	// 保存结果图像
	cv::imwrite("sift_keypoints.jpg", outputImage);
	std::cout << "SIFT keypoint extraction completed. " << keypoints.size() << " keypoints detected." << std::endl;
	cv::namedWindow("原图");
	imshow("原图", image);
	cv::namedWindow("结果图");
	imshow("结果图", outputImage);
	cv::waitKey(0);
	

	return 0;
}

结果如图所示:

c++不使用opencv实现sift特征提取,OpenCV-工程向,opencv,人工智能,计算机视觉,c++

(2)——对两张图片进行特征点提取

step1:首先需要两张特征图像,如果没有的话,可以通过下列代码随机生成,或者是直接百度网盘下载:链接:https://pan.baidu.com/s/1sEY633fESQgxKUm2OlH1rw?pwd=1024 
提取码:1024 

--来自百度网盘超级会员V5的分享

#include <opencv2/opencv.hpp>

int main() {
	// 创建两张空白图像
	cv::Mat image1 = cv::Mat::zeros(300, 400, CV_8UC3);
	cv::Mat image2 = cv::Mat::zeros(300, 400, CV_8UC3);

	// 随机生成特征点的数量
	int numPoints = 50;

	// 随机生成特征点坐标并在图像上绘制
	for (int i = 0; i < numPoints; ++i) {
		cv::Point2f point1(rand() % image1.cols, rand() % image1.rows);
		cv::Point2f point2(rand() % image2.cols, rand() % image2.rows);

		// 在图像上绘制特征点
		cv::circle(image1, point1, 3, cv::Scalar(0, 255, 0), -1);
		cv::circle(image2, point2, 3, cv::Scalar(0, 255, 0), -1);
	}

	// 保存生成的图像
	cv::imwrite("random_image1.jpg", image1);
	cv::imwrite("random_image2.jpg", image2);

	// 显示生成的图像
	cv::imshow("Image 1", image1);
	cv::imshow("Image 2", image2);
	cv::waitKey(0);

	return 0;
}

两个图像的特征提取与匹配:使用Brute-Force匹配器匹配两个图像的特征点。

该代码目的:

  • 读取两个图像。
  • 使用SIFT检测器提取两个图像中的关键点和描述子。
  • 使用Brute-Force匹配器匹配两个图像的特征点。
  • 绘制匹配结果并保存图像。
#include <opencv2/opencv.hpp>

int main() {
	// 读取两个图像
	cv::Mat image1 = cv::imread("random_image1.jpg");
	cv::Mat image2 = cv::imread("random_image2.jpg");//如果这里你是选择下载的百度网盘图像,或者是自己生成的,请写具体地址。

	if (image1.empty() || image2.empty()) {
		std::cerr << "Error: Could not read the images." << std::endl;
		return -1;
	}

	// 创建SIFT检测器
	cv::Ptr<cv::SIFT> detector = cv::SIFT::create();

	// 检测关键点和计算描述子
	std::vector<cv::KeyPoint> keypoints1, keypoints2;
	cv::Mat descriptors1, descriptors2;
	detector->detectAndCompute(image1, cv::noArray(), keypoints1, descriptors1);
	detector->detectAndCompute(image2, cv::noArray(), keypoints2, descriptors2);

	// 使用Brute-Force匹配器进行匹配
	cv::BFMatcher matcher;
	std::vector<cv::DMatch> matches;
	matcher.match(descriptors1, descriptors2, matches);

	// 绘制匹配结果
	cv::Mat matchImage;
	cv::drawMatches(image1, keypoints1, image2, keypoints2, matches, matchImage);

	// 保存结果图像
	cv::imwrite("sift_matches.jpg", matchImage);

	std::cout << "SIFT feature matching completed. " << matches.size() << " matches found." << std::endl;
	cv::namedWindow("原图1");
	imshow("原图1", image1);
	cv::namedWindow("原图2");
	imshow("原图2", image2);
	cv::namedWindow("结果图");
	imshow("结果图", matchImage);
	cv::waitKey(0);
	return 0;
}

结果图:

c++不使用opencv实现sift特征提取,OpenCV-工程向,opencv,人工智能,计算机视觉,c++

函数及代码介绍:

创建SIFT检测器

cv::Ptr<cv::SIFT> detector = cv::SIFT::create();

检查关键点和计算描述子:

std::vector<cv::KeyPoint> keypoints1, keypoints2;
cv::Mat descriptors1, descriptors2;
detector->detectAndCompute(image1, cv::noArray(), keypoints1, descriptors1);
detector->detectAndCompute(image2, cv::noArray(), keypoints2, descriptors2);

使用Brute-Force匹配器进行匹配

cv::BFMatcher matcher;
std::vector<cv::DMatch> matches;
matcher.match(descriptors1, descriptors2, matches);

Brute-Force匹配器是一种简单直接的特征匹配方法,它基于一种朴素的原理:对于一个特征集合中的每个特征,在另一个特征集合中找到与之最相似的特征。这种匹配方法的简单性和直观性使得它在很多应用中仍然很有用。

具体来说,Brute-Force匹配器的原理如下:

  1. 特征提取:首先,对于两幅图像,使用某种特征提取算法(如SIFT、SURF等)从图像中提取关键点(keypoints)和对应的特征描述子(feature descriptors)。

  2. 特征匹配:对于第一幅图像中的每个特征,通过计算其特征描述子与第二幅图像中所有特征描述子的相似度(例如使用欧氏距离或汉明距离等),找到与之最匹配的特征。

  3. 建立匹配:通过设定一个阈值或者使用一些筛选方法,将相似度较高的特征匹配对保留下来,形成最终的匹配集合。

  4. 生成匹配结果:将保留下来的匹配对可视化或用于后续的图像处理任务。

Brute-Force匹配器的优点是简单、直观,容易理解和实现。然而,它的缺点在于计算成本较高,特别是当特征点数量较大时,需要进行大量的特征匹配计算,计算复杂度较高。因此,在大规模图像处理中,可能会采用一些加速方法,例如使用空间索引结构(KD-Tree、FLANN等)来加速匹配过程。

绘制匹配结果:

cv::Mat matchImage;
cv::drawMatches(image1, keypoints1, image2, keypoints2, matches, matchImage);

三、关于阈值问题

因为输出的结果图中有数百组特征点匹配,我们可以采用按照特征点的相似程度高低进行排序,然后选择最佳的五十组匹配,重新修改上述代码。

	// 使用Brute-Force匹配器进行匹配
	cv::BFMatcher matcher;
	std::vector<cv::DMatch> matches;
	matcher.match(descriptors1, descriptors2, matches);

	// 根据匹配结果的距离进行排序
	std::sort(matches.begin(), matches.end(), [](const cv::DMatch& a, const cv::DMatch& b) {
		return a.distance < b.distance;
		});

	// 选择最佳的50组匹配
	std::vector<cv::DMatch> bestMatches(matches.begin(), matches.begin() + 50);

	// 绘制匹配结果
	cv::Mat matchImage;
	cv::drawMatches(image1, keypoints1, image2, keypoints2, bestMatches, matchImage);

	// 保存结果图像
	cv::imwrite("sift_top50_matches.jpg", matchImage);

	std::cout << "SIFT feature matching completed. " << bestMatches.size() << " best matches found." << std::endl;
	cv::namedWindow("原图1");
	imshow("原图1", image1);
	cv::namedWindow("原图2");
	imshow("原图2", image2);
	cv::namedWindow("结果图");
	imshow("结果图", matchImage);
	cv::waitKey(0);
	return 0;
}

其最后结果如下图所示:

(图片与上述图片不同,该项为后期补充)

c++不使用opencv实现sift特征提取,OpenCV-工程向,opencv,人工智能,计算机视觉,c++

四、以文件夹形式进行批处理+对图片进行掩膜裁剪。

//这个代码实现了如下功能:1·读文件夹内的图片。2·对其中心做了一个圆形掩膜。3·通过将掩膜反转,裁剪获得原始图片上除了中心圆形以外的区域。4·而后将结果依次输出到指定的文件夹中。
#include <opencv2/opencv.hpp>
#include <iostream>
#include <filesystem>
using namespace cv;

int main() {
	std::string input_folder = "Z:\\Image";  // 输入图片所在文件夹路径
	std::string output_folder = "Z:\\cropped_image";  // 输出结果保存文件夹路径

	std::vector<cv::String> filenames;
	cv::glob(input_folder, filenames);

	for (size_t i = 0; i < filenames.size(); ++i) {
		
			// 读取两张图像
			cv::Mat image1 = cv::imread(filenames[i]);
			

			if (image1.empty()) {
				std::cerr << "Error: Could not read images " << filenames[i]<< std::endl;
				continue;
			}
			// 获取图像中心点
			Point center(image1.cols / 2, image1.rows / 2);

			// 创建一个和输入图像大小相同的黑色图像
			Mat mask = Mat::zeros(image1.size(), CV_8UC1);

			// 以中心为原点,画一个200像素半径的圆形掩膜
			circle(mask, center, 350, Scalar(255), -1);



			// 反转掩膜,将圆形区域变为黑色,外部区域变为白色
			bitwise_not(mask, mask);

			// 创建一个与输入图像相同大小的输出图像
			Mat result = Mat::zeros(image1.size(), image1.type());

			// 使用反转后的掩膜来裁剪图像
			image1.copyTo(result, mask);


			// 保存裁剪后的图像到文件
			imwrite("cropped_image.jpg", result);

			// 构建输出文件路径
			std::string output_name = "cropped_image_" + std::to_string(i) + "_"  + ".jpg";
			std::string output_path = output_folder + "/" + output_name;

			// 保存结果图像到指定文件夹
			cv::imwrite(output_path, result);

		
	}
	return 0;
}

其结果如下:

c++不使用opencv实现sift特征提取,OpenCV-工程向,opencv,人工智能,计算机视觉,c++文章来源地址https://www.toymoban.com/news/detail-804848.html

到了这里,关于Opencv C++ SIFT特征提取(单图像,多图像)+如何设置阈值+如何对文件夹进行批处理+如何设置掩膜裁剪影像的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv 进阶15-检测DoG特征并提取SIFT描述符cv2.SIFT_create()

    前面我们已经了解了Harris函数来进行角点检测,因为角点的特性,这些角点在图像旋转的时候也可以被检测到。但是,如果我们放大或缩小图像时,就可能会丢失图像的某些部分,甚至有可能增加角点的质量。这种损失的现象需要一种与图像比例无关的角点检测方法来解决。

    2024年02月11日
    浏览(52)
  • 【计算机视觉、关键点检测、特征提取和匹配】基于SIFT、PCA-SIFT和GLOH算法在不同图像之间建立特征对应关系,并实现点匹配算法和图像匹配(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码、数据、文章

    2024年03月14日
    浏览(55)
  • Opencv图像特征点提取(

            目录 特征点分类 1 ORB ①特征点检测 ②计算特征描述 2 SIFT 1 SIFT特征检测的步骤 ①.在DOG尺度空间中获取极值点,即关键点。 ②.特征点方向估计 ③生成特征描述 ④.代码实现 3.SURF ①.SURF的介绍 ②.SURF算法步骤 ③. SIFT与SURF效果比较 ④代码实现 4 FAST角点检测且阈值可

    2024年02月14日
    浏览(48)
  • OpenCV图像特征提取学习五,HOG特征检测算法

    一、HOG向梯度直方图概述   向梯度直方图(Histogram of Oriented Gradient, HOG)特征是基于对稠密网格中归一化的局部方向梯度直方图的计算。此方法的基本观点是:局部目标的外表和形状可以被局部梯度或边缘方向的分布很好的描述,即使我们不知道对应的梯度和边缘的位置。在

    2024年02月04日
    浏览(47)
  • Lesson4-1:OpenCV图像特征提取与描述---角点特征

    学习目标 理解图像的特征 知道图像的角点 1 图像的特征 大多数人都玩过拼图游戏。首先拿到完整图像的碎片,然后把这些碎片以正确的方式排列起来从而重建这幅图像。如果把拼图游戏的原理写成计算机程序,那计算机就也会玩拼图游戏了。 在拼图时,我们要寻找一些唯一

    2024年02月10日
    浏览(38)
  • python opencv orb特征点提取匹配然后图像拼接

    opencv 基于ORB特征点图像拼接_特征点 warpperspective-CSDN博客 图像用这儿的 右边多出了一部分黑色的,应该是重复部分的宽

    2024年01月19日
    浏览(50)
  • C++ 图像线特征提取【HoughLinesP算法】

       HoughLinesP :是一种基于Hough变换的直线检测算法。它可以识别图像中的直线,并返回它们的端点坐标。其函数接口如下: cv::HoughLinesP(   InputArray src,   // 输入图像,必须 8-bit 的灰度图像   OutputArray lines,  // 输出的极坐标来表示直线   double rho,    // 生成极

    2024年02月07日
    浏览(40)
  • opencv基础57-模板匹配cv2.matchTemplate()->(目标检测、图像识别、特征提取)

    OpenCV 提供了模板匹配(Template Matching)的功能,它允许你在图像中寻找特定模板(小图像)在目标图像中的匹配位置。模板匹配在计算机视觉中用于目标检测、图像识别、特征提取等领域。 以下是 OpenCV 中使用模板匹配的基本步骤: 加载图像 : 首先,加载目标图像和要匹配

    2024年02月13日
    浏览(47)
  • 【课程介绍】OpenCV 基础入门教程:图像读取、显示、保存,图像处理和增强(如滤波、边缘检测、图像变换),特征提取和匹配,目标检测和跟踪

    [ 专栏推荐 ] 😃 《视觉探索: OpenCV 基础入门教程》 😄 ❤️【简介】: Opencv 入门课程适合初学者,旨在介绍 Opencv 库的基础知识和核心功能。课程包括图像读取、显示、保存,图像处理和增强(如滤波、边缘检测、图像变换),特征提取和匹配,目标检测和跟踪等内容。学

    2024年02月16日
    浏览(397)
  • 基于SIFT图像特征识别的匹配方法比较与实现

    目前常用的匹配器有 BFMatcher and FlannBasedMatcher 1.1 BFMatcher BFMatcher 全称是 Brute-Force Matcher (直译即为暴力匹配器) 大致原理: 对于 img1 中的每个描述符, BFMatcher 将其与 img2 中的所有描述符进行比较;它计算两个描述符之间的距离度量(例如,欧几里得距离或汉明距离,默认使

    2024年02月09日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包