簡體   English   中英

檢測嘈雜的背景/對象 - OpenCV

[英]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()

結果如下:

索貝爾 變形1 變形2

您可以使用輪廓並使用輪廓屬性刪除不需要的輪廓: 輪廓屬性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM