简体   繁体   English

如何检测给定图像中的所有矩形框

[英]how to detect all the rectangular boxes in the given image

I tried to detect all the rectangles in image using threshold, canny edge and applied contour detection but it was not able to detect all the rectangles. 我尝试使用阈值,轮廓边缘和应用轮廓检测​​来检测图像中的所有矩形,但无法检测到所有矩形。 Finally, I thought of detect the same using hough transforms but when I tried to detect lines in image, I'm getting all the lines. 最终,我想到了使用hough变换检测相同的东西,但是当我尝试检测图像中的线条时,我得到了所有线条。 I need to detect only rectangular boxes in the image. 我只需要检测图像中的矩形框。 Can someone help me? 有人能帮我吗? I'm new to opencv. 我是opencv的新手。

Input image 输入图像

输入图像

Code: 码:

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

img =  cv2.imread("demo-hand-written.png",-1)
#img = cv2.resize(img,(1280,720))
edges = cv2.Canny(img,180,200)
kernel = np.ones((2,2),np.uint8)
d = cv2.dilate(edges,kernel,iterations = 2)
e = cv2.erode(img,kernel,iterations = 2)  
#ret, th = cv2.threshold(img, 220, 255, cv2.THRESH_BINARY_INV)

lines = cv2.HoughLinesP(edges,1,np.pi/180,30, maxLineGap=20,minLineLength=30)
for line in lines:
    #print(line)
    x1,y1,x2,y2 = line[0]
    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),3)
cv2.imshow("image",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

You can use below code as a starting point. 您可以使用以下代码作为起点。

img =  cv2.imread('demo-hand-written.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

thresh_inv = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)[1]

# Blur the image
blur = cv2.GaussianBlur(thresh_inv,(1,1),0)

thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]

# find contours
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]

mask = np.ones(img.shape[:2], dtype="uint8") * 255
for c in contours:
    # get the bounding rect
    x, y, w, h = cv2.boundingRect(c)
    if w*h>1000:
        cv2.rectangle(mask, (x, y), (x+w, y+h), (0, 0, 255), -1)

res_final = cv2.bitwise_and(img, img, mask=cv2.bitwise_not(mask))

cv2.imshow("boxes", mask)
cv2.imshow("final image", res_final)
cv2.waitKey(0)
cv2.destroyAllWindows()

Output: 输出:

Figure 1 : Detected rectangular boxes in the above image 图1上图中检测到的矩形框

在此处输入图片说明

Figure 2 : Detected rectangular contours in the original image 图2 :原始图像中检测到的矩形轮廓

在此处输入图片说明

Suggestion: 建议:

Using Hough, detect the horizontal lines. 使用霍夫,检测水平线。 Then take every line in turn and consider a window as large as the line and with a short height. 然后依次走每一行,并考虑与该行一样大且高度较短的窗口。 Use Hough to detect the verticals in this window. 使用Hough在此窗口中检测垂直。 This will give you candidate corners. 这将为您提供候选角。 (You can also try one window above the line and one below.) (您也可以在行上方尝试一个窗口,然后在下方尝试一个窗口。)

Then by some additional local processing (?), confirm that the candidates are really box corners, and find the corner orientation. 然后通过一些附加的本地处理(?),确认候选对象确实是矩形角,并找到角方向。 In the end, you should be able to join the corners in a way that makes sense geometrically? 最后,您应该能够以几何上有意义的方式连接角点?

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

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