2012-12-16 271 views
0

我有一個Python程序的問題,我想從C中將下面的例子中的硬幣轉換爲python。在opencv中計算Python中的輪廓

Coins contours

到目前爲止,我無法找到C線等價物:

sprintf(msg, "Found %d coins.", contours.size()); 

我的主要問題是與「contours.size()」,我試圖替換代碼用LEN(),但它給了我一個號碼154,而不是4,看下面的代碼:

contours = cv.FindContours(cv.CloneImage(image_threshed), cv.CreateMemStorage(0), cv.CV_RETR_LIST, cv.CV_CHAIN_APPROX_SIMPLE) 

cv.DrawContours(image, contours, cv.RGB(255,0,0), cv.RGB(0,255,55), 2,1,8) 

NumeroContornos = str(len(contours)) 

font = cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, .5, .5, 0, 1, 8) 
cv.PutText(image,NumeroContornos, (5,17),font, cv.RGB(250,0,0)) 

我希望得到任何幫助。

回答

2

當您使用cv.FindContours函數查找等值線時,它將返回一個cvSeq對象。它返回多個鏈接的序列,你必須遍歷它們才能得到所有的輪廓。

所以起初,指針只指向第一個輪廓,比如說你的第一個硬幣。當您使用len(contour)時,它只會返回該輪廓內的點,即您的第一枚硬幣的點數。所以現在你可以想象你是怎麼得到154的。它不是輪廓的數量,它是輪廓內的點數。要看到這些點,print list(contour)並且當您在圖像上繪製這些點時,您可以看到它全部構成硬幣的邊界。

現在選擇下一個輪廓或下一個硬幣,使用contour = contour.h_next()等。

我認爲沒有內置的函數來返回輪廓的數量,除非您遍歷輪廓並計算它。

試試這個,檢查是否打印4個cvSeq對象:

while contours: 
    print contours 
    contours = contours.h_next() 

我在這裏解釋這一切:What does result of 'list(contour)' denote?

相反,我會建議你使用新cv2接口這是很多更簡單,更好。在那裏,等值線返回爲Numpy數組列表,您可以使用len(等高線)查找等值線的數量。

你可以找到的簡歷和CV2這裏的區別簡要說明:What is different between all these OpenCV Python interfaces?

cv接口將很快過時。所以更好地遷移到新的cv2界面。

+0

謝謝你,工作。我正在學習python和opencv,但我肯定會開始使用cv2,所以我的下一個任務是將當前的程序更改爲cv2。 –

+0

你會發現它更有趣。請訪問:www.opencvpython.blogspot.com瞭解一些初級教程。 –

+1

此外,如果它解決了問題,您可以通過單擊答案附近的刻度線並接受本次會話來接受此答案。 –