繁体   English   中英

使用OpenCV检测图像中的盒子

[英]Detecting boxes from an image using opencv

我需要使用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的结果: MSER的结果

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

由于您的输入图像是反转的,因此请使用带有适当结构元素的“膨胀”来放大末端区域,然后应用MSER。

您可以设置图像阈值并反转白色和黑色像素,以便将框用黑线用白色分隔:

在此处输入图片说明

然后,您可以使用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)

结果:

在此处输入图片说明

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM