当前位置: 代码迷 >> 综合 >> opencv——特征匹配 SIFT demo应用与函数详解
  详细解决方案

opencv——特征匹配 SIFT demo应用与函数详解

热度:6   发布时间:2023-12-01 10:39:03.0

注意opencv版本为
opencv-contrib-python 3.4.2.17
opencv-python 3.4.2.17
由于专利版权问题,opencv内置的SIFT算法在3.4.3及以上版本中无法使用。

mport cv2
import numpy as npimg1 = cv2.imread(r'C:\Users\Owen\Pictures\box.png')
img2 = cv2.imread(r'C:\Users\Owen\Pictures\box_in_scene.png')def cv_show(name,img):  #定义函数方便验证cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows()cv_show('img1',img1)
cv_show('img2',img2)sift = cv2.xfeatures2d.SIFT_create()kp1, des1 = sift.detectAndCompute(img1, None)  #计算matches
kp2, des2 = sift.detectAndCompute(img2, None)# crossCheck表示两个特征点要互相匹,例如A中的第i个特征点与B中的第j个特征点最近的,并且B中的第j个特征点到A中的第i个特征点也是 
#NORM_L2: 归一化数组的(欧几里德距离),如果其他特征计算方法需要考虑不同的匹配计算方式
bf = cv2.BFMatcher(crossCheck=True)#一对一匹配
matches = bf.match(des1, des2)
matches = sorted(matches, key=lambda x: x.distance)  #img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches[0:10],None,flags=cv2.DRAW_MATCHES_FLAGS_DEFAULT)
cv_show('img3',img3)

sift.detectAndCompute()函数

keypoints, descriptors	=	cv.Feature2D.detectAndCompute(	
image, 
mask[, descriptors[, useProvidedKeypoints]]	)

检测关键点并计算描述符
返回关键点位置信息 keypoints,特征点向量descriptors

drawMatches函数:


drawMatches(img1, keypoints1, img2, keypoints2, matches1to2, outImg[, matchColor[, singlePointColor[, matchesMask[, flags]]]]) -> outImg 
/*
/*其中参数如下:
* img1 – 源图像1
* keypoints1 –源图像1的特征点.
* img2 – 源图像2.
* keypoints2 – 源图像2的特征点
* matches1to2 – 源图像1的特征点匹配源图像2的特征点[matches[i]] .
* outImg – 输出图像具体由flags决定.
* matchColor – 匹配的颜色(特征点和连线),若matchColor==Scalar::all(-1),颜色随机.
* singlePointColor – 单个点的颜色,即未配对的特征点,若matchColor==Scalar::all(-1),颜色随机.
matchesMask – Mask决定哪些点将被画出,若为空,则画出所有匹配点.
* flags – defined by DrawMatchesFlags.*/

其中DrawMatchesFlags的定义为:

struct DrawMatchesFlags{
        enum    {
    DEFAULT = 0, // 输出图像将被创建(Mat::create),// 只画出特征点,而不画出周围的circle包含特征点的大小和方向.DRAW_OVER_OUTIMG = 1, // 输出图像将被创建(using Mat::create),匹配点将被画在输出图像的内容上.NOT_DRAW_SINGLE_POINTS = 2, // 单个的点不画出.DRAW_RICH_KEYPOINTS = 4 // 对每个特征点周围的circle,包含特征点的大小和方向将被画出. };
};

flags=cv2.DRAW_MATCHES_FLAGS_DEFAULT效果:
在这里插入图片描述
flags=cv2.DrawMatchesFlags_DRAW_RICH_KEYPOINTS效果:
在这里插入图片描述

flags=cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS)效果:在这里插入图片描述
flags=cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG效果:
在这里插入图片描述
注意,使用cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG。需要创建一个img对象。
例如:


img3 = np.empty([img2.shape[0]+400,img2.shape[1]+400])  #注意大小!自己修改。
cv2.drawMatches(img1,kp1,img2,kp2,matches[0:10],img3,matchColor= (255,0,0),singlePointColor=(255,0,0),flags=cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG)
cv_show('img3',img3)
  相关解决方案