【OpenCV-Python】30.OpenCV的特征检测——对象查找

30.OpenCV的特征检测——对象查找



前言

  经过特征匹配后,可找到查询图像在训练图像中的最佳匹配,从而可在训练图像中精确查找到查询图像。


一、对象查找

获得最佳匹配结果后,调用cv2.findHomography()函数执行查询图像和训练图像的透视转换,在调用cv2.perspectiveTransform()函数执行向量的透视矩阵转换,可获取查询图像在训练图像中的位置。
  OpenCV的cv2.findHomography()函数的基本格式如下:

retv, mask = cv2.findHomography(srcPoints, dstPoint[, method[, ransacReporjThreshold]])

retv为返回的转换矩阵
mask为返回的查询图像在训练图像中的最佳匹配结果掩膜
srcPoints为查询图像匹配结果的坐标
dstPoint为训练图像匹配结果的坐标
method为用于计算透视转换矩阵的方法
ransacReporjThreshold为可允许的最大重投影误差

  OpenCV的cv2.perspectiveTransform()函数的基本格式如下:

dst = cv2.perspectiveTransform(src, m)

dst为输出结果数组, 大小和类型与src相同
src为输入的2通道或3通道浮点类型数组
m是大小为3*34*4的浮点类型的转换矩阵, 如使用v2.findHomography()函数返回的转换矩阵
# 对象查找
import cv2
import numpy as np

img1 = cv2.imread("XIAN1.jpg" )
img2 = cv2.imread("XIAN2.jpg" )

orb = cv2.ORB_create()
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)
bf = cv2.BFMatcher_create(cv2.NORM_HAMMING, crossCheck = True)
ms = bf.match(des1,des2)
ms = sorted(ms, key = lambda x:x.distance)
matchesMask = None
if len(ms) > 10:
    # 计算查询图像匹配结果的坐标
    querypts = np.float32([kp1[m.queryIdx].pt for m in ms]).reshape(-1,1,2)
    # 计算训练图像匹配结果的坐标
    trainpts = np.float32([kp2[m.trainIdx].pt for m in ms]).reshape(-1,1,2)
    # 执行查询图像和训练图像的透视转换
    retv, mask = cv2.findHomography(querypts, trainpts, cv2.RANSAC)
    # 计算最佳匹配结果的掩膜,用于绘制匹配匹配结果
    matchesMask = mask.ravel().tolist()
    h, w, c = img1.shape
    pts = np.float32([[0,0], [0,h-1], [w-1,h-1], [w-1,0]]).reshape(-1,1,2)
    # 执行向量的透视矩阵转换,获得查询图像在训练图像中的位置
    dst = cv2.perspectiveTransform(pts,retv)
    # 用白色的矩形在训练图像中绘制出查询图像的范围
    img2 = cv2.polylines(img2, [np.int32(dst)], True, (255,255,255),5)
    
img3 = cv2.drawMatches(img1, kp1, img2, kp2, ms, None,
                       matchColor = (0,255,0),
                       singlePointColor = (255,0,0),
                       matchesMask = matchesMask,
                       flags = cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv2.cv2.namedWindow("Result img", cv2.WINDOW_NORMAL)
cv2.imshow("Result img",img3)
cv2.waitKey(0)
cv2.destroyAllWindows()

请添加图片描述


二、OpenCV-Python资源下载

OpenCV-Python测试用图片、中文官方文档、opencv-4.5.4源码


总结

  以上内容介绍了OpenCV-Python特征检测中的对象查找,有关Python、数据科学、人工智能等文章后续会不定期发布,请大家多多关注,一键三连哟(●’◡’●)。

おすすめ

転載: blog.csdn.net/weixin_43843069/article/details/122254358