如何在Python中访问OpenCV HoughCircles结果?

我正在开发虹膜相关生物识别技术的概念验证算法.我希望能够在一系列图像上进行测试,但为了做到这一点,我需要知道虹膜边界.按照
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岁),并设法提出这条线.它不会返回任何错误.如何访问结果?我可以访问圈子或存储空间.我如何访问它们?我已尝试过this question的建议,但是,正如提问者所说,cvMat类型不可迭代,所以它不起作用.看起来编写我自己的循环Hough变换而不是处理这个库的稀疏文档似乎不那么重要,但我认为它很简单,我很遗憾.

另外,如何优化参数以便在合理的时间内为学生返回一个拟合圆?

最佳答案 cv.HoughLines2的例子完全不同,因为它的内存存储是这样的:

storage2 = cv.CreateMemStorage(0)

这不适用于HoughCircles. HoughCircles只能处理cvMat存储,例如:

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

重要的是,它只有1行,代表应该是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坐标和半径是完全不准确的,我不知道它们有什么不对,也许你可以找到.

点赞