如何在openCV中识别不完整的矩形

如何在openCV中识别不完整的矩形,第1张

如何在openCV中识别不完整的矩形

这可以使用诸如腐蚀和膨胀之类的形态学运算来解决。这两个 *** 作将有助于创建闭合的矩形。之后,您可以使用此页面上的教程来检测简单的形状,例如矩形。

我实现了一个快速演示,该演示适用于您提供的图像。


main.py:

import cv2import numpy as npfrom shapeDetector import ShapeDetectorimport imutilsimg = cv2.imread('t.png')kernel = np.ones((5,5),np.uint8)erosion = cv2.erode(img,kernel,iterations = 10)dilate = cv2.dilate(erosion,kernel,iterations = 10)

腐蚀会使所有线条变粗,因此要恢复正常宽度,我们需要在腐蚀后进行扩张。我建议对扩张 *** 作进行一次评论,以了解侵蚀的原理,反之亦然。

我使用的检测算法期望在黑色背景上出现白线。这就是为什么我们需要反转图像。

cv2.bitwise_not ( dilate, dilate )

之后,我们可以使用教程中的代码。

image = dilateresized = imutils.resize(image, width=300)ratio = image.shape[0] / float(resized.shape[0])# convert the resized image to grayscale, blur it slightly,# and threshold itgray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)blurred = cv2.GaussianBlur(gray, (5, 5), 0)thresh = cv2.threshold(blurred, 60, 255, cv2.THRESH_BINARY)[1]#thresh = dilate# find contours in the thresholded image and initialize the# shape detectorcnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,    cv2.CHAIN_APPROX_SIMPLE)cnts = cnts[0] if imutils.is_cv2() else cnts[1]sd = ShapeDetector()# loop over the contoursfor c in cnts:    # compute the center of the contour, then detect the name of the    # shape using only the contour    M = cv2.moments(c)    cX = int((M["m10"] / M["m00"]) * ratio)    cY = int((M["m01"] / M["m00"]) * ratio)    shape = sd.detect(c)    # multiply the contour (x, y)-coordinates by the resize ratio,    # then draw the contours and the name of the shape on the image    c = c.astype("float")    c *= ratio    c = c.astype("int")    cv2.drawContours(image, [c], -1, (0, 255, 0), 2)    cv2.putText(image, shape, (cX, cY), cv2.FONT_HERSHEY_SIMPLEX,        0.5, (255, 255, 255), 2)    # show the output image    cv2.imshow("Image", image)    cv2.waitKey(0)

shapeDetector.py:

# import the necessary packagesimport cv2class ShapeDetector:    def __init__(self):        pass    def detect(self, c):        # initialize the shape name and approximate the contour        shape = "unidentified"        peri = cv2.arcLength(c, True)        approx = cv2.approxPolyDP(c, 0.04 * peri, True)        # if the shape is a triangle, it will have 3 vertices        if len(approx) == 3: shape = "triangle"        # if the shape has 4 vertices, it is either a square or        # a rectangle        elif len(approx) == 4: # compute the bounding box of the contour and use the # bounding box to compute the aspect ratio (x, y, w, h) = cv2.boundingRect(approx) ar = w / float(h) # a square will have an aspect ratio that is approximately # equal to one, otherwise, the shape is a rectangle shape = "square" if ar >= 0.95 and ar <= 1.05 else "rectangle"        # if the shape is a pentagon, it will have 5 vertices        elif len(approx) == 5: shape = "pentagon"        # otherwise, we assume the shape is a circle        else: shape = "circle"        # return the name of the shape        return shape


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5667270.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存