【问题标题】:find closed contour for sample image using opencv使用opencv找到样本图像的闭合轮廓
【发布时间】:2017-10-25 06:53:25
【问题描述】:

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

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

我目前使用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 代码,您需要确保您的输入图像条件适合它的工作。
  • 是的,我也在考虑这一点,对于这个用例,考虑空白背景也会有所帮助,opencv中有什么方法可以提取只有矩形形状的轮廓..,或者我可以通过哪些方式将前景与背景分开?我也在考虑一些方法,只提取具有(+/- 10 度松弛)水平和垂直值的线,但没有通过搜索得到任何方法。

标签: opencv python-3.6 opencv-contour


【解决方案1】:

要使用简单的 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.

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

【讨论】:

    猜你喜欢
    • 2011-06-13
    • 2023-03-09
    • 2019-07-18
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    相关资源
    最近更新 更多