d1g1t 0 Жалоба Опубликовано October 12, 2010 Всем привет. Задача на проверку подлинности. - Создать biometric model глаза (левого, правого). - Сделать iris detection - Проверить на валидность с образцом. (Iris Recognition) Подскажите пожалуйста как ето сделать. Какие финкции использовать, и т.д. Спасибо. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 12, 2010 Всем привет. Задача на проверку подлинности. - Создать 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 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
d1g1t 0 Жалоба Опубликовано October 12, 2010 Поищите книжки: 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 для достижения етой цели? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 12, 2010 Спасибо за быстрый ответ. Книги ето хорошо. Но смогу ли я все-таки использовать OpenCV для достижения етой цели? - Создать biometric model глаза. - Модель - это вроде как совокупность важных для вас признаков, и взаимосвязи между ними, это OpenCV не может за Вас сделать. Далее, насколько я понимаю, подразумевается программная реализация предыдущего пункта. - Сделать iris detection - Проверить на валидность с образцом. (Iris Recognition) Методы которые помогут Вам это реализовать в OpenCV есть, но openCV не предназначена именно для детектирования глаза. Поэтому я и дал названия книжек, Вы должны определиться с задачей. Разберитесь какие конкретно параметры Вы будете оценивать. Потом попробуйте понять, как вы их собираетесь получать. И наконец, какими методами искать расстояние (оценивать сходство-различие) между векторами полученных параметров. Это лишь часть вопросов, возникающих при постановке подобных задач. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
d1g1t 0 Жалоба Опубликовано October 12, 2010 - Создать biometric model глаза. - Модель - это вроде как совокупность важных для вас признаков, и взаимосвязи между ними, это OpenCV не может за Вас сделать. Далее, насколько я понимаю, подразумевается программная реализация предыдущего пункта. - Сделать iris detection - Проверить на валидность с образцом. (Iris Recognition) Методы которые помогут Вам это реализовать в OpenCV есть, но openCV не предназначена именно для детектирования глаза. Поэтому я и дал названия книжек, Вы должны определиться с задачей. Разберитесь какие конкретно параметры Вы будете оценивать. Потом попробуйте понять, как вы их собираетесь получать. И наконец, какими методами искать расстояние (оценивать сходство-различие) между векторами полученных параметров. Это лишь часть вопросов, возникающих при постановке подобных задач. Мобильная Платформа. OpenCV доступен. Суть такова. Есть фронтальная камера и чел. глаз. Найти контур, который соответствовал бы глазу я думаю OpenCV сможет, так как перед камерой будет только глаз. Потом нужно как то найти вышеуказанные параметры. У меня вопрос. Имеет ли OpenCV возможность "найти" все необходимые признаки для составления модели глаза? Какие признаки нужны я пойму после анализа и прочтения литературы. Но так как опыта еще нет - нужен совет. Воспользоваться OpenCV как фундаментом для етого или искать что то другое. Плюс в том, что я уже реализовал face recognition используя OpenCV. А вот с одним глазом проблема. Не могу найти каскад для распознавания глаза с размером 300х300 и больше. Посоветуйте что-нибудь) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 12, 2010 Мобильная Платформа. OpenCV доступен. Суть такова. Есть фронтальная камера и чел. глаз. Найти контур, который соответствовал бы глазу я думаю OpenCV сможет, так как перед камерой будет только глаз. Потом нужно как то найти вышеуказанные параметры. У меня вопрос. Имеет ли OpenCV возможность "найти" все необходимые признаки для составления модели глаза? Какие признаки нужны я пойму после анализа и прочтения литературы. Но так как опыта еще нет - нужен совет. Воспользоваться OpenCV как фундаментом для етого или искать что то другое. Плюс в том, что я уже реализовал face recognition используя OpenCV. А вот с одним глазом проблема. Не могу найти каскад для распознавания глаза с размером 300х300 и больше. Посоветуйте что-нибудь) Функция cvHoughCircles - думаю Вам должна помочь (Выдаст центры и радиусы окружностей в кадре), правда она выдаст скорее всего много лишнего, но зная примерно пропорции глаза, несложно отсеять лишнюю информацию. Вытащите радужку, развернете ее при помощи cvRemap в полосу, приведите к общему масштабу, вот Вам и площадка для сравнения образцов. Дальше дело Вашей изобретательности. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
d1g1t 0 Жалоба Опубликовано October 12, 2010 Функция cvHoughCircles - думаю Вам должна помочь (Выдаст центры и радиусы окружностей в кадре), правда она выдаст скорее всего много лишнего, но зная примерно пропорции глаза, несложно отсеять лишнюю информацию. Вытащите радужку, развернете ее при помощи cvRemap в полосу, приведите к общему масштабу, вот Вам и площадка для сравнения образцов. Дальше дело Вашей изобретательности. Огромное спасибо. Пошел дерзать ... Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
d1g1t 0 Жалоба Опубликовано October 27, 2010 Всем привет. Помогите найти центр зрачка. Выходное изображение: cvCanny(gray, edges, 13, 0.15, 3): Далее использую 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 и немного прокомментировать Спасибо. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 27, 2010 Попробуйте не бинаризировать изображение, а просто применить оператор Собеля, по горизонтали, потом по вертикали, и сложить абсолютные значения результатов, получите подсвеченные границы. Проведите для всех трех каналов (если доступно цветное изображение), результат сложите (арифметически или геометрически). То что получится, приведите к диапзону 0-255, и уже затем примените детектор окружностей Хафа. Должно получиться лучше. Параметры лучше подбирать выведя их на TrackBar - ы. И наблюдая за результатом. Можно менять параметры (пороги) по обратной связи, то есть считать сколько надетектил, если мало - то уменьшать порог, если много - увеличивать. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
d1g1t 0 Жалоба Опубликовано October 27, 2010 Попробуйте не бинаризировать изображение, а просто применить оператор Собеля, по горизонтали, потом по вертикали, и сложить абсолютные значения результатов, получите подсвеченные границы. Проведите для всех трех каналов (если доступно цветное изображение), результат сложите (арифметически или геометрически). То что получится, приведите к диапзону 0-255, и уже затем примените детектор окружностей Хафа. Должно получиться лучше. Параметры лучше подбирать выведя их на TrackBar - ы. И наблюдая за результатом. Можно менять параметры (пороги) по обратной связи, то есть считать сколько надетектил, если мало - то уменьшать порог, если много - увеличивать. Спасибо за ответ. Может есть уже похожий пример использования cvSobel? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 27, 2010 Спасибо за ответ. Может есть уже похожий пример использования 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 канал, и нет поиска окружностей. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
d1g1t 0 Жалоба Опубликовано October 27, 2010 Огромное спасибо. Подскажите еще как с scr взять каждый канал. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 27, 2010 Огромное спасибо. Подскажите еще как с scr взять каждый канал. cvSplit посмотрите. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
d1g1t 0 Жалоба Опубликовано October 27, 2010 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: Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 27, 2010 Для глаза это можно не делать (даже лучше не делать) /* Убираем часть помех */ cvErode(src, dst, 0, 3); cvDilate(dst, dst, 0, 3); cvSmooth(dst, dst); ЗЫ: src , dst - 8 битные одноканальные изображения. Функции, приведенные выше должны получать в качестве источника и приемника, изображения одного типа, и по моему тип с плавающей точкой они не принимают. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
d1g1t 0 Жалоба Опубликовано October 28, 2010 Для глаза это можно не делать (даже лучше не делать) /* Убираем часть помех */ cvErode(src, dst, 0, 3); cvDilate(dst, dst, 0, 3); cvSmooth(dst, dst); ЗЫ: src , dst - 8 битные одноканальные изображения. Функции, приведенные выше должны получать в качестве источника и приемника, изображения одного типа, и по моему тип с плавающей точкой они не принимают. Для глаза это можно не делать (даже лучше не делать) Я немного не понял, что именно лутше для глаза не делать? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 28, 2010 Я немного не понял, что именно лутше для глаза не делать? уберите эти строчки. cvErode(src, dst, 0, 3); cvDilate(dst, dst, 0, 3); cvSmooth(dst, dst); Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
d1g1t 0 Жалоба Опубликовано October 29, 2010 Подскажыте что делаю нетак... Вот такой результат: Код: 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 ? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 29, 2010 Почитайте здесь, как работает детектор прямых. Для окружностей примерно те же принципы: http://www.compvision.ru/forum/index.php?a...=post&id=86 accumulator threshold - это разделитель окружность/не окружность, чем ниже параметр, тем больше не окружностей принимается за окружности. пороги обычно ставят 100 и 100, и результат собель по gray мне больше нравится. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
d1g1t 0 Жалоба Опубликовано October 29, 2010 Почитайте здесь, как работает детектор прямых. Для окружностей примерно те же принципы: http://www.compvision.ru/forum/index.php?a...=post&id=86 accumulator threshold - это разделитель окружность/не окружность, чем ниже параметр, тем больше не окружностей принимается за окружности. пороги обычно ставят 100 и 100, и результат собель по gray мне больше нравится. Мне по gray тоже больше подходит. Еще вопросик: high порог для cvCanny - ето внешний порог для контура. Тоесть, для примера, если у нас монета на белом фоне, то high порог будет разница пикселей для белого тла и значения пикселей на грани монеты? Правильно ли я понял. А вот low порог - ето где? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
XoXol_89 3 Жалоба Опубликовано November 6, 2010 можно сделать проще..использовать каскад хаара для глаза. он достаточно точно определяет глаз. фактически по центру полученного изображения находится зрачок. Если он немного сдвинут, немножко переместите тогда само изображение. Можно конечно использовать методы, которые Вам предлагали, но это сложнее и по качеству не лучше, ибо окружности, даже если им задать ограничения, появляются в достаточно хаотическом порядке. 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
d1g1t 0 Жалоба Опубликовано November 10, 2010 можно сделать проще..использовать каскад хаара для глаза. он достаточно точно определяет глаз. фактически по центру полученного изображения находится зрачок. Если он немного сдвинут, немножко переместите тогда само изображение. Можно конечно использовать методы, которые Вам предлагали, но это сложнее и по качеству не лучше, ибо окружности, даже если им задать ограничения, появляются в достаточно хаотическом порядке. можете предоставить каскад для 1го глаза размером ~150x150 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано November 10, 2010 можете предоставить каскад для 1го глаза размером ~150x150 eye.rar Выбирайте (а архиве 3 шт.), должно работать. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
d1g1t 0 Жалоба Опубликовано November 11, 2010 eye.rar Выбирайте (а архиве 3 шт.), должно работать. Спасибо. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
d1g1t 0 Жалоба Опубликовано November 17, 2010 Всем привет. Подскажите лучший способ по удалению (интерполяция или заполнения области в черный цвет) роговичного блика. Спасибо. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах