2011-10-17 32 views
3

我正在開發虹膜相關生物識別的概念證明算法。我希望能夠在一系列圖像上進行測試,但爲了做到這一點,我需要了解虹膜邊界。按照使用的技巧here,我已經過濾和智能化閾值圖像(大津的方法),這留下了我瞳孔的黑圈。我試圖使用OpenCV的HoughCircles方法,但非C(++)文檔很少。這裏是我的代碼迄今爲這部分。:如何訪問Python中的OpenCV HoughCircles結果?

# Convert PIL to openCV type 
cvImage = cv.CreateImageHeader(inputImage.size, cv.IPL_DEPTH_8U, 1) 
cv.SetData(cvImage, inputImage.tostring()) 

self.cvSize = cv.GetSize(cvImage) 

# Create storage for circles (there should only be one) 
storage = cv.CreateMat(50, 1, cv.CV_32FC3) 

# Get circles (why doesn't this work?) 
circles = cv.HoughCircles(cvImage,storage,cv.CV_HOUGH_GRADIENT,2,(self.cvSize[0])/4,200,100); 

最後一行是有問題的路線。我跟着在互聯網上傳播的幾篇文章(大部分是針對C/C++或者5歲以上的),並設法提出了這條線。它不會返回任何錯誤。我如何訪問結果?我可以訪問circlesstorage。我如何訪問它們?我已經嘗試了this question的建議,但是,正如提問者所說,cvMat類型是不可迭代的,所以它不起作用。看起來編寫我自己的循環Hough變換不是處理這個庫的稀疏文檔,但我認爲它很簡單,我錯過了。

在附註上,我該如何優化參數以便在合理的時間內爲學生始終返回一個適合的圓圈?

+0

的'circles'對象[看起來應該可迭代(http://opencv.willowgarage.com/wiki/PythonInterface# CvSeq)。 – sarnold

回答

2

您使用OpenCV 2.3.x嗎?它的文件似乎表明您可以按如下做一些事情:

circles = cv2.HoughCircles(circleImage, cv.CV_HOUGH_GRADIENT, 2, 32, 200, 100); 
for (x, y, radius) in circles: 
    # do something with circle 

注: cv.HoughCircles可能不會返回任何圈(由於嚴格的參數設置),所以你可能要檢查,以確保圈子不空。

Here是使用cv.HoughLines類似的Python的例子...

希望幫助!

+0

錯誤的確切寫法是TypeError:NoneType對象不可迭代。 NoneType是否表示沒有結果?如果是這樣,我怎麼才能檢查這個呢?另外,我正在像[this](http://i.imgur.com/k2XDC.jpg)這樣的圖像上運行它,所以沒有任何含糊之處。我嘗試過改變參數,但是這個命令應該檢測所有的圈子,所以我不知道問題可能是什麼。有任何想法嗎? 感謝HoughLines示例。它似乎可能會有所幫助。 –

3

cv.HoughLines2的例子是完全不同的,因爲它的內存存儲空間,這樣的事情:

storage2 = cv.CreateMemStorage(0) 

不會與HoughCircles工作。 HoughCircles只能處理cvMat存儲器,例如:

storage = cv.CreateMat(image.width, 1, cv.CV_32FC3) 

是很重要的,它只有1行和represenation應該32位的浮點數與3個通道。

例如,你有下面的代碼行:

circles=cv.HoughCircles(image,storage, cv.CV_HOUGH_GRADIENT, 100, 300,100,50) 

由於cvMat的函數的返回是NULL,這意味着其在Python無(這是在C語言類似,沒有返回,當存儲是cvMat)。

這意味着,唯一的輸出是存儲。 您可以用numpy的結構進行解碼:

np.asarray(storage) 

這裏是我的代碼與中心點和半徑,這是HoughCircles結果畫圈圈。

for i in range(0,len(np.asarray(storage))): 
     cv.Circle(image, (int(np.asarray(storage)[i][0][0]), int(np.asarray(storage)[i][0][1])), int(np.asarray(storage)[i][0][2]), cv.CV_RGB(255, 0, 0), 2, 8, 0) 

只有一個問題,我還沒能解決: X,Y軸中心點座標和半徑是完全不正確的,我不知道什麼與他們錯了,也許你可以找到答案。

2

一些溶液:

grayImage = cv2.cvtColor(circleImage, cv.CV_BGR2GRAY) 
circles = cv2.HoughCircles(grayImage, cv.CV_HOUGH_GRADIENT, 2, 80, None, 100, 100, 50, 150) 

和:

all_circles = circles[0] 
    for circle in all_circles: 
     #circle[0] - x 
     #circle[1] - y 
     #circle[2] - radius