[英]Detect with noisy background/object - 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 進行物體檢測,但很難
首先要注意的是,拍照時有一些條件,比如光線條件和中等條件,如果你能控制它們,圖像處理部分的負載會減少。 例如在您的示例圖像中,您可以在背景中放置 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()
結果如下:
您可以使用輪廓並使用輪廓屬性刪除不需要的輪廓: 輪廓屬性
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.