3

我正在为虹膜相关的生物识别技术开发概念验证算法。我希望能够在一系列图像上对其进行测试,但为了做到这一点,我需要知道虹膜边界。按照这里使用的技术,我对图像进行了过滤和智能阈值处理(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 岁以上的),并设法想出了那条线。它不返回任何错误。如何访问结果?我是否访问circlesstorage. 我如何访问它们?我已经尝试过这个问题的建议,但是,正如提问者所说,该cvMat类型不可迭代,所以它不起作用。编写我自己的 Circular Hough 变换而不是处理这个库的稀疏文档似乎会少一些工作,但我认为我缺少一些简单的东西。

附带说明一下,我如何优化参数以始终在合理的时间内为瞳孔返回拟合圆?

4

3 回答 3

3

的例子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坐标完全不准确,我不知道它们有什么问题,也许你可以找出来。

于 2011-11-12T00:35:54.187 回答
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
于 2012-01-06T19:00:22.860 回答
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 可能不会返回任何圆圈(由于限制性参数设置),因此您可以检查以确保圆圈不为空。

是一个使用 cv.HoughLines 的类似 python 示例...

希望有帮助!

于 2011-10-17T02:27:31.260 回答