簡體   English   中英

使用opencv在圖像中查找形狀

[英]Finding shapes in an image using opencv

我正在嘗試使用OpenCV在圖像中查找形狀。 我知道我想要匹配的形狀(有一些我不知道的形狀,但我不需要找到它們)和它們的方向。 我不知道他們的尺寸(規模)和位置。

我目前的做法:

  1. 檢測輪廓
  2. 對於每個輪廓,計算最大邊界框
  3. 將每個邊界框分別與一個已知形狀匹配。 在我的實際項目中,我將區域縮放到模板大小並計算Sobel梯度的差異,但對於此演示,我只是使用寬高比。

如果這種方法沒有取消,那就是形狀觸及的地方。 輪廓檢測將兩個相鄰的形狀作為單個輪廓(單個邊界框)拾取。 匹配步驟顯然會失敗。

有沒有辦法修改我的方法來分別處理相鄰的形狀? 此外,還有更好的方法來執行第3步嗎?

例如:(Es為綠色,Y為藍色)

在此輸入圖像描述

失敗的情況:(未知的形狀為紅色)

在此輸入圖像描述

源代碼:

import cv
import sys
E = cv.LoadImage('e.png')
E_ratio = float(E.width)/E.height
Y = cv.LoadImage('y.png')
Y_ratio = float(Y.width)/Y.height
EPSILON = 0.1

im = cv.LoadImage(sys.argv[1], cv.CV_LOAD_IMAGE_GRAYSCALE)
storage = cv.CreateMemStorage(0)
seq = cv.FindContours(im, storage, cv.CV_RETR_EXTERNAL, 
        cv.CV_CHAIN_APPROX_SIMPLE)
regions = []
while seq:
    pts = [ pt for pt in seq ]
    x, y = zip(*pts)    
    min_x, min_y = min(x), min(y)
    width, height = max(x) - min_x + 1, max(y) - min_y + 1
    regions.append((min_x, min_y, width, height))
    seq = seq.h_next()

rgb = cv.LoadImage(sys.argv[1], cv.CV_LOAD_IMAGE_COLOR)
for x,y,width,height in regions:
    pt1 = x,y
    pt2 = x+width,y+height
    if abs(float(width)/height - E_ratio) < EPSILON:
        color = (0,255,0,0)
    elif abs(float(width)/height - Y_ratio) < EPSILON:
        color = (255,0,0,0)
    else:
        color = (0,0,255,0)
    cv.Rectangle(rgb, pt1, pt2, color, 2)

cv.ShowImage('rgb', rgb)
cv.WaitKey(0)

e.png:

在此輸入圖像描述

y.png:

在此輸入圖像描述

好:

在此輸入圖像描述

壞:

在此輸入圖像描述

在任何人問之前,不,我打算破解驗證碼:) OCR本身並不真正相關:我真實項目中的實際形狀不是字符 - 我只是懶惰,字符是最容易繪制的東西(仍然可以通過簡單的方法檢測到)。

由於您的形狀可以在大小和比例上有所不同,您應該查看縮放不變描述符。 一堆這樣的描述符對於您的應用程序來說是完美的。

在測試模板上處理這些描述符,然后使用某種簡單的分類來提取它們。 當你展示時,它應該用簡單的形狀給出相當好的結果。

我過去曾使用Zernike和Hu的時刻,后者是最着名的。 您可以在此處找到實施示例: http//www.lengrand.fr/2011/11/classification-hu-and-zernike-moments-matlab/

另一件事:鑒於你的問題,你應該看看OCR技術(代表光學字符識別: http//en.wikipedia.org/wiki/Optical_character_recognition ;))。

希望這個對你有幫助。

朱利安

您是否嘗試使用CCH作為描述符進行倒角匹配或輪廓匹配(對應)。

倒角匹配使用目標圖像和模板輪廓的距離變換。 不完全是規模不變但快速。

后者相當慢,因為二分類匹配問題的復雜性至少是二次的。 另一方面,這種方法對於縮放,旋轉和可能的局部失真是不變的(對於近似匹配,恕我直言,這對於上面的壞例子是好的)。

暫無
暫無

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

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