首页 > 解决方案 > 检测嘈杂的背景/对象 - 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 进行物体检测,但很难

标签: pythonopencv

解决方案


首先,请注意,拍照时有一些条件,如光线条件和中等条件,如果你能控制它们,图像处理部分的负载就会降低。例如在您的示例图像中,您可以将 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()

这是结果:

索贝尔 变形1 变形2

您可以使用轮廓并使用轮廓属性删除不需要的轮廓:轮廓属性


推荐阅读