Отслеживание глазных зрачков с помощью преобразования Hough Circle Transform

У меня есть проект инвалидного кресла с управлением глазами, в котором мне нужно обнаружить зрачок глаза, и в соответствии с его движением кресло-коляска движется. В качестве теста кода, который я пишу, я выполнил сценарий на статическом изображении. Изображение именно там, где будет размещена камера. Камера будет ИК.

Примечание. Я использую скомпилированные OpenCV 3.1.0-dev и Python2.7 на платформе Windows.

Обнаруженный круг, который я хотел, используя преобразование Houghcircle:

исходное изображение  результат

После этого я работаю над кодом, чтобы обнаружить то же самое только с помощью ИК-камеры.

Результаты кода статического изображения для меня очень надежны, но проблема заключается в коде с ИК-камерой.

Код, который я написал до сих пор:

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while True:

    ## Read Image
    ret, image = cap.read()
    ## Convert to 1 channel only grayscale image
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    ## CLAHE Equalization
    cl1 = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
    clahe = cl1.apply(gray)
    ## medianBlur the image to remove noise
    blur = cv2.medianBlur(clahe, 7)
    ## Detect Circles
    circles = cv2.HoughCircles(blur ,cv2.HOUGH_GRADIENT,1,20,
                                param1=50,param2=30,minRadius=7,maxRadius=21)

    if circles != None:
        circles = np.round(circles[0,:]).astype("int")

    for circle in circles[0,:]:
        # draw the outer circle
        cv2.circle(image,(circle[0],circle[1]),circle[2],(0,255,0),2)
        # draw the center of the circle
        cv2.circle(image,(circle[0],circle[1]),2,(0,0,255),3)

    if cv2.waitKey(1) in [27, ord('q'), 32]:
        break

cap.release()
cv2.destroyAllWindows()

Я всегда получаю такую ​​ошибку:

**if circles != None:
FutureWarning: comparison to `None` will result in an elementwise object comparison in the future.

Traceback (most recent call last):
    cv2.circle(image,(circle[0],circle[1]),circle[2],(0,255,0),2)
IndexError: invalid index to scalar variable.**

Если у вас возникнут вопросы о коде статического изображения, используйте следующий код:

import cv2
import numpy as np

## Read Image
image = cv2.imread('eye.tif')
imageBackup = image.copy()
## Convert to 1 channel only grayscale image
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
## CLAHE Equalization
cl1 = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
clahe = cl1.apply(gray)
## medianBlur the image to remove noise
blur = cv2.medianBlur(clahe, 7)

## Detect Circles
circles = cv2.HoughCircles(blur ,cv2.HOUGH_GRADIENT,1,20,
                            param1=50,param2=30,minRadius=7,maxRadius=21)

for circle in circles[0,:]:
    # draw the outer circle
    cv2.circle(image,(circle[0],circle[1]),circle[2],(0,255,0),2)
    # draw the center of the circle
    cv2.circle(image,(circle[0],circle[1]),2,(0,0,255),3)

cv2.imshow('Final', image)
cv2.imshow('imageBackup', imageBackup)

cv2.waitKey(0)
cv2.destroyAllWindows()

