Jump to content
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.

Share this post


Link to post
Share on other sites
Методы есть, но они достаточно сложные и медлительные можно поискать в 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
Для моего случая медлительные методы не очень подходят :)

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

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

Share this post


Link to post
Share on other sites
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
Вот тут кусок кода, который сделал для тестирования, компилируется, но выдает ошибку при запуске, меня интересует теперь уже параметр 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
в строчке 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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
А урл выше вам не понравился?

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


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

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

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

Share this post


Link to post
Share on other sites
База трехмерных моделей лица VRML с текстурой.

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

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

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

Share this post


Link to post
Share on other sites
Спасибо за ссылку.

Но если я правильно понимаю, то это заточка на распознавание лиц по 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

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

#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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

есть на www.rapidlibrary.com

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.

×