使用嘈杂的背景/物体进行检测-OpenCV

时间:2019-08-22 10:04:50

标签: python opencv

我正在尝试检测卡,但问题是有时图像质量不佳且具有多个背景,例如:

不能很好地定义边缘

![没有很好地定义边缘] [1]

示例背景

![示例背景] [2]

我这样做了:

gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray,(11,11),0)

edg = cv2.Canny(gray, 10, 20)
contours,_ = cv2.findContours(edg.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cv2.drawContours(image,contours,-1,[0,255,0],2)

cv2.imshow('image',image)
cv2.waitKey(0)

但是有时他会发现其他东西,而不是卡片。任何人都有想法如何解决这个问题? 我已经尝试过用YOLO进行对象检测,但是很难

1 个答案:

答案 0 :(得分:1)

首先,请注意,在拍摄照片时会遇到一些情况,例如光照条件和中等条件,如果可以控制它们,则图像处理部分的负载会减少。例如,在示例图像中,您可以在背景中放入A4白皮书以减少较小的轮廓,以此类推(当然,无法更改条件)。

好吧,我尝试使用以下代码在您的测试图像上:

import cv2

rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (8, 8))
sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (17, 17))

img = cv2.imread('edge.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)


gradX = cv2.Sobel(gray, ddepth=cv2.CV_32F, dx=1, dy=0,
    ksize=-1)

morph1 = cv2.morphologyEx(gradX, cv2.MORPH_OPEN, rectKernel)
morph2 = cv2.morphologyEx(morph1, cv2.MORPH_CLOSE, sqKernel)


cv2.imshow("img",img)
cv2.imshow("gradx",gradX)
cv2.imshow("tophat",morph1)
cv2.imshow("tophat2",morph2)
cv2.waitKey()

结果如下:

Sobel morph1 morph2

您可以使用轮廓,并使用轮廓属性:Contour Properties

删除不需要的轮廓