我正在处理其中包含对象的图像。我使用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)
有什么方法可以消除边缘上的关键点?举例回答将非常有帮助。谢谢。
您可以使用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,则该点有效。