Перейти к содержимому
Compvision.ru
d1g1t

Распознавание глаза

Recommended Posts

Всем привет.

Задача на проверку подлинности.

- Создать biometric model глаза (левого, правого).

- Сделать iris detection

- Проверить на валидность с образцом. (Iris Recognition)

Подскажите пожалуйста как ето сделать.

Какие финкции использовать, и т.д.

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Всем привет.

Задача на проверку подлинности.

- Создать biometric model глаза (левого, правого).

- Сделать iris detection

- Проверить на валидность с образцом. (Iris Recognition)

Подскажите пожалуйста как ето сделать.

Какие финкции использовать, и т.д.

Спасибо.

Поищите книжки:

1. Advances in Biometrics: Sensors, Algorithms and Systems

N. K. Ratha, Venu Govindaraju

2. Guide to Biometrics

Ruud Bolle, Jonathan Connell, Sharanthchandra Pankanti, Nalini Ratha, Andrew Senior

3. Biometric Systems: Technology, Design and Performance Evaluation

James L. Wayman, Anil K. Jain, Davide Maltoni, Dario Maio

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Поищите книжки:

1. Advances in Biometrics: Sensors, Algorithms and Systems

N. K. Ratha, Venu Govindaraju

2. Guide to Biometrics

Ruud Bolle, Jonathan Connell, Sharanthchandra Pankanti, Nalini Ratha, Andrew Senior

3. Biometric Systems: Technology, Design and Performance Evaluation

James L. Wayman, Anil K. Jain, Davide Maltoni, Dario Maio

Спасибо за быстрый ответ.

Книги ето хорошо. Но смогу ли я все-таки использовать OpenCV для достижения етой цели?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Спасибо за быстрый ответ.

Книги ето хорошо. Но смогу ли я все-таки использовать OpenCV для достижения етой цели?

- Создать biometric model глаза. - Модель - это вроде как совокупность важных для вас признаков, и взаимосвязи между ними, это OpenCV не может за Вас сделать.

Далее, насколько я понимаю, подразумевается программная реализация предыдущего пункта.

- Сделать iris detection

- Проверить на валидность с образцом. (Iris Recognition)

Методы которые помогут Вам это реализовать в OpenCV есть, но openCV не предназначена именно для детектирования глаза. Поэтому я и дал названия книжек, Вы должны определиться с задачей. Разберитесь какие конкретно параметры Вы будете оценивать. Потом попробуйте понять, как вы их собираетесь получать. И наконец, какими методами искать расстояние (оценивать сходство-различие) между векторами полученных параметров. Это лишь часть вопросов, возникающих при постановке подобных задач.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
- Создать biometric model глаза. - Модель - это вроде как совокупность важных для вас признаков, и взаимосвязи между ними, это OpenCV не может за Вас сделать.

Далее, насколько я понимаю, подразумевается программная реализация предыдущего пункта.

- Сделать iris detection

- Проверить на валидность с образцом. (Iris Recognition)

Методы которые помогут Вам это реализовать в OpenCV есть, но openCV не предназначена именно для детектирования глаза. Поэтому я и дал названия книжек, Вы должны определиться с задачей. Разберитесь какие конкретно параметры Вы будете оценивать. Потом попробуйте понять, как вы их собираетесь получать. И наконец, какими методами искать расстояние (оценивать сходство-различие) между векторами полученных параметров. Это лишь часть вопросов, возникающих при постановке подобных задач.

Мобильная Платформа. OpenCV доступен.

Суть такова. Есть фронтальная камера и чел. глаз.

Найти контур, который соответствовал бы глазу я думаю OpenCV сможет, так как перед камерой будет только глаз.

Потом нужно как то найти вышеуказанные параметры.

У меня вопрос.

Имеет ли OpenCV возможность "найти" все необходимые признаки для составления модели глаза? Какие признаки нужны я пойму после анализа и прочтения литературы. Но так как опыта еще нет - нужен совет. Воспользоваться OpenCV как фундаментом для етого или искать что то другое.

Плюс в том, что я уже реализовал face recognition используя OpenCV.

А вот с одним глазом проблема. Не могу найти каскад для распознавания глаза с размером 300х300 и больше.

Посоветуйте что-нибудь)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Мобильная Платформа. OpenCV доступен.

Суть такова. Есть фронтальная камера и чел. глаз.

Найти контур, который соответствовал бы глазу я думаю OpenCV сможет, так как перед камерой будет только глаз.

