我正在尝试检测卡,但问题是有时图像质量不佳且具有多个背景,例如:
不能很好地定义边缘
![没有很好地定义边缘] [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进行对象检测,但是很难
答案 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()
结果如下:
您可以使用轮廓,并使用轮廓属性:Contour Properties
删除不需要的轮廓