【问题标题】:Rectangle detection on game board with opencv python使用opencv python在游戏板上进行矩形检测
【发布时间】:2017-12-02 13:11:26
【问题描述】:

我是使用 python 的 opencv 新手,所以请多多包涵。 我有一个托盘,上面有不同大小的圆圈,如链接中所示。 https://is.alicdn.com/img/pb/810/421/429/429421810_364.jpg 这不是我拥有的实际图像,但它与上面的图像非常相似。 我必须检测图像中的托盘并找到托盘中所有孔(圆圈)的轮廓。托盘可能会倾斜,具体取决于拍摄图像的用户。 到目前为止,我在图像上使用了高斯模糊和 Canny 边缘检测,并填补了 Canny 边缘检测中的空白。这是 Canny 边缘检测后的图像 这是形态学后的图像。 然后我使用 findcontours 并尝试找到具有 4 个顶点的最大轮廓,理想情况下是托盘本身。 轮廓检测只能识别左侧垂直边界和顶部水平边界。它无法识别托盘的 4 个边缘。

这是我目前的代码:

import numpy as np
import cv2
import matplotlib.pyplot as plt

image = cv2.imread("img.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = cv2.GaussianBlur(image, (3, 3), 0)
image_canny = cv2.Canny(image, 30, 200)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
gaps_closed = cv2.morphologyEx(image_canny, cv2.MORPH_CLOSE, kernel)
_, contours, _= cv2.findContours(gaps_closed.copy(), cv2.RETR_TREE, 
cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours, key = cv2.contourArea, reverse = True)
[:5]
Cnt = None
for c in contours:
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.04 * peri, True)

    if len(approx) == 4:
        Cnt = approx
        break

cv2.drawContours(image, [Cnt], -1, (0, 255, 0), 4)
plt.imshow(image)
plt.show()

【问题讨论】:

  • Canny和形态学运算后可以附加当前输出吗?
  • @ZdaR : 添加图片。

标签: python opencv canny-operator


【解决方案1】:

调整 cv2.canny 的参数应该可以更容易地检测托盘的边缘。但是,使用 cv2.HoughLines 可能是检测托盘的更好方法,因为 HoughLines 并不要求检测到完整的边缘。

【讨论】:

    【解决方案2】:

    对输入执行直方图均衡应该可以提高图像的对比度。这将改善图像中的边缘检测。

    由于图像中的孔看起来很小,形态学操作可能不是要走的路。这会掩盖这些孔洞,您可能无法将它们取回。

    Opencv 实现了霍夫圆变换。这是一个示例的 Python 教程:http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_houghcircles/py_houghcircles.html。使用它应该可以解决您的问题。

    如果这不起作用,发布您的实际输入图像会有所帮助

    【讨论】:

      猜你喜欢
      • 2017-11-15
      • 2019-02-25
      • 2014-03-28
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 2016-12-09
      • 2018-05-03
      • 2012-04-10
      相关资源
      最近更新 更多