Как я могу получить доступ к результатам OpenCV HoughCircles в Python?

Я разрабатываю алгоритм проверки концепции для биометрии, связанной с радужной оболочкой. Я хотел бы проверить это на серии изображений, но для этого мне нужно знать границы радужной оболочки. Следуя методам, использованным здесь, я отфильтровал и интеллектуально обработал изображение (метод Оцу), что оставляет меня просто темный круг зрачка. Я пытался использовать метод HoughCircles OpenCV, но документации, отличной от 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. Как получить к ним доступ? Я пробовал предложения из этот вопрос, но, как сказал задавший вопрос, тип cvMat не является итерируемым, поэтому он не будет работать. Кажется, что было бы меньше работы написать мое собственное преобразование Circular Hough, чем иметь дело с скудной документацией этой библиотеки, но я думаю, что это что-то простое, чего мне не хватает.

Кстати, как мне оптимизировать параметры, чтобы всегда возвращать подходящую окружность для зрачка за разумное время?


person Bat Masterson    schedule 17.10.2011    source источник
comment
Объект circles похож, что он должен быть итерируемым.   -  person sarnold    schedule 17.10.2011


Ответы (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, что означает ее None в 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 центральной точки и радиус совершенно неточны, я не знаю, что с ними не так, может быть, вы сможете узнать.

person David Dudas    schedule 12.11.2011

Вы используете 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 может не возвращать круги (из-за ограничительных настроек параметров), поэтому вы можете убедиться, что круги не пусты.

Вот аналогичный пример Python с использованием cv. Хафлайнс...

Надеюсь, это поможет!

person mevatron    schedule 17.10.2011
comment
Точная формулировка ошибки TypeError: 'NoneType' object is not iterable. Указывает ли NoneType на отсутствие результатов? Если да, то как я могу проверить это раньше? Кроме того, я применяю его к таким изображениям, как этот, чтобы не было двусмысленности. Я пробовал изменять параметры, но эта команда должна обнаружить все круги, поэтому я не знаю, в чем может быть проблема. Любые идеи? Спасибо за пример HoughLines. Кажется, это может быть полезно. - person Bat Masterson; 17.10.2011

Некоторое решение:

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
person justi    schedule 06.01.2012