【问题标题】:Detecting boxes from an image using opencv使用opencv从图像中检测框
【发布时间】:2018-08-13 09:04:39
【问题描述】:

我需要使用opencv 在以下图像中查找框。我曾尝试使用 mser,但没有得到任何好的结果。

我的 MSER 代码:

mser = cv2.MSER_create()
img = cv2.imread('Lines.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
I = img.copy()
regions, _ = mser.detectRegions(I)
hulls = [cv2.convexHull(p.reshape(-1, 1, 2)) for p in regions]
mask = np.zeros((img.shape[0], img.shape[1], 1), dtype=np.uint8)
c=0
points=[]
for contour in hulls:
    [x, y, w, h] = cv2.boundingRect(contour)
    if w < 50 or h < 8 or w>120:
        continue
    c=c+1
    cv2.rectangle(I, (x, y), (x + w, y + h), (255, 0, 255), 0)
plt.figure(1,figsize=(100, 50))
plt.imshow(I)

MSER 的结果:

【问题讨论】:

  • 既然你已经有一个二值图像,我会尝试cv::findContours 并只保留可以简化的轮廓,例如Douglas-Peucker 算法使用 4 个点。我有一个代码,但仅限于 C++。
  • 在python中可以使用cv2.findContours函数

标签: python opencv image-processing deep-learning computer-vision


【解决方案1】:

您可以对图像进行阈值处理并反转您的白色和黑色像素,以便您的框是用黑线分隔的白色:

然后您可以使用cv2.findContours() 搜索您的轮廓,然后仅绘制符合您尺寸标准的轮廓。您可以使用cv2.contourArea() 获取轮廓的大小。那些轮廓就是你的盒子。干杯!

示例代码:

import cv2

img = cv2.imread('table.png')
resize = cv2.resize(img, None, fx=0.3, fy=0.3, interpolation = cv2.INTER_CUBIC)
gray = cv2.cvtColor(resize, cv2.COLOR_BGR2GRAY)
_,thresh = cv2.threshold(gray,50,255,cv2.THRESH_BINARY_INV)
_, contours, _ = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

for cnt in contours:
    size = cv2.contourArea(cnt)
    if 100 < size < 30000:
        cv2.drawContours(resize, [cnt], 0, (0,255,0), 1)

cv2.imshow('img', resize)

结果:

【讨论】:

    【解决方案2】:

    由于您的输入图像是倒置的,因此请使用“dilate”和合适的结构元素来放大极值区域,然后应用 MSER。

    【讨论】:

      【解决方案3】:

      您可以使用 opencv 提供的cv2.findContours() 函数。您可以通过here 使用他们的教程来了解更多信息。干杯。

      【讨论】:

        【解决方案4】:

        我认为您可以使用像素模式来识别框。作为示例,遍历图像中的每个像素,当你得到一个白色像素时,然后找出 x 轴和 y 轴上的下一个像素颜色。如果两者都是白色,则将该像素视为框的第一个像素。然后取 x 轴的下一个像素并找到 y 轴像素。如果它是白色的,那么你可以到达盒子的另一个角落。如果像素不是白色,则考虑下一个 x 轴像素。当你在角落时,找到下一个 y 轴像素,直到你到达角落。当您在第三个角落时,请考虑前一个 x 像素。然后找到前一个 x 像素,直到到达第四个角。然后您可以通过四个角的像素坐标保存框。我认为这更准确。但它既费时又复杂。但它可能是新算法。 (这仅在框是直线时才有效)

        【讨论】:

          猜你喜欢
          • 2021-08-30
          • 2021-10-04
          • 2013-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-14
          • 2013-01-14
          • 2016-03-28
          相关资源
          最近更新 更多