opencv矩形轮廓检测_opencv特征点匹配

Python (5) 2024-07-28 19:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
opencv矩形轮廓检测_opencv特征点匹配,希望能够帮助你!!!。

文章目录

  • 准备工作
  • SIFT
  • SURF
  • ORB
  • AKAZE
  • FAST与BRIEF
  • CenSurE
  • BEBLID
  • 匹配点后的图像拼接
  • SuperPoint
  • 总结

准备工作

先准备两张待处理的图像,要求有重叠区域,且能检测到匹配点。
我选择了匹配比较难的两张原图:opencv矩形轮廓检测_opencv特征点匹配_https://bianchenghao6.com/blog_Python_第1张
opencv矩形轮廓检测_opencv特征点匹配_https://bianchenghao6.com/blog_Python_第2张
导入相关依赖:

import cv2 import matplotlib.pyplot as plt import matplotlib.image as mpimg import numpy as np 

读入两张图片并灰度化:

img1 = mpimg.imread(r'D:/apap/temple/2.jpg') img2 = mpimg.imread(r'D:/apap/temple/3.jpg') #复制一些原图的副本,画图用 img1_list = [] img2_list = [] for i in range(15): img1_list.append(img1.copy()) img2_list.append(img2.copy()) img11 = img1.copy() img22 = img2.copy() img1_g = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) img2_g = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) figure, ax = plt.subplots(1, 2, figsize=(16, 8)) ax[0].imshow(img1_g, cmap='gray') ax[1].imshow(img2_g, cmap='gray') plt.show() 

用mpimg读取图片的原因是用matplotlib显示图片,如果用imread读取还存在RGB转换的问题。同时得到一些原图的副本,画特征点的函数都是改变原图的,所以为了画图显示方便多复制一些。特征检测和描述都是在灰度图上进行的,这样可以更好的排除颜色噪声。

灰度图显示结果:
opencv矩形轮廓检测_opencv特征点匹配_https://bianchenghao6.com/blog_Python_第3张

SIFT

SIFT(Scale Invariant Feature Transform):尺度不变特征转换。计算量大,速度慢,在空间和尺度定位精准。所以一般应用在需要准确匹配和不考虑计算速度的情况下使用。也是图像拼接领域常用的特征检测算法。
在Python+OpenCV中,集成的SIFT可以直接获得特征点和描述子。

#可以传参限定点的个数上限 sift = cv2.xfeatures2d.SIFT_create() keypoints_1, descriptors_1 = sift.detectAndCompute(img1_g,None) keypoints_2, descriptors_2 = sift.detectAndCompute(img2_g,None) 

绘制检测结果:

red = (255,0,0) #color = (51,163,236) cv2.drawKeypoints(image = img11, outImage = img11, keypoints = keypoints_1, color = red) cv2.drawKeypoints(image = img22, outImage = img22, keypoints = keypoints_2, color = red) figure, ax = plt.subplots(1, 2, figsize=(20, 20),dpi=160) ax[0].imshow(img11) ax[1].imshow(img22) #第二个参数表示去掉多余空白位置 #plt.savefig("E:/Keypoint/SIFT_Extract.png", bbox_inches='tight')  plt.show() 

opencv矩形轮廓检测_opencv特征点匹配_https://bianchenghao6.com/blog_Python_第4张
用FLANN匹配器获得匹配点并筛选及可视化(匹配器用法链接cv2.FlannBasedMatcher):

FLANN_INDEX_KDTREE = 1 # kd树 index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5) search_params = dict(checks=50) # or pass empty dictionary flann = cv2.FlannBasedMatcher(index_params, search_params) matches = flann.knnMatch(descriptors_1, descriptors_2, k=2) good_matches = [] for m,n in matches: if m.distance < 0.75*n.distance: good_matches.append(

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

发表回复