person Tes3awy    schedule 26.08.2016    source источник
comment
В чем именно проблема с ИК камерой? Находит ли круг или просто ничего? Вы можете предоставить образец изображения?   -  person PSchn    schedule 26.08.2016
comment
@PSchn С камерой проблем нет, проблема в том, что если круг не обнаружен, я получаю ошибку NoneType в скрипте Python. Я должен поставить это также в вопросе.   -  person Tes3awy    schedule 26.08.2016
comment
Пожалуйста, добавьте также сообщение об ошибке.   -  person PSchn    schedule 26.08.2016
comment
Имеет ли смысл сделать кучу изображений с помощью камеры, чтобы сохранить их и запустить со статическим кодом? Таким образом вы сможете узнать, какие типы изображений вызывают проблемы ...   -  person ebyrob    schedule 26.08.2016
comment
чтобы проверить правильность вашего кода, да!   -  person PSchn    schedule 26.08.2016
comment
Таким образом, ошибка означает, что функция houghlines не находит кругов, просто проверьте результат (например, здесь) это не решит вашу проблему, но и ваша программа не выйдет из строя   -  person PSchn    schedule 26.08.2016
comment
@PSchn Я получил еще одну ошибку, когда прочитал ссылку, которую вы мне предоставили, ошибка: for circle in circles[0,:]: TypeError: 'NoneType' object has no attribute '__getitem__'   -  person Tes3awy    schedule 26.08.2016
comment
Но результат тот же. Круги пустые, а значит, ваша программа вылетает ?! Я ошибся?   -  person PSchn    schedule 26.08.2016
comment
@PSchn да, круги пусто. Я хочу, чтобы код работал без ошибок, чтобы у меня было время хотя бы настроить ИК-камеру, вы поняли?   -  person Tes3awy    schedule 26.08.2016
comment
Да, поэтому проверьте, если circle! = NONE (здесь)   -  person PSchn    schedule 26.08.2016
comment
@PSchn Я сделал и получил ошибку в приведенном выше комментарии.   -  person Tes3awy    schedule 26.08.2016
comment
Проверьте, прежде чем перебирать его.   -  person PSchn    schedule 26.08.2016
comment
@PSchn Я обещаю, что сделал: D   -  person Tes3awy    schedule 26.08.2016
comment
Думаю, вам не следует вводить этот код! Разместите свой код, пожалуйста: D   -  person PSchn    schedule 26.08.2016
comment
@PSchn Я изменил код в вопросе выше.   -  person Tes3awy    schedule 26.08.2016
comment
Вы пробовали это, как предложено по ссылке выше?   -  person PSchn    schedule 26.08.2016
comment
Если вы опубликуете изображение, я могу протестировать его позже сам   -  person PSchn    schedule 26.08.2016
comment
пожалуйста, разместите несколько ИК-изображений   -  person Micka    schedule 26.08.2016
comment
@Micka, моя проблема не в ИК-камере, а в коде, и этот код также может работать на любой стандартной веб-камере.   -  person Tes3awy    schedule 26.08.2016
comment
для воспроизведения было бы полезно сделать снимок одного из ваших изображений, который не работает, чтобы мы могли понять, почему.   -  person PSchn    schedule 26.08.2016
comment
@OsamaAbbas, можешь убрать округление? Из сообщения об ошибке (ничего не зная о массивах python) похоже, что ваши круги (массив из 3 чисел с плавающей запятой) преобразованы в одиночные целые числа. Позже вы попытаетесь получить доступ к каждому int, поскольку это был массив. Но поскольку я не знаю python, это всего лишь предположение и интерпретация сообщения об ошибке.   -  person Micka    schedule 26.08.2016


Ответы (1)


Итак, я попробовал это сам, и у меня была такая же ошибка. Поэтому я изменил код, как я уже предлагал. Вот обрезанный:

if circles != None:
    for circle in circles[0,:]:
        # draw the outer circle
        cv2.circle(image,(circle[0],circle[1]),circle[2],(0,255,0),2)
        # draw the center of the circle
        cv2.circle(image,(circle[0],circle[1]),2,(0,0,255),3)

Кроме того, вы можете попробовать использовать cv2.Canny для получения лучших результатов. Конец связи :)

person PSchn    schedule 26.08.2016
comment
вы тоже удалили круги = np.round (круги [0,:]). astype (int)? - person Micka; 26.08.2016
comment
Извините, но это ненадежный ответ. эта ссылка дает вам представление о том, что делает cv2.HoughCircles . Это opencv 2.4, но он такой же, как и в opencv 3.1.0-dev. - person Tes3awy; 27.08.2016