Потом нужно как то найти вышеуказанные параметры.

У меня вопрос.

Имеет ли OpenCV возможность "найти" все необходимые признаки для составления модели глаза? Какие признаки нужны я пойму после анализа и прочтения литературы. Но так как опыта еще нет - нужен совет. Воспользоваться OpenCV как фундаментом для етого или искать что то другое.

Плюс в том, что я уже реализовал face recognition используя OpenCV.

А вот с одним глазом проблема. Не могу найти каскад для распознавания глаза с размером 300х300 и больше.

Посоветуйте что-нибудь)

Функция cvHoughCircles - думаю Вам должна помочь (Выдаст центры и радиусы окружностей в кадре), правда она выдаст скорее всего много лишнего, но зная примерно пропорции глаза, несложно отсеять лишнюю информацию. Вытащите радужку, развернете ее при помощи cvRemap в полосу, приведите к общему масштабу, вот Вам и площадка для сравнения образцов. Дальше дело Вашей изобретательности.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Функция cvHoughCircles - думаю Вам должна помочь (Выдаст центры и радиусы окружностей в кадре), правда она выдаст скорее всего много лишнего, но зная примерно пропорции глаза, несложно отсеять лишнюю информацию. Вытащите радужку, развернете ее при помощи cvRemap в полосу, приведите к общему масштабу, вот Вам и площадка для сравнения образцов. Дальше дело Вашей изобретательности.

Огромное спасибо. Пошел дерзать ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Всем привет.

Помогите найти центр зрачка.

Выходное изображение:

5120093897_1576d8e727.jpg

cvCanny(gray, edges, 13, 0.15, 3):

5120108307_e787241960.jpg

Далее использую

CvSeq* circles = cvHoughCircles( edges, storage, CV_HOUGH_GRADIENT, ......... );

for( int i = 0; i < circles->total; i++ )

{

float* p = (float*)cvGetSeqElem( circles, i);

LOGI("cx:%f", p[0]);

cvCircle( ellipse_image_, cvPoint(cvRound(p[0]),cvRound(p[1])), 2, CV_RGB(0,255,0), -1, 2, 0 );

cvCircle( ellipse_image_, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 1, 2, 0 );

}

В результате не нахожу еліпс зрачка. Помогите подобрать параметры для cvHoughCircles и немного прокомментировать

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

То что получится, приведите к диапзону 0-255, и уже затем примените детектор окружностей Хафа. Должно получиться лучше.

Параметры лучше подбирать выведя их на TrackBar - ы. И наблюдая за результатом. Можно менять параметры (пороги) по обратной связи, то есть считать сколько надетектил, если мало - то уменьшать порог, если много - увеличивать.

Поделиться сообщением


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

То что получится, приведите к диапзону 0-255, и уже затем примените детектор окружностей Хафа. Должно получиться лучше.

Параметры лучше подбирать выведя их на TrackBar - ы. И наблюдая за результатом. Можно менять параметры (пороги) по обратной связи, то есть считать сколько надетектил, если мало - то уменьшать порог, если много - увеличивать.

Спасибо за ответ.

Может есть уже похожий пример использования cvSobel?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Спасибо за ответ.

Может есть уже похожий пример использования cvSobel?

double		m, M;							/* Место для значений максимума и минимума*/

IplImage *f_image_dx; /* производная по X */
IplImage *f_image_dy; /* производная по Y */

int W = src->width; /* Ширина входного изображения */
int H = src->height; /* Высота входного изображения */

f_image_dx = cvCreateImage(cvSize(W, H), IPL_DEPTH_32F, 1); /* Собель по X f_image_dx [ */
f_image_dy = cvCreateImage(cvSize(W, H), IPL_DEPTH_32F, 1); /* Собель по Y f_image_dy [ */

/* Убираем часть помех */

cvErode(src, dst, 0, 3);
cvDilate(dst, dst, 0, 3);
cvSmooth(dst, dst);

/* Находим градиенты по X и по Y */
cvSobel(dst, f_image_dx, 0, 1, 7);
cvSobel(dst, f_image_dy, 1, 0, 7);

/* Находим и складываем модули градиентов */
cvAbsDiffS(f_image_dx, f_image_dx, cvScalar(0, 0, 0, 0));
cvAbsDiffS(f_image_dy, f_image_dy, cvScalar(0, 0, 0, 0));
cvAdd(f_image_dx, f_image_dy, f_image_dx);

