![](/img/trans.png)
[英]How to identify if the shapes of an image are symmetric or asymmetric using opencv - python?
[英]Finding shapes in an image using opencv
我正在嘗試使用OpenCV在圖像中查找形狀。 我知道我想要匹配的形狀(有一些我不知道的形狀,但我不需要找到它們)和它們的方向。 我不知道他們的尺寸(規模)和位置。
我目前的做法:
如果這種方法沒有取消,那就是形狀觸及的地方。 輪廓檢測將兩個相鄰的形狀作為單個輪廓(單個邊界框)拾取。 匹配步驟顯然會失敗。
有沒有辦法修改我的方法來分別處理相鄰的形狀? 此外,還有更好的方法來執行第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.