這是讓你開始的東西。當跳入新問題時,我並沒有看到很多複雜的步驟,因爲它們可以在某個地方使用。所以我的重點是使用相對簡單的東西,這會在更多不同的情況下失敗,但希望你會看到它的價值,並對問題有所瞭解。
該方法完全基於角點檢測;這種檢測的兩種典型方法是哈里斯檢測器或由Shi和Tomasi在1994年的文章「良好特徵追蹤」中所描述的檢測方法。我將使用第二種檢測方法,這是因爲在OpenCV,較新的Matlab,並可能有很多其他地方。它在這些軟件包上的實現還允許更方便地調整參數,關於拐角質量和拐角之間的最小距離。所以,假設你可以正確地檢測所有的角點,你如何測量一個形狀與另一個形狀的接近程度?圖像具有任意大小,所以我的想法是將點座標標準化到範圍[0,1]。這解決了根據原始描述需要的縮放問題。現在我們必須比較[0,1]範圍內的點集。在這裏,我們走最簡單的事情:考慮形狀a
形狀p
一個點,形狀b
最接近的點是什麼?我們假設這是一個最小的絕對差值在p
與b
中的任意一點之間。如果我們總結所有的值,我們會得到形狀之間的得分。分數越低,形狀越相似(根據這種方法)。
下面是一些形狀,我畫:
這裏是檢測的角點:
正如你在這最後一組圖像中可以清楚地看到的那樣,該方法很容易將一個矩形/正方形與圓柱混淆。爲了處理這個問題,您需要將該方法與其他描述符結合使用。最初,您可能會考慮的一個簡單問題是形狀面積與邊界框面積之間的比率(這將使矩形爲1,圓柱體爲較低)。使用上述方法,這裏分別是第一和第二形狀,第一和第三形狀,......之間的測量值:0.02358485,0.41350339,0.30128458 0.4980852,0.18031262。第二個立方體是第一個立方體的縮放版本,正如您所看到的,它們與此度量標準非常相似。最後一個形狀是第一個立方體的調整大小版本,但沒有保持縱橫比,並且該度量標準給出了更高的差異。
如果你想執行這個代碼玩,這裏是(在Python,取決於OpenCV的,numpy的):
import sys
import cv2 as cv
import numpy
inp = []
for fname in sys.argv[1:]:
img_color = cv.imread(fname)
img = cv.cvtColor(img_color, cv.COLOR_RGB2GRAY)
inp.append((img_color, img))
ptsets = []
# Corner detection parameters.
params = (
200, # max number of corners
0.01, # minimum quality level of corners
10, # minimum distance between corners
)
# Params for visual circle markers.
circle_radii = 3
circle_color = (255, 0, 0)
for i, (img_color, img) in enumerate(inp):
height, width = img.shape
cornerMap = cv.goodFeaturesToTrack(img, *params)
corner = numpy.array([c[0] for c in cornerMap])
for c in corner:
cv.circle(img_color, tuple(c), circle_radii, circle_color, -1)
# Just to visually check for correct corners.
cv.imwrite('temp_%d.png' % i, img_color)
# Convert corner coordinates to [0, 1]
cornerUnity = (corner - corner.min())/(corner.max() - corner.min())
# You might want to use other descriptors here. XXX
ptsets.append(cornerUnity)
def compare_ptsets(p):
res = numpy.zeros(len(p))
base = p[0]
for i in xrange(1, len(p)):
sum_min_diff = sum(numpy.abs(p[i] - value).min() for value in base)
res[i] = sum_min_diff
return res
res = compare_ptsets(ptsets)
print res
你忘了對你的問題的一個非常重要和關鍵的方面發表評論:這些形狀是如何獲得的?是否有人手動繪製它們?或者,也許,你有一組定義形狀的點嗎?如果前者,那麼你有一個很難的問題,只能通過猜測近似。 – mmgp
我會通過邊緣和線條檢測或Hough變換得到圖像,原始圖像是簡單形狀的灰度等比例圓三角形等等,所以變換輸出應該(理論上)與原始輸入相匹配 – user648026
好,但我' m好奇,看看你將如何處理任意使用霍夫線:)如果我有時間後,我會讚揚你的最新信息貢獻一些答案。 – mmgp