OpenCV:检测有缺陷的矩形

时间:2017-03-07 23:17:59

标签: opencv

目前我正在开展一个项目,我尝试使用OpenCV( Python ,Java或C ++)在照片中找到矩形表面的角落

我通过过滤颜色选择了所需的表面,然后我有掩码并将其传递给cv2.findContours

cnts, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnt = sorted(cnts, key = cv2.contourArea, reverse = True)[0]
peri = cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, 0.02*peri, True)
if len(approx) == 4:
    cv2.drawContours(mask, [approx], -1, (255, 0, 0), 2)

这给我一个不准确的结果: findContours result

使用cv2.HoughLines我设法得到4条准确描述曲面的直线。他们的交叉点正是我所需要的:

edged = cv2.Canny(mask, 10, 200)
hLines = cv2.HoughLines(edged, 2, np.pi/180, 200)
lines = []
for rho,theta in hLines[0]:
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a*rho
    y0 = b*rho
    x1 = int(x0 + 1000*(-b))
    y1 = int(y0 + 1000*(a))
    x2 = int(x0 - 1000*(-b))
    y2 = int(y0 - 1000*(a))
    cv2.line(mask, (x1,y1), (x2,y2), (255, 0, 0), 2)
    lines.append([[x1,y1],[x2,y2]])

HoughLines result

问题是:是否有可能以某种方式调整findContours

另一种解决方案是找到交叉点的坐标。欢迎使用这种方法的任何线索:)

有人能给我一个如何解决这个问题的提示吗?

1 个答案:

答案 0 :(得分:-1)

可以:

  1. 选择最长轮廓
  2. 将其分成若干段并按渐变分组
  3. 适合最大的四组
  4. 查找交叉点
  5. 然而,Hough变换几乎完全相同。是否有任何特殊原因不使用它?

    线的交点非常容易计算。高中坐标几何课程可以为您提供算法。