使用Python识别平面图中的门形状

时间:2020-06-22 13:18:11

标签: python opencv

以下代码试图识别平面图图像中的门形状 它可以检测某些形状,但不能检测所有形状。 在其他带有门形状的图像中,单线容易被检测到,但带有双线形状的图像无法识别。 谁能帮我

recognized shapes

 import cv2    
    img = cv2.imread('1.jpg')
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # convert to binary image
    thresh=cv2.threshold(gray, 190, 255, cv2.THRESH_BINARY )[1]
    #  Morphological reconstruction (delete labels)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (8,8))
    kernel2 = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
    marker = cv2.dilate(thresh,kernel,iterations = 1)
    while True:
        tmp=marker.copy()
        marker=cv2.erode(marker, kernel2)
        marker=cv2.max(thresh, marker)
        difference = cv2.subtract(tmp, marker)
        if cv2.countNonZero(difference) == 0:
            break
    marker = cv2.erode(marker,kernel2,iterations = 1)
    cv2.imwrite('marker.png', marker)
    # only walls
    grad_x = cv2.Sobel(marker, cv2.CV_8U, 1, 0, ksize=3, scale=1, delta=0, borderType=cv2.BORDER_DEFAULT)
    grad_x = cv2.dilate(grad_x,kernel2,iterations = 1)
    grad_y = cv2.Sobel(marker, cv2.CV_8U, 0, 1, ksize=3, scale=1, delta=0, borderType=cv2.BORDER_DEFAULT)
    grad_y = cv2.dilate(grad_y,kernel2,iterations = 1)
    grad=cv2.bitwise_and(grad_x, grad_y)
    output = cv2.connectedComponentsWithStats(grad, 4, cv2.CV_32S)
    num_labels = output[0]
    labels = output[1]
    stats=output[2]
    centroids = output[3]
    for i in range(num_labels):
        left,top,width,height,area=stats[i]
        if width>30 or height>30:
             cv2.rectangle(img,(left, top), (left+width, top+height), (0,0,255))
             print(stats[i])
    cv2.imwrite('out.png', img)

0 个答案:

没有答案
相关问题