我在为我的图像找到闭合的轮廓框时遇到问题:
我的问题是我必须在棕色盒子周围创建矩形,以便仅在盒子上进行操作。(这里的盒子只是样品,它可以是不同颜色,背景不同)。
我目前正在使用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)
我是否可以遵循其他任何方法,如上所述,或修改某些部分以实现我在框周围创建矩形的任务。谢谢你提前。
答案 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.
您可以使用这些的正确组合来找到您的盒子。