我正在开发虹膜相关生物识别技术的概念验证算法。我希望能够在一系列图像上进行测试,但为了做到这一点,我需要知道虹膜边界。按照here使用的技术,我已经过滤并智能地对图像进行阈值处理(Otsu的方法),这使我只留下瞳孔的黑圈。我试图使用OpenCV的HoughCircles
方法,但非C(++)文档很稀疏。到目前为止,这是我的代码。:
# 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
类型不可迭代,所以它不起作用。看起来编写我自己的循环Hough变换而不是处理这个库的稀疏文档似乎不那么重要,但我认为它很简单,我很遗憾。
另一方面,我如何优化参数以便在合理的时间内为学生返回一个拟合圆?
答案 0 :(得分:3)
cv.HoughLines2
的例子完全不同,因为它的内存存储是这样的:
storage2 = cv.CreateMemStorage(0)
这不适用于HoughCircles
。 HoughCircles
只能处理cvMat
个存储空间,例如:
storage = cv.CreateMat(image.width, 1, cv.CV_32FC3)
重要的是,它只有一行,并且代表应该是32位浮点,有3个通道。
例如,您有以下代码行:
circles=cv.HoughCircles(image,storage, cv.CV_HOUGH_GRADIENT, 100, 300,100,50)
由于cvMat
函数的返回值为NULL
,这意味着它在Python中为None(这在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坐标和半径是完全不准确的,我不知道它们有什么不对,也许你可以找到。
答案 1 :(得分: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示例希望有所帮助!
答案 2 :(得分: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