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

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

mport cv2
import numpy as np

img1 = 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)
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值