2011-10-17 2 views
3

홍채 관련 생체 인식을위한 개념 증명 알고리즘을 개발 중입니다. 일련의 이미지에서 테스트해볼 수 있기를 원하지만 이렇게하려면 홍채 경계를 알아야합니다. 기술 here에 따라, 필자는 이미지를 필터링하고 지능적으로 임계 화했으며 (Otsu의 방법), 이는 학생의 어두운 원을 그대로 남겨 둡니다. 나는 OpenCV의 HoughCircles 방법을 사용하려고 시도했지만 non-C (++) 문서는 드물다. 다음은이 섹션에 대한 나의 코드입니다. :OpenCV HoughCircles 결과에 Python으로 액세스하려면 어떻게해야합니까?

# 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 세 이상) 그 라인을 찾아 냈습니다. 오류를 리턴하지 않습니다. 결과에 어떻게 액세스합니까? circles 또는 storage에 액세스합니까? 어떻게 접근합니까? 질문자가 말한대로 this question에서 제안을 시도했지만 cvMat 유형은 반복 가능하지 않으므로 작동하지 않습니다. 이 라이브러리의 드문 드문 한 문서를 다루기보다는 제 자신의 Circular Hough Transform을 작성하는 것이 적을 것 같지만, 제가 놓친 것만 큼 간단하다고 생각합니다.

적당한 시간 내에 동등한 동그라미를 항상 반환하도록 매개 변수를 최적화하려면 어떻게해야합니까?

+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을 사용하여 비슷한 파이썬의 예입니다! HoughCircles

storage2 = cv.CreateMemStorage(0) 

작동하지 않습니다 : 메모리 저장이 그런 일 때문에

+0

오류의 정확한 표현은'TypeError : 'NoneType'object is iterable'입니다. NoneType 결과가 없음을 나타 냅니까? 그렇다면 어떻게 이전에 이것을 확인할 수 있습니까? 또한, 나는 [this] (http://i.imgur.com/k2XDC.jpg)와 같은 이미지에서 실행하고 있으므로 애매 모호하지 않습니다. 매개 변수를 변경하려고 시도했지만이 명령으로 모든 서클을 감지하므로 문제가 무엇인지 알 수 없습니다. 어떤 아이디어? HoughLines 예제에 감사드립니다. 도움이 될 것 같습니다. –

3

cv.HoughLines2의 예는 완전히 다르다. HoughCircles 예를 들어, 단지 cvMat 저장소를 처리 할 수 ​​그것은 오직 하나의 행을 갖고, represenation가 3 개 채널과 32 비트 부동 소수점되어야한다는 중요

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

. 더 수익이없는, 함수의 반환이 NULL입니다

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

cvMat의 때문에, 파이썬에서의 없음 (이 C에서 유사하다는 의미 :

는 예를 들어, 다음 코드 줄을이 , 저장시는 cvMat).

즉, 유일한 출력은 저장소입니다. 당신은 NumPy와 함께 구조를 디코딩 할 수 있습니다

np.asarray(storage) 

여기 HoughCircles의 결과 인 중심점과 반지름으로 원을 그려 내 코드입니다. 는 X, Y는 중심점의 좌표와 반경, 나는, 어쩌면 당신이 무슨 그들과 함께 잘못 찾을 수 있습니다 모른다 완전히 부정확 :

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) 

는 아직 해결되지 수있는 단 하나의 문제가 있습니다.

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