Smorodov 578 Report post Posted May 9, 2010 Спасибо большое за идею! И ещё такой вопрос: а можно как-нибудь обработать изображение, без потери его информативности и распозноваемости, чтобы хоть немного "улучшить" кадр от стандартной вэб-камеры, пробовал сглаживание, но оно не очень помогает именно для глаз, хотя при этом для поиска лица-помогает, или сможет помочь только более качественная вэб-камера))) Методы есть, но они достаточно сложные и медлительные можно поискать в Google по фразам: Weiner filter image Deblurring ну и в том-же духе Есть методы, использующие последовательность кадров, для получения более качественного изображения, для вебки самое простое, но при движении объектов за ними тянутся треки. По этому поводу можете посмотреть кусок кода, может на мысли наведет: gray = cvCreateImage(cvSize(Grab->width,Grab->height), IPL_DEPTH_8U, 1); gray_f = cvCreateImage(cvSize(Grab->width,Grab->height), IPL_DEPTH_32F, 1); cvRunningAvg( gray_f,accum_f,0.3); cvConvertScale( accum_f, gray); Вот этот ресурс очень понравился: http://www.nist.gov/lispix/imlab/FFT/deblur.html Обязательно переведу его и переделаю под opencv. Share this post Link to post Share on other sites
e0003414 0 Report post Posted May 10, 2010 Методы есть, но они достаточно сложные и медлительные можно поискать в Google по фразам: Weiner filter image Deblurring ну и в том-же духе Есть методы, использующие последовательность кадров, для получения более качественного изображения, для вебки самое простое, но при движении объектов за ними тянутся треки. По этому поводу можете посмотреть кусок кода, может на мысли наведет: gray = cvCreateImage(cvSize(Grab->width,Grab->height), IPL_DEPTH_8U, 1); gray_f = cvCreateImage(cvSize(Grab->width,Grab->height), IPL_DEPTH_32F, 1); cvRunningAvg( gray_f,accum_f,0.3); cvConvertScale( accum_f, gray); Для моего случая медлительные методы не очень подходят Хотелось бы у вас узнать о параметре accum_f, это предыдущий кадр? я просто не совсем понимаю, с чем необходимо складывать текущий кадр. Share this post Link to post Share on other sites
Smorodov 578 Report post Posted May 10, 2010 Для моего случая медлительные методы не очень подходят Хотелось бы у вас узнать о параметре accum_f, это предыдущий кадр? я просто не совсем понимаю, с чем необходимо складывать текущий кадр. accum_f - это аккумулятор (собственно, это и есть результат), в нем накапливается бегущее среднее, поступающих кадров (gray_f) с коэффициентом 0.3, чем меньше коэффициент, тем длиннее хвост . Share this post Link to post Share on other sites
e0003414 0 Report post Posted May 11, 2010 accum_f - это аккумулятор (собственно, это и есть результат), в нем накапливается бегущее среднее, поступающих кадров (gray_f) с коэффициентом 0.3, чем меньше коэффициент, тем длиннее хвост . Вот тут кусок кода, который сделал для тестирования, компилируется, но выдает ошибку при запуске, меня интересует теперь уже параметр gray , как его проинициализировать? и такой вопрос, общепозновательный не могли бы мне рассказать, за счет чего повышается качество изображения при складывании кадров, это из-за глубины изображения? ////////////////////////////////////////////////////////////////////////////////////////////////// (double)width = cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH); (double)height = cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT); ... cvGrabFrame(capture); gray = cvCreateImage(cvSize(width,height), IPL_DEPTH_8U, 1); gray_f = cvCreateImage(cvSize(width,height), IPL_DEPTH_32F, 1); accum_f = cvCreateImage(cvSize(width,height), IPL_DEPTH_32F, 1); while(1) { inframe = cvRetrieveFrame(capture); cvCvtColor(inframe, gray_f, CV_BGR2GRAY); cvRunningAvg( gray_f,accum_f,0.3, NULL); cvConvertScale( accum_f, gray,1,0); c = cvWaitKey(33); if(c==27) break; cvGrabFrame(capture); } ... ////////////////////////////////////////////////////////////////////////////////////////////////// Share this post Link to post Share on other sites
Smorodov 578 Report post Posted May 11, 2010 Вот тут кусок кода, который сделал для тестирования, компилируется, но выдает ошибку при запуске, меня интересует теперь уже параметр gray , как его проинициализировать? и такой вопрос, общепозновательный не могли бы мне рассказать, за счет чего повышается качество изображения при складывании кадров, это из-за глубины изображения? ////////////////////////////////////////////////////////////////////////////////////////////////// (double)width = cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH); (double)height = cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT); ... cvGrabFrame(capture); gray = cvCreateImage(cvSize(width,height), IPL_DEPTH_8U, 1); gray_f = cvCreateImage(cvSize(width,height), IPL_DEPTH_32F, 1); accum_f = cvCreateImage(cvSize(width,height), IPL_DEPTH_32F, 1); while(1) { inframe = cvRetrieveFrame(capture); cvCvtColor(inframe, gray_f, CV_BGR2GRAY); cvRunningAvg( gray_f,accum_f,0.3, NULL); cvConvertScale( accum_f, gray,1,0); c = cvWaitKey(33); if(c==27) break; cvGrabFrame(capture); } ... ////////////////////////////////////////////////////////////////////////////////////////////////// в строчке cvConvertScale( accum_f, gray,1,0); происходит преобразование из массива значений с плавающей точкой accum_f в целочисленный массив gray, можно добавить параметры масштаба и смещения. Улучшение (не сильно динамичного) изображения происходит за счет усреднения по времени значений точек кадра, так как шум величина постоянно меняющаяся, то она не будет вносить большого вклада в изображение, в отличие от точек имеющих постоянное по величине значение. Картинку можно посмотреть (и исходник есть там-же) на моем старом сайте: http://www.smorodov.narod.ru/CompVision.htm (картинка внизу. там я быстро внес руку в кадр и убрал её.) Share this post Link to post Share on other sites
e0003414 0 Report post Posted May 13, 2010 в строчке cvConvertScale( accum_f, gray,1,0); происходит преобразование из массива значений с плавающей точкой accum_f в целочисленный массив gray, можно добавить параметры масштаба и смещения. Улучшение (не сильно динамичного) изображения происходит за счет усреднения по времени значений точек кадра, так как шум величина постоянно меняющаяся, то она не будет вносить большого вклада в изображение, в отличие от точек имеющих постоянное по величине значение. Картинку можно посмотреть (и исходник есть там-же) на моем старом сайте: http://www.smorodov.narod.ru/CompVision.htm (картинка внизу. там я быстро внес руку в кадр и убрал её.) Спасибо за информацию, вот сейчас буду разбираться с кодом, добиваться level up-а в использовании openCV Share this post Link to post Share on other sites
e0003414 0 Report post Posted May 25, 2010 Появился вот такой вопрос: разрабатываю приложение по обнаружению лиц и обьектов в кадре и управление ими, а также обработка кадров, считывание очередного кадра происходит в потоке обработки простоя, вся проблема в том, приложение подразумевает собой ожидание действий пользователя, при запуске пользователем камеры кадры отображаются на форме, но при этом приложение начинает "дико" кушать оперативную память, за минуту сьело 400 МБ, как я понимаю вся проблема в потоке обработки простоя, можно ли как-нибудь решить проблему или есть варианты другого считывания кадров? Share this post Link to post Share on other sites
quosego 5 Report post Posted May 25, 2010 Я думаю вы просто забываете очищать память - это же не ява Проверьте код, на каждый cvСreate должен быть cvRelease Share this post Link to post Share on other sites
e0003414 0 Report post Posted May 25, 2010 Да как раз с cvRelease все нормально, несколько раз перепроверял) возможно ли это из-за использования потока простоя, примерах идет непрерывно подача кадров на форму, в моем случае необходимо подать кадры по запросу пользователя, целесообразно ли использовать вообще поток простоя для отображения кадров? пытался сделать через процедуру, но приложение "висит". Share this post Link to post Share on other sites
e0003414 0 Report post Posted May 25, 2010 Разобрался, немного напутал с параметрами обработчика простоя приложения, но сейчас все нормально) Share this post Link to post Share on other sites
KuKu 0 Report post Posted June 9, 2010 Добрый день, может быть не там пишу, но где можно почитать о принципе работы метода Хаара ? Смотрел интеловскую (Статья), но не понял даже принципа. Если где то по подробнее ? P.S. конечно понимаю на русском этого не найти, но может быть все таки есть ... P.P.S как то можно удалять ошибочные сообщения ? Share this post Link to post Share on other sites
quosego 5 Report post Posted June 12, 2010 ну вот небольшая статья на русском http://m.habrahabr.ru/post/67937/. Только это алгоритм Viola-Jones, а не Хаара. Вейвлеты Хаара здесь используются как признаки Share this post Link to post Share on other sites
KuKu 0 Report post Posted June 13, 2010 спасиб, чую на русском описание все таки не найти Share this post Link to post Share on other sites
quosego 5 Report post Posted June 13, 2010 А урл выше вам не понравился? Если нужно подробнее, то что такое преобразование Хаара на русском можно найти легко -книг о вейвлетах много, а идея ассоциативных машин достаточно подробно описана в книге Хайкина - Нейронные сети: полный курс - электронная версия в сети есть на многих трекерах Share this post Link to post Share on other sites
KuKu 0 Report post Posted June 13, 2010 А урл выше вам не понравился? понравился конечно, но по сути Хаара там не очень ясно, ну считаем пиксели в прямоугольничках, а что с ними делать, в чем так сказать суть - не ясно Если нужно подробнее, то что такое преобразование Хаара на русском можно найти легко -книг о вейвлетах много, а идея ассоциативных машин достаточно подробно описана в книге Хайкина - Нейронные сети: полный курс - электронная версия в сети есть на многих трекерах а это сейчас надо будет посмотреть ... Share this post Link to post Share on other sites
almariann 0 Report post Posted July 23, 2010 Занимаюсь вопросом маркировки и отслеживания ключевых точек лица (уголки глаз, зрачок, нос и т.д.) при поворотах головы. Использую OpenCv, но при резких поворотах и при некоторых углах точки, маркирующие, например, зрачки теряются, либо маркируют не то, что нужно. Подскажите, пожалуйста, возможно ли устранить это? Может есть какие другие ресурсы, которые могли бы повысить точность? Заранее спасибо! Share this post Link to post Share on other sites
Smorodov 578 Report post Posted July 23, 2010 Занимаюсь вопросом маркировки и отслеживания ключевых точек лица (уголки глаз, зрачок, нос и т.д.) при поворотах головы. Использую OpenCv, но при резких поворотах и при некоторых углах точки, маркирующие, например, зрачки теряются, либо маркируют не то, что нужно. Подскажите, пожалуйста, возможно ли устранить это? Может есть какие другие ресурсы, которые могли бы повысить точность? Заранее спасибо! Посмотрите OpenTL (надстройка над OpenCV). Там есть инструменты для трекинга. Судя по постановке задачи нужен какой-то фильтр, Particles (Condensation) или фильтр Кальмана. Если не лень поковыряйте этот проект. Share this post Link to post Share on other sites
Smorodov 578 Report post Posted July 31, 2010 База трехмерных моделей лица VRML с текстурой. http://www.frav.es/research/facerecognition/FRAV3D/ Share this post Link to post Share on other sites
almariann 0 Report post Posted August 2, 2010 База трехмерных моделей лица VRML с текстурой. http://www.frav.es/research/facerecognition/FRAV3D/ Спасибо за ссылку. Но если я правильно понимаю, то это заточка на распознавание лиц по 3д модели (т.е. не в реальном времени)? Share this post Link to post Share on other sites
Smorodov 578 Report post Posted August 3, 2010 Спасибо за ссылку. Но если я правильно понимаю, то это заточка на распознавание лиц по 3д модели (т.е. не в реальном времени)? Если Вы про AAM-Library то библиотека использует двухмерные модели (контур + текстура). Я немного переделал (несколько строчек), и у меня работает при частоте кадров от нескольких кадров в сек. до кадров 10-15 в сек, в зависимости от количества итераций приближения. Я думаю что возможно ускорить еще больше, если: 1) Брать приближение из предыдущего кадра (20-30 итераций делать только на первом кадре), тогда на каждый кадр 1-2 итерация, это должно работать достаточно быстро и точно. 2) Как вариант, можно использовать для действий с текстурой OpenGL или DirectX. Если про FRAV, то я дал ссылку как на базу моделей,ведь из трехмерных получить двумерные несложно. Я предполагал, что эта база будет полезна при использовании AAM-library, так как содержит аннотированные изображения (изображения с отмеченными характерными точками лица). Share this post Link to post Share on other sites
misha reznikovski 0 Report post Posted August 5, 2010 В чем ошибка ... #include <stdafx.h> #include <iostream> #include <cv.h> #include <cxcore.h> #include <highgui.h> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { IplImage* img; img = cvLoadImage( "yacob" ); CvMemStorage* storage = cvCreateMemStorage(0); CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( "haarcascade_frontalface_alt2.xml" ); double scale = 1.3; static CvScalar colors[] = { {{0,0,255}}, {{0,128,255}}, {{0,255,255}}, {{0,255,0}}, {{255,128,0}}, {{255,255,0}}, {{255,0,0}}, {{255,0,255}} }; cvClearMemStorage( storage ); CvSeq* objects = cvHaarDetectObjects( img, cascade, storage, 1.1, 4, 0, cvSize( 40, 50 )); CvRect* r; for( int i = 0; i < (objects ? objects->total : 0 ); i++ ){ r = ( CvRect* )cvGetSeqElem( objects, i ); cvRectangle( img, cvPoint( r->x, r->y ), cvPoint( r->x + r->width, r->y + r->height ), colors[i%8]); } cvNamedWindow( "Output",0 ); cvShowImage( "Output", img ); cvWaitKey(); cvReleaseImage( &img ); return 0; } сообщения---Unhandled exception at 0x7c812aab in face.exe: Microsoft C++ exception: cv::Exception at memory location 0x0011ed8c.. сообщения---Unhandled exception at 0x10116777 (cv200d.dll) in face.exe: 0xC0000005: Access violation reading location 0x00000000. миша Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted August 6, 2010 В какой строке ошибка вылетает? Share this post Link to post Share on other sites
misha reznikovski 0 Report post Posted August 6, 2010 компиляция проходет без ошибок сообщения появляются при выполнение(F5) миша Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted August 6, 2010 Я и спрашиваю: на какой строке падает в отладчике при выполнении. Share this post Link to post Share on other sites
Smorodov 578 Report post Posted August 26, 2010 Литература к топику: Human Motion: Understanding, Modelling, Capture, and Animation (Computational Imaging and Vision) есть на www.rapidlibrary.com Share this post Link to post Share on other sites