使用opencv查找样本图像的闭合轮廓

find closed contour for sample image using opencv

我在为我的图像找到闭合轮廓框时遇到问题:

我的问题是我必须围绕棕色框创建矩形,以便仅对框执行操作。 (这里的方框只是一个例子,可以是不同的颜色,不同的背景)

我目前使用 Canny 进行边缘检测,cv2.findContour 进行轮廓框检测,虽然它的高度非常接近,但对于来自背景的宽度轮廓会造成混乱并尽可能地添加到宽度中如下所示:

下面是我为此编写的代码:

            import cv2
            import imutils

            img = cv2.imread(img)
            image = imutils.resize(img, width=600)
            gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
            edged = cv2.Canny(gray, 15, 200,True)
            edged = cv2.dilate(edged, None, iterations=2)
            edged = cv2.erode(edged, None, iterations=2)
            
            edged = 255-edged
            cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
            cnts = cnts[0] if imutils.is_cv2() else cnts[1]
            
            for c in cnts:
                # if the contour is not sufficiently large, ignore it
                if cv2.contourArea(c) < 300:
                    continue
                orig = image.copy()
                
                x,y,w,h = cv2.boundingRect(c)
                cv2.rectangle(orig,(x,y),(x+w,y+h),(0,255,255),2)
                cv2.drawContours(orig, c, -1, (255, 255, 0), 3)
                
                # show the output image
                cv2.imshow("Image", orig)
                cv2.waitKey(0)

是否有任何其他方法可以像上面一样简单或修改某些部分来完成围绕框创建矩形的任务?

要使用简单的 OpenCV 函数来检测框,您必须确保输入图像条件是理想的。喜欢盒子等不同的背景颜色

先将图片转成HSV颜色space,然后分割出方框。使用以下 trackbar 代码找出正确的值 -

import cv2
import numpy as np

def nothing(x):
    pass

cap = cv2.VideoCapture(0)
cv2.namedWindow('img')


cv2.createTrackbar('lH','img',0,255,nothing)
cv2.createTrackbar('hH','img',255,255,nothing)

cv2.createTrackbar('lS','img',0,255,nothing)
cv2.createTrackbar('hS','img',255,255,nothing)

cv2.createTrackbar('lV','img',0,255,nothing)
cv2.createTrackbar('hV','img',255,255,nothing)



while(True):

    ret,frame = cap.read()

    l_H = cv2.getTrackbarPos('lH', 'img')
    h_H = cv2.getTrackbarPos('hH', 'img')
    l_S = cv2.getTrackbarPos('lS', 'img')
    h_S = cv2.getTrackbarPos('hS', 'img')
    l_V = cv2.getTrackbarPos('lV', 'img')
    h_V = cv2.getTrackbarPos('hV', 'img')

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    lower_hsv = np.array([l_H, l_S, l_V])
    higher_hsv = np.array([h_H, h_S, h_V])

    mask = cv2.inRange(hsv, lower_hsv, higher_hsv)

    frame = cv2.bitwise_and(frame, frame, mask=mask)

    cv2.imshow('image', mask)
    if(cv2.waitKey(10)==27):break

如果需要,执行形态学操作。如果您的背景不同,只需找到轮廓和边界框即可找到框。

如果没有,你可以找到这个link中的横线和竖线。

要在图像中查找多边形,check this.

您可以使用这些的适当组合来找到您的盒子。