/* Приводим к U8 */
cvMinMaxLoc(f_image_dx, &m, &M, NULL, NULL);
if((M - m) > 0)
{
cvScale(f_image_dx, dst, 255 / (M - m), -m * (255 / (M - m)));
}

cvReleaseImage(&f_image_dx);
cvReleaseImage(&f_image_dy);[/code]

Только здесь 1 канал, и нет поиска окружностей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Огромное спасибо. Подскажите еще как с scr взять каждый канал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Огромное спасибо. Подскажите еще как с scr взять каждый канал.

cvSplit посмотрите.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
cvSplit посмотрите.

Поскажите почему на cvErode падает если изображение 32-битное ?

IplImage* in = cvLoadImage(fileName, 1);

	IplImage* gray = cvCreateImage(cvSize(in->width, in->height), IPL_DEPTH_32F, 1);

	cvCvtColor(in, gray, CV_BGR2GRAY);


	double		m, M;							/* Место для значений максимума и минимума*/


	IplImage	*f_image_dx;			 /* производная по X */

	IplImage	*f_image_dy;			 /* производная по Y */


	int		W = in->width;			/* Ширина входного изображения */

	int		H = in->height;	/* Высота входного изображения */


	f_image_dx = cvCreateImage(cvSize(W, H), IPL_DEPTH_32F, 1); /* Собель по X f_image_dx [ */

	f_image_dy = cvCreateImage(cvSize(W, H), IPL_DEPTH_32F, 1); /* Собель по Y f_image_dy [ */


	IplImage* dst = cvCreateImage(cvSize(W, H), IPL_DEPTH_32F, 1);



	/* Убираем часть помех */


	LOGI_TRA("trying to erode");

	cvErode(gray, dst, 0, 3);

Результат Собеля для gray:

5120719705_3a25f78d7d.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Для глаза это можно не делать (даже лучше не делать)

/* Убираем часть помех */

cvErode(src, dst, 0, 3);

cvDilate(dst, dst, 0, 3);

cvSmooth(dst, dst);

ЗЫ: src , dst - 8 битные одноканальные изображения.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Для глаза это можно не делать (даже лучше не делать)

/* Убираем часть помех */

cvErode(src, dst, 0, 3);

cvDilate(dst, dst, 0, 3);

cvSmooth(dst, dst);

ЗЫ: src , dst - 8 битные одноканальные изображения.

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

Для глаза это можно не делать (даже лучше не делать)

Я немного не понял, что именно лутше для глаза не делать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Я немного не понял, что именно лутше для глаза не делать?

уберите эти строчки.

cvErode(src, dst, 0, 3);

cvDilate(dst, dst, 0, 3);

cvSmooth(dst, dst);

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Подскажыте что делаю нетак...

Вот такой результат:

5125194125_2396460131.jpg

Код:

