基于特征点的目标检测

欢迎访问我的博客首页。


基于特征点的目标检测

  • 1. 基于特征匹配的目标检测
  • 2. 参考

1. 基于特征匹配的目标检测


  目标检测引用广泛,但至今尚无通用的目标检测算法。因此我们可以针对特定场景设计满足需求的目标检测算法。当待检测的目标已知,而且只有尺度上的变化时,我们可以使用基于特征匹配的目标检测。下图左侧是待检测目标,中间是待检测图像,右侧是检测结果。即,从中间图像上检测左图,在右图上用四边形把检测到的区域框住。

基于特征点的目标检测_第1张图片

图 1 基于特征匹配的目标检测

  左图整个区域是一个矩形的待检测目标。因为我们将在左图整个区域提取特征与中图匹配,所以左图必须是矩形且没有多余的无关区域,否则需要裁剪。下面是算法:

# encoding=utf-8
import cv2
import numpy as np


def match_detect(path_src, path_ref):
    # 1. 读取图像。
    img_src = cv2.imread(path_src)
    img_ref = cv2.imread(path_ref, cv2.IMREAD_GRAYSCALE)
    # 2. 提取特征点。
    sift = cv2.xfeatures2d.SIFT_create()
    kp_src, des_src = sift.detectAndCompute(cv2.cvtColor(img_src, cv2.COLOR_RGB2GRAY), None)
    kp_ref, des_ref = sift.detectAndCompute(img_ref, None)
    # 3. 特征匹配。
    flann = cv2.FlannBasedMatcher(dict(algorithm=1, tree=5), dict(checks=50))
    matches = flann.knnMatch(des_ref, des_src, k=2)
    # 4. 筛选匹配。
    good = list()
    for m, n in matches:
        if m.distance < 0.65 * n.distance:
            good.append(m)
    if len(good) < 10:
        return
    # 5. 使用匹配点计算单应矩阵。
    pts_src = np.float32([kp_src[m.trainIdx].pt for m in good]).reshape(-1, 1, 2)
    pts_ref = np.float32([kp_ref[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)
    matrix, _ = cv2.findHomography(pts_ref, pts_src, cv2.RANSAC, 5.0)
    # 6. 利用透视变换由参考图像的四角坐标得到源图像上的对应坐标。坐标顺序(左上、左下、右下、右上)。
    h, w = img_ref.shape
    pts_corner = np.float32([[0, 0], [0, h - 1], [w - 1, h - 1], [w - 1, 0]]).reshape(-1, 1, 2)
    pts_roi = cv2.perspectiveTransform(pts_corner, matrix)
    # 7. 画出四边形。
    img_dst = cv2.polylines(img_src, [np.int32(pts_roi)], True, (0, 0, 255), 3, cv2.LINE_AA)
    return img_dst, np.squeeze(pts_roi).astype(np.int32)


if __name__ == '__main__':
    path2src = r"D:\src_TE42v2.PNG"
    path2ref = r"D:\ref_TE42v2.PNG"
    dst, _ = match_detect(path2src, path2ref)
    cv2.imwrite(r"D:\dst_TE42v2.PNG", dst)
    cv2.waitKey(0)

  该匹配检测算法从左图和中图检测特征点并进行特征匹配,然后计算单应矩阵,再根据单应矩阵求左图的四角坐标在中图上的对应坐标。所求得的对应坐标即为检测结果。

  该算法用了 opencv-python==4.7.0.68 和 opencv-contrib-python==4.7.0.68。

2. 参考


  1. 模板匹配,博客园,2022。

你可能感兴趣的:(Pythons,目标检测,计算机视觉)