opencv_C++ AKAZE 特征提取与匹配

一、程序示例及注释
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
using namespace std;

int main()
{
	Mat objImage = imread("curry1.jpg", 0);
	Mat sceneImage = imread("curry_dlt.jpg", 0);

	// kaze detection
	Ptr<AKAZE> detector = AKAZE::create();
	vector<KeyPoint> obj_keypoints, scene_keypoints;
	Mat obj_descriptor, scene_descriptor;

	double t1 = getTickCount();
	// 得到keypoints 和 描述子
	detector->detectAndCompute(objImage, Mat(), obj_keypoints, obj_descriptor);
	detector->detectAndCompute(sceneImage, Mat(), scene_keypoints, scene_descriptor);
	double t2 = getTickCount();

	// 使用的时间
	double d_kazeTime = 1000 * (t2 - t1) / getTickFrequency();
	printf("Use time is: %f\n", d_kazeTime);

	// matching
	BFMatcher matcher(NORM_L2);
	vector<DMatch> matches;
	matcher.match(obj_descriptor, scene_descriptor, matches);
	// draw matches -key points
	Mat akazeMatchesImage;
	drawMatches(objImage, obj_keypoints, sceneImage, scene_keypoints, matches, akazeMatchesImage);
	imshow("akazeMatchesIamge", akazeMatchesImage);

	// good matches
	vector<DMatch> goodMatches;
	double minDist = 10000, maxDist = 0;
	for (size_t i = 0; i < matches.size(); i++)
	{
		double dist = matches[i].distance;
		if (dist < minDist)
			minDist = dist;
		if (dist > maxDist)
			maxDist = dist;
	}
	      
	for (size_t i = 0; i < matches.size(); i++)
	{
		double dist = matches[i].distance;
		if (dist < max(3 * minDist, 0.02))
			goodMatches.push_back(matches[i]);
	}

	Mat goodMathcesImage;
	drawMatches(objImage, obj_keypoints, sceneImage, scene_keypoints, goodMatches, goodMathcesImage,\
		Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
	imshow("goodMathcesImage", goodMathcesImage);

	waitKey(0);
	return 0;
}
二、运行结果

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
AKAZE(Accelerated-KAZE)是一种局部特征点匹配算法,也叫非线性尺度空间的特征点。它是KAZE的加速版。AKAZE通过AOS构造尺度空间、Hessian矩阵特征点检测、方向指定一阶微分图像以及生成描述子来实现特征点的检测。相比于SIFT和SURF算法,AKAZE算法更快速,同时与ORB和BRISK算法相比,具有更高的可重复性和鲁棒性。 在Python中使用AKAZE特征匹配算法可以借助OpenCV库来实现。首先,需要导入相应的库,并读取图像。然后,通过cv2.AKAZE_create()创建AKAZE对象。接下来,使用detectAndCompute方法来检测特征点并生成描述子。然后,使用drawKeypoints方法将特征点绘制在图像上。最后,使用plt.imshow展示图像并使用plt.show()显示图像。你也可以使用cv2.waitKey(0)和cv2.destroyAllWindows()来控制图像窗口的显示和关闭。 另外,特征匹配算法可以分为暴力匹配法、KNN匹配法和FLANN匹配法。这些方法可以用来将检测到的特征点进行匹配。 如果你想了解更多关于AKAZE特征匹配算法的内容,可以参考相关章节或者阅读Python Opencv2系列中的相关文章。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python+Opencv2(三)图像特征匹配](https://blog.csdn.net/cungudafa/article/details/105399278)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值