从对象边缘删除关键点

问题描述 投票:-1回答:1

我正在处理其中包含对象的图像。我使用canny边缘检测和轮廓来检测和绘制其中对象的边缘。然后,我同时使用SIFT和SURF来检测对象中的关键点。这是我一直在努力的示例代码。

import cv2 as cv
import numpy as np 
import matplotlib.pyplot as plt
img = cv.imread(image)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray, 100,200)
image, contours, hierarchy = cv.findContours(edges, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
outimg = cv.drawContours(img, contours, -1, (0,255,0), 3)
sift = cv.xfeatures2d_SIFT.create()
kp, des = sift.detectAndCompute(outimg,None)

有什么方法可以消除边缘上的关键点?举例回答将非常有帮助。谢谢。

Original Imageoutput image

python opencv sift surf keypoint
1个回答
0
投票

您可以使用pointPolygonTest方法来过滤检测到的关键点。将检测到的轮廓用作边界多边形。您还可以定义所需的边距。

示例(四点轮廓):

def inside_point(self, point, rect):

        # point is a list (x, y)
        # rect is a contour with shape [4, 2]

        rect = rect.reshape([4, 1, 2]).astype(np.int64)

        dist = cv2.pointPolygonTest(rect,(point[0], point[1]),True)

        if dist>=0:
            # print(dist)
            return True
        else:
            return False 

您还可以在蒙版图像上绘制轮廓,并检查该点是否在轮廓内,只需检查具有点坐标的像素值,如果它不为0,则该点有效。

© www.soinside.com 2019 - 2024. All rights reserved.