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

Находим в кадре лица, человеческие фигуры, и т.д. и т.п

Recommended Posts

Спасибо большое за идею! И ещё такой вопрос: а можно как-нибудь обработать изображение, без потери его информативности и распозноваемости, чтобы хоть немного "улучшить" кадр от стандартной вэб-камеры, пробовал сглаживание, но оно не очень помогает именно для глаз, хотя при этом для поиска лица-помогает, или сможет помочь только более качественная вэб-камера)))

Методы есть, но они достаточно сложные и медлительные можно поискать в 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.

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


Ссылка на сообщение
Поделиться на других сайтах
Методы есть, но они достаточно сложные и медлительные можно поискать в 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, это предыдущий кадр? я просто не совсем понимаю, с чем необходимо складывать текущий кадр.

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


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

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

accum_f - это аккумулятор (собственно, это и есть результат), в нем накапливается бегущее среднее, поступающих кадров (gray_f) с коэффициентом 0.3, чем меньше коэффициент, тем длиннее хвост :) .

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


Ссылка на сообщение
Поделиться на других сайтах
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);

}

...

//////////////////////////////////////////////////////////////////////////////////////////////////

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


Ссылка на сообщение
Поделиться на других сайтах
Вот тут кусок кода, который сделал для тестирования, компилируется, но выдает ошибку при запуске, меня интересует теперь уже параметр 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

(картинка внизу. там я быстро внес руку в кадр и убрал её.)

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


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

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

Картинку можно посмотреть (и исходник есть там-же) на моем старом сайте: http://www.smorodov.narod.ru/CompVision.htm

(картинка внизу. там я быстро внес руку в кадр и убрал её.)

Спасибо за информацию, вот сейчас буду разбираться с кодом, добиваться level up-а в использовании openCV :)

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


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

Появился вот такой вопрос: разрабатываю приложение по обнаружению лиц и обьектов в кадре и управление ими, а также обработка кадров, считывание очередного кадра происходит в потоке обработки простоя, вся проблема в том, приложение подразумевает собой ожидание действий пользователя, при запуске пользователем камеры кадры отображаются на форме, но при этом приложение начинает "дико" кушать оперативную память, за минуту сьело 400 МБ, как я понимаю вся проблема в потоке обработки простоя, можно ли как-нибудь решить проблему или есть варианты другого считывания кадров?

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


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

Я думаю вы просто забываете очищать память - это же не ява:) Проверьте код, на каждый cvСreate должен быть cvRelease

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


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

Да как раз с cvRelease все нормально, несколько раз перепроверял) возможно ли это из-за использования потока простоя, примерах идет непрерывно подача кадров на форму, в моем случае необходимо подать кадры по запросу пользователя, целесообразно ли использовать вообще поток простоя для отображения кадров? пытался сделать через процедуру, но приложение "висит".

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


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

Разобрался, немного напутал с параметрами обработчика простоя приложения, но сейчас все нормально)

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


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

Добрый день, может быть не там пишу, но где можно почитать о принципе работы метода Хаара ? Смотрел интеловскую (Статья), но не понял даже принципа. Если где то по подробнее ?

P.S. конечно понимаю на русском этого не найти, но может быть все таки есть ...

P.P.S как то можно удалять ошибочные сообщения ? :blink:

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


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

ну вот небольшая статья на русском http://m.habrahabr.ru/post/67937/. Только это алгоритм Viola-Jones, а не Хаара. Вейвлеты Хаара здесь используются как признаки

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


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

спасиб, чую на русском описание все таки не найти :blink:

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


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

А урл выше вам не понравился? :blink: Если нужно подробнее, то что такое преобразование Хаара на русском можно найти легко -книг о вейвлетах много, а идея ассоциативных машин достаточно подробно описана в книге Хайкина - Нейронные сети: полный курс - электронная версия в сети есть на многих трекерах

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


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

понравился конечно, но по сути Хаара там не очень ясно, ну считаем пиксели в прямоугольничках, а что с ними делать, в чем так сказать суть - не ясно :blink:

Если нужно подробнее, то что такое преобразование Хаара на русском можно найти легко -книг о вейвлетах много, а идея ассоциативных машин достаточно подробно описана в книге Хайкина - Нейронные сети: полный курс - электронная версия в сети есть на многих трекерах

а это сейчас надо будет посмотреть ...

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


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

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

Заранее спасибо!

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


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

Заранее спасибо!

Посмотрите OpenTL (надстройка над OpenCV). Там есть инструменты для трекинга. Судя по постановке задачи нужен какой-то фильтр, Particles (Condensation) или фильтр Кальмана. Если не лень поковыряйте этот проект.

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


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

База трехмерных моделей лица VRML с текстурой.

http://www.frav.es/research/facerecognition/FRAV3D/

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


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

http://www.frav.es/research/facerecognition/FRAV3D/

Спасибо за ссылку.

Но если я правильно понимаю, то это заточка на распознавание лиц по 3д модели (т.е. не в реальном времени)?

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


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

Но если я правильно понимаю, то это заточка на распознавание лиц по 3д модели (т.е. не в реальном времени)?

Если Вы про AAM-Library то библиотека использует двухмерные модели (контур + текстура).

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

1) Брать приближение из предыдущего кадра (20-30 итераций делать только на первом кадре), тогда на каждый кадр 1-2 итерация, это должно работать достаточно быстро и точно.

2) Как вариант, можно использовать для действий с текстурой OpenGL или DirectX.

Если про FRAV, то я дал ссылку как на базу моделей,ведь из трехмерных получить двумерные несложно. Я предполагал, что эта база будет полезна при использовании AAM-library, так как содержит аннотированные изображения (изображения с отмеченными характерными точками лица).

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


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

В чем ошибка ...

#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.

миша

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


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

В какой строке ошибка вылетает?

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


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

Я и спрашиваю: на какой строке падает в отладчике при выполнении.

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


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

Литература к топику:

Human Motion: Understanding, Modelling, Capture, and Animation (Computational Imaging and Vision)

есть на www.rapidlibrary.com

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×