IplImage* in = cvLoadImage(fileName, 1);

	IplImage* r = cvCreateImage(cvGetSize(in), in->depth, 1); // R channel

	IplImage* g = cvCreateImage(cvGetSize(in), in->depth, 1); // G channel

	IplImage* b = cvCreateImage(cvGetSize(in), in->depth, 1); // B channel


	// reset

	cvZero(r); cvZero(g); cvZero(;


	cvSplit(in, r, g, b, NULL);


	double m, M;						   

	int W = in->width;

	int H = in->height;


	ellipse_image_=cvCreateImageHeader(cvSize(FRAMEW,FRAMEH), 8, 3 );

	ellipse_image_->imageData=(char *)malloc(FRAMEW*FRAMEH*3);


	IplImage* dst;


	IplImage* sum_r = cvCreateImage(cvSize(W, H), 8, 1);

	IplImage* sum_g = cvCreateImage(cvSize(W, H), 8, 1);

	IplImage* sum_b = cvCreateImage(cvSize(W, H), 8, 1);


	IplImage* f_image_dx;

	IplImage* f_image_dy;	


	f_image_dx = cvCreateImage(cvSize(W, H), 8, 1); // Sobel X of f_image_dx 

	f_image_dy = cvCreateImage(cvSize(W, H), 8, 1); // Sobel Y of f_image_dy


	dst = cvCreateImage(cvSize(W, H), 8, 1);


	// R channel

	cvZero(f_image_dx);

	cvZero(f_image_dy);


	cvSobel(r, f_image_dx, 0, 1, 7);

	cvSobel(r, f_image_dy, 1, 0, 7);


	cvAbsDiffS(f_image_dx, f_image_dx, cvScalar(0, 0, 0, 0));

	cvAbsDiffS(f_image_dy, f_image_dy, cvScalar(0, 0, 0, 0));

	cvAdd(f_image_dx, f_image_dy, sum_r);



	// G channel

	cvZero(f_image_dx);

	cvZero(f_image_dy);


	cvSobel(g, f_image_dx, 0, 1, 7);

	cvSobel(g, f_image_dy, 1, 0, 7);


	cvAbsDiffS(f_image_dx, f_image_dx, cvScalar(0, 0, 0, 0));

	cvAbsDiffS(f_image_dy, f_image_dy, cvScalar(0, 0, 0, 0));

	cvAdd(f_image_dx, f_image_dy, sum_g);


	// B channel

	cvZero(f_image_dx);

	cvZero(f_image_dy);


	cvSobel(b, f_image_dx, 0, 1, 7);

	cvSobel(b, f_image_dy, 1, 0, 7);


	cvAbsDiffS(f_image_dx, f_image_dx, cvScalar(0, 0, 0, 0));

	cvAbsDiffS(f_image_dy, f_image_dy, cvScalar(0, 0, 0, 0));

	cvAdd(f_image_dx, f_image_dy, sum_;


	cvAdd(sum_r, sum_g, sum_r);

	cvAdd(sum_r, sum_b, sum_r);


	cvMinMaxLoc(sum_r, &m, &M, NULL, NULL);


	if((M - m) > 0)

	{

		 cvScale(sum_r, dst, 255 / (M - m), -m * (255 / (M - m)));

	}


	cvReleaseImage(&f_image_dx);

	cvReleaseImage(&f_image_dy);


	cvReleaseImage(&r);

	cvReleaseImage(&g);

	cvReleaseImage(&;


	cvReleaseImage(&sum_r);

	cvReleaseImage(&sum_g);

	cvReleaseImage(&sum_;


	CvMemStorage* storage = cvCreateMemStorage(0);	


	CvSeq* circles = cvHoughCircles( dst, storage, CV_HOUGH_GRADIENT, 1, dst->height, 50, 1, 10, 150 );


	for( int i = 0; i < circles->total; i++ )

	{

		float* p = (float*)cvGetSeqElem( circles, i);

		LOGI("cx:%f", p[0]);


		cvCircle( ellipse_image_, cvPoint(cvRound(p[0]),cvRound(p[1])), 2, CV_RGB(0,255,0), -1, 2, 0 );

		cvCircle( ellipse_image_, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 1, 2, 0 );

	}[/code]

Скажите на что accumulator threshold влияет в функции cvHoughCircles ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Почитайте здесь, как работает детектор прямых.

Для окружностей примерно те же принципы:

http://www.compvision.ru/forum/index.php?a...=post&id=86

accumulator threshold - это разделитель окружность/не окружность, чем ниже параметр, тем больше не окружностей принимается за окружности.

пороги обычно ставят 100 и 100, и результат собель по gray мне больше нравится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Почитайте здесь, как работает детектор прямых.

Для окружностей примерно те же принципы:

http://www.compvision.ru/forum/index.php?a...=post&id=86

accumulator threshold - это разделитель окружность/не окружность, чем ниже параметр, тем больше не окружностей принимается за окружности.

пороги обычно ставят 100 и 100, и результат собель по gray мне больше нравится.

Мне по gray тоже больше подходит.

Еще вопросик: high порог для cvCanny - ето внешний порог для контура. Тоесть, для примера, если у нас монета на белом фоне, то high порог будет разница пикселей для белого тла и значения пикселей на грани монеты? Правильно ли я понял. А вот low порог - ето где?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

можно сделать проще..использовать каскад хаара для глаза.

он достаточно точно определяет глаз. фактически по центру полученного изображения находится зрачок. Если он немного сдвинут, немножко переместите тогда само изображение.

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

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
можно сделать проще..использовать каскад хаара для глаза.

он достаточно точно определяет глаз. фактически по центру полученного изображения находится зрачок. Если он немного сдвинут, немножко переместите тогда само изображение.

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

можете предоставить каскад для 1го глаза размером ~150x150

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
можете предоставить каскад для 1го глаза размером ~150x150

eye.rar

Выбирайте (а архиве 3 шт.), должно работать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
eye.rar

Выбирайте (а архиве 3 шт.), должно работать.

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Всем привет.

Подскажите лучший способ по удалению (интерполяция или заполнения области в черный цвет) роговичного блика.

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×