基于OpenCV的斜角点检测

基于OpenCV的斜角点检测,opencv,Opencv,我想检测带有斜角的“扭曲矩形”形状的角。我已经尝试了cv2.cornerHarris()和cv2.goodFeaturesToTrack(),但我无法让他们可靠地检测到顶部的两个角-他们还沿着边缘拾取了一些点cv2.approxPolyDP()有时也适用于不总是与此处角重合的四边形。有没有更可靠的方法 我的直觉是发现沿着轮廓的相邻边之间的角度发生突变,但我不确定在这里如何做,因为此形状的轮廓或外壳由许多短边组成,因此角度计算不正确(它们在像素级显示为“大”)。理想的做法是以某种方式“平滑”曲线,

我想检测带有斜角的“扭曲矩形”形状的角。我已经尝试了
cv2.cornerHarris()
cv2.goodFeaturesToTrack()
,但我无法让他们可靠地检测到顶部的两个角-他们还沿着边缘拾取了一些点
cv2.approxPolyDP()
有时也适用于不总是与此处角重合的四边形。有没有更可靠的方法

我的直觉是发现沿着轮廓的相邻边之间的角度发生突变,但我不确定在这里如何做,因为此形状的轮廓或外壳由许多短边组成,因此角度计算不正确(它们在像素级显示为“大”)。理想的做法是以某种方式“平滑”曲线,以便它能够拾取角度的“宏观”变化,如果这有意义的话

编辑:目前,我终于能够用
cv2.approxPolyDP()
解决这个问题。关键是使用迭代程序选择其
epsilon
参数的值:

# pick the contour with the largest area (only needed in my case)
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours.sort(key=cv2.contourArea)
cnt = contours[-1]

# find the smallest epsilon that generates a quadrilateral
epsilon = 0
epsilon_inc = 0.001
corners = cnt
cnt_len = cv2.arcLength(cnt, True)
while len(corners) > 4:
    epsilon += epsilon_inc
    corners = cv2.approxPolyDP(cnt, epsilon * cnt_len, True)
虽然这并不是如前所述在所有情况下都有效,但至少它在这个特定设置中比其他两种方法更可靠。如果你还有其他想法,我很高兴听到