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

时间:2017-10-25 06:53:25

标签: opencv python-3.6 opencv-contour

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

Input Image

我的问题是我必须在棕色盒子周围创建矩形,以便仅在盒子上进行操作。(这里的盒子只是样品,它可以是不同颜色,背景不同)。

我目前正在使用Canny进行边缘检测,使用cv2.findContour进行轮廓框检测,虽然它非常接近高度但是从背景创建混乱的宽度轮廓并添加到宽度中,如下所示:

Target Image

以下是我为此写的代码:

            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)

我是否可以遵循其他任何方法,如上所述,或修改某些部分以实现我在框周围创建矩形的任务。谢谢你提前。

1 个答案:

答案 0 :(得分:0)

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

首先将图像转换为HSV色彩空间并将其分段。使用以下轨迹栏代码找出正确的值 -

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.

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