我正在寻找一种使用Python中的OpenCV准确检测变形矩形的角的过程。
我已经通过谷歌搜索尝试了不同建议的解决方案,但是通过直线的正弦叠加(请参见阈值图像),我可能无法检测到拐角。到目前为止,我尝试过findContours和HoughLines,但效果不佳。不幸的是,我不理解how to find blur corner position with opencv?
中徐斌的C代码这是我的初始图像:
调整大小和阈值后,我应用精巧边缘检测以获取以下图像:
contours, hierarchy = cv2.findContours(g_mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
box = cv2.minAreaRect(contour)
box = cv2.cv.BoxPoints(box) if imutils.is_cv2() else cv2.boxPoints(box)
box = np.array(box, dtype="float")
box = perspective.order_points(box)
我只能通过一些额外的绘图获得以下结果:
我以为进行拟合将是解决问题的一种好方法,但是很遗憾,我无法使HoughLines正常工作,并且在查看OpenCV Python - How to implement RANSAC to detect straight lines?后,RANSAC似乎也很难解决我的问题。
非常感谢您的帮助。
要检测拐角,可以使用cv2.goodFeaturesToTrack()
。该函数有四个参数
cv2.goodFeaturesToTrack()
corners = cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance)
-输入8位或浮点32位灰度单通道图像image
-要返回的最大拐角数maxCorners
-0-1之间的最小可接受拐角质量等级。低于质量水平的所有角点均被拒绝]qualityLevel
-角之间的最小欧式距离现在我们知道如何找到角,我们必须找到旋转的矩形并应用该函数。这是一种方法:
我们首先放大图像,转换为灰度,应用双边滤波器,然后使用Otsu的阈值获得二进制图像
接下来,我们通过使用minDistance
查找轮廓来找到变形的矩形,然后获得以绿色突出显示的旋转边界框。我们将此边界框绘制到蒙版上
现在有了遮罩,我们只需使用cv2.findContours()
在遮罩上找到拐角
这是原始输入图像的结果以及每个角的cv2.goodFeaturesToTrack()
坐标
角点
(x, y)
代码
(377.0, 375.0)
(81.0, 344.0)
(400.0, 158.0)
(104.0, 127.0)