Как обнаружить и нарисовать круг вокруг радужной оболочки глаза?

Я пытался обнаружить область радужной оболочки глаза, а затем нарисовать круг вокруг обнаруженной области. Мне удалось получить четкое черно-белое изображение глаза, содержащее только зрачок, линию верхнего века и бровь, используя пороговую функцию.

Как только это будет достигнуто, HoughCircles будет применено для определения наличия кругов на изображении. Однако он никогда не обнаруживает круглые области. После прочтения HoughCircles говорится, что

Метод градиента Хафа работает следующим образом:

Сначала изображение необходимо пройти через фазу обнаружения границ (в данном случае cvCanny()).

Затем я добавил хитрый детектор после пороговой функции. Это по-прежнему давало ноль обнаруженных кругов. Если я уберу пороговую функцию, изображение глаза будет занято ненужными линиями; поэтому я включил его.

cv::equalizeHist(gray, img);
medianBlur(img, img, 1);

IplImage img1 = img;
cvAddS(&img1, cvScalar(70,70,70), &img1);
//converting IplImage to cv::Mat  
Mat imgg = cvarrToMat(&img1);

medianBlur(imgg, imgg, 1);
cv::threshold(imgg, imgg, 120, 255, CV_THRESH_BINARY);
cv::Canny(img, img, 0, 20);

medianBlur(imgg, imgg, 1);

vector<Vec3f> circles;
/// Apply the Hough Transform to find the circles
HoughCircles(imgg, circles, CV_HOUGH_GRADIENT, 1, imgg.rows/8, 100, 30, 1, 5);
  • Как я могу преодолеть эту проблему?
  • Будет ли работать метод круга?
  • Есть ли лучшее решение для обнаружения области радужной оболочки?
  • Правильно ли выбраны параметры?

Также обратите внимание, что изображение получается напрямую с веб-камеры.


person Sade    schedule 18.07.2013    source источник
comment
Я делаю аналогичный проект, но мне нужно обнаружить много маленьких точек, и все они представляют собой несовершенные круги с большим количеством шумов. Я успешно обнаруживаю их все, используя findContours(). Предварительно мне нужно применить бинарное изображение и хитрый край   -  person azer89    schedule 19.07.2013
comment
Я также подумал, что метод findContours() будет правильным путем. Принимая во внимание, что мой ученик создает несовершенные круги/полукруги, когда люди пасутся, направленные в нижнюю часть экрана. Я попробую этот метод и буду опубликовать обновление о результатах, как можно скорее. -Спасибо.   -  person Sade    schedule 19.07.2013
comment
Метод FindContours не так надежен, иногда он рисует случайный контур в области глаза. Есть ли альтернатива или улучшение?   -  person Sade    schedule 19.07.2013
comment
Мой проект - разработка мыши-глаза, и свет, кажется, играет огромную роль в изображении. Помощь в отношении обнаружения зрачка будет высоко оценена, поскольку я застрял на этом этапе на некоторое время. Пороговый метод дает очень четкое, видимое изображение зрачка.   -  person Sade    schedule 19.07.2013
comment
Я обнаружил, что при рисовании контуров он обрисовывает белые области, и поэтому мне нужно было свести изображение на нет. Поскольку вдоль века есть разрыв, обведена только одна замкнутая область. Как я могу очертить самую большую / круглую область (область со зрачком) и игнорировать область бровей (не круглую область)?   -  person Sade    schedule 20.07.2013


Ответы (2)


Попробуйте использовать дифференциальный оператор Integro Даугмана. Он вычисляет центр радужной оболочки и зрачка и рисует точный круг на границах радужной оболочки и зрачка. Код MATLAB доступен здесь. метод. Поскольку я не знаком с OpenCV, вы можете его преобразовать.

person lizstacks    schedule 02.08.2013
comment
Спасибо за ответ буду смотреть. - person Sade; 13.08.2013

Бинарное изображение глаза содержало три разных аспекта: ресницы, глаз и бровь. Основная цель - добраться до интересующей области, которая является глазом / радужной оболочкой, исключая брови и ресницы. Я выполнил следующие шаги: -

Шаг 1: Отбросьте верхнюю половину изображения глаза, поэтому у нас останутся ресницы, область вокруг глаз и небольшие области тени.

Шаг 2: Найдите контуры

Шаг 3: Найдите самый большой контур, чтобы у нас была только область глаз.

Шаг 4: Используйте ограничительную рамку, чтобы создать прямоугольник вокруг области вокруг глаз http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.html

Теперь у нас есть интересующая область. С этого момента я теперь запрашиваю эти изображения и использую нейронную сеть, чтобы обучить систему подражать свойствам мыши. В настоящее время я изучаю нейронную сеть link1 и как его использовать в opencv.

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

person Sade    schedule 13.08.2013