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

Маленькие вопросы по OpenCv

Recommended Posts

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

1 вопрос. Вкратце - зачем нужны пирамиды изображений?

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


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

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

и в SIFT еще вроде используется когда считают Difference of Gaussian (DoG)

  • Like 1

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


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

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

и в SIFT еще вроде используется когда считают Difference of Gaussian (DoG)

короче чтобы масштаб изменить , так ведь?

  • Like 1

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


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

ну по сути да, но есть такое понятие вроде как scale space и под это дело подведена какая то теория.

http://www.cse.psu.edu/~rcollins/CSE486/lecture10_6pp.pdf

http://en.wikipedia.org/wiki/Pyramid_(image_processing)

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


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

ВОбщем прочитал 10ю главу, честно, мало че понял. Вроде и английский знаю, а вот суть не уловил.

Уважаемые форумчане у меня скопилось очень много вопросов по этой главе, я хотел бы разобраться в ней по порядочку.

Фильтр Кальмана и метод конденсации.

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

- знаем текущее положение (1) ; измеряем следующее положение (2) ; говорим что наверное подействовал шум и это измеренное положение не совсем точно (3) и статистическим методом определеяем где он точно наверняка должен быть!

окей.

Метод конденсации - мы говорим что фильтр Кальмана плохой и что он дает нам только одну гипотезу что шум обладает нормальным распределением, поэтому хочется чтоб моделировалось не только нормальное распределение а сразу много распределений (иначе говоря любое) , поэтому вводятся КАКИЕ ТО ЧАСТИЦЫ , походу дела обладающие все норм распределением, и в итоге проссумировав их мы получаем "ненормальное" распределение.

1. вопрос... что это за частицы?

2. вкратце, объясните мне что делают функции

cvKalmanPredict

cvKalmanCorrect

cvConDensInitSampleSet

CondProbDens , полностью объяснять че куда вставлять я по книге посмотрю, я суть не понимаю пока.

3. хотя бы один пример где я могу использовать метод конденсации (или фильтр Кальмана, суть у них одна)? То что в книге написано -

про фильтр Кальмана - машинка движется по кругу, надо найти где она будет в следующий момент это я понял. В реальности как я могу это использовать? Я же снимаю на камеру движение, я же вижу где этот человек сейчас находился... есть у меня небольшая неясность, хотелось бы услышать ваше мнение про это

про метод конденсации - в книге написано, мол, если наша машинка заехала за непрозрачную плоскость, то фильтр Кальмана нам не даст ответа куда она поехала. ... метод конденсации чтоли даст? ...

Заранее спасибо за ответ!

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


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

Задача (наипростейшая).

Дано: лист бумаги, на котором нарисованы черные (может быть и серые) круги.

Найти: Найти эти круги.

1. Представьте что мы случайно тыкаем в лист бумаги датчиком, который дает нам значение яркости (вероятности на самом деле) в точке, куда мы ткнули.

2. Вначале мы тыкаем по всему листу равномерно. Иногда натыкаемся на темные точки.

3. Эти темные точки ставим более жирными. Тыкаем так в лист 1000 раз (1000 частиц).

4. Находим взвешенную плотность точек. То есть суммируем точки (допустим обычные белые точки имеют вес 0.1 , а точки попавшие на черное 1, серые дают промежуточный вес). В результате получим уплотнение там, где расположены темные области, но мы должны их найти более точно. Нормируем, получаем распределение вероятности для следующих тыканий.

5. Дальше тыкаем датчиком не равномерно, а в соответствии с полученным ранее распределением. Тыкаем еще 1000 раз. И т.д.

ЗЫ: Все равно что искать под фонарем.

По Кальману на форуме пример с треканием шайбы есть. В этой теме http://www.compvision.ru/forum/index.php?showtopic=137 (5 пост).

Вообще поищите книжку:

"Probabilistic Robotics" авторов Sebastian Thrun, Wolfram Burgard, Dieter Fox

В инете можно найти ;)

У них и сайт есть: http://www.probabilistic-robotics.org/

Там можно найти слайды к лекциям с пояснениями.

Довольно толстая книга, как раз по вашим вопросам :)

Исходник (китайский) по фильтру частиц:

Китайские пояснения удалил, и так все понятно.



#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
#include <stdio.h>
#include <ctype.h>

//--------------------------------------------------------------------------------
int getpixel(IplImage *image, int x, int y, int *h, int *s, int *v){
*h =(uchar) image->imageData[y *image->widthStep+x * image->nChannels];
*s =(uchar) image->imageData[y *image->widthStep+ x * image->nChannels + 1];
*v =(uchar) image->imageData[y *image->widthStep+ x * image->nChannels + 2];
return 0;
}
//--------------------------------------------------------------------------------
int main( int argc, char** argv ){
CvCapture* capture = 0;
IplImage* image = 0;
IplImage* HSV = 0;

if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0]))){
capture = cvCaptureFromCAM( argc == 2 ? argv[1][0] - '0' : 0 );
}
else if( argc == 2 ){
capture = cvCaptureFromAVI( argv[1] );
}

if( !capture ){
fprintf(stderr,"Could not initialize capturing...\n");
return -1;
}

printf( "Hot keys: \n"
"\tESC - quit the program\n");

//
cvNamedWindow("Normal", CV_WINDOW_AUTOSIZE );


//-------------------------------------------------
int DP=2; //
int MP=2; //
int SamplesNum=200; //

CvConDensation* ConDens=cvCreateConDensation( DP, MP, SamplesNum );
//-----------------------------------------------------------------------

//-----------------------------------
CvMat* lowerBound; //
CvMat* upperBound; //
lowerBound = cvCreateMat(2, 1, CV_32F);
upperBound = cvCreateMat(2, 1, CV_32F);

cvmSet( lowerBound, 0, 0, 0.0 ); cvmSet( upperBound, 0, 0, 320.0 ); // Ширина
cvmSet( lowerBound, 1, 0, 0.0 ); cvmSet( upperBound, 1, 0, 240.0 ); // Высота

cvConDensInitSampleSet(ConDens, lowerBound, upperBound);
//-----------------------------------------------------------------------

//------------------------------
for(int i=0; i < SamplesNum; i++){
ConDens->flSamples[i][0]+=160.0;
ConDens->flSamples[i][1]+=120.0;
}
//-----------------------------------------------------------------------

//----------------------------
ConDens->DynamMatr[0]=1.0;ConDens->DynamMatr[1]=0.0;
ConDens->DynamMatr[2]=0.0;ConDens->DynamMatr[3]=1.0;
//-----------------------------------------------------------------------

for(;;){
IplImage* frame = 0;
int c;
int X,Y,XX,YY;
int H,S,V;

frame = cvQueryFrame( capture );
if( !frame ){
break;
}

if( !image ){
image = cvCreateImage( cvGetSize(frame), 8, 3 );
image->origin = frame->origin;
HSV = cvCreateImage( cvGetSize(frame), 8, 3 );
HSV->origin = frame->origin;
}

cvCopy( frame, image, 0 );
cvCvtColor(image ,HSV , CV_BGR2HSV);
//--------------------------------------------------
// ищут какой то цвет, наверное цвет кожи (не помню)
// но помнится нужно его править :)
//---------------------------------------------------
for(int i=0; i < SamplesNum; i++){
X=(int)ConDens->flSamples[i][0];
Y=(int)ConDens->flSamples[i][1];

if(X>=0 && X<=320 && Y>=0 && Y<=240){ //320 240
getpixel(HSV, X, Y, &H, &S, &V);
if(H<=19 && S>=48){ // //H<=19 S>=48
cvCircle(image, cvPoint(X,Y), 4, CV_RGB(255,255,255), 1);
ConDens->flConfidence[i]=1.0; // <<----------ВОТ ОНИ РЕЗУЛЬТАТЫ ТЫКАНИЯ
}
else{
ConDens->flConfidence[i]=0.0; // <<----------ВОТ ОНИ РЕЗУЛЬТАТЫ ТЫКАНИЯ
}
}
else{
ConDens->flConfidence[i]=0.0; // <<----------ВОТ ОНИ РЕЗУЛЬТАТЫ ТЫКАНИЯ
}
}
//--------------------------------------------------------------------------

//
cvConDensUpdateByTime(ConDens);

cvShowImage( "Normal", image );
c = cvWaitKey(1);

if( c == 27 ){
break;
}
}

//------------------------------------
cvReleaseImage(&image);
cvReleaseImage(&HSV);
cvReleaseConDensation(&ConDens);
cvReleaseMat( &lowerBound );
cvReleaseMat( &upperBound );
cvReleaseCapture( &capture );
cvDestroyWindow("Normal");
//---------------------------------------------

return 0;
}
[/code]

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


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

Спасибо большое на предыдущий вопрос, Smorodov!

Есть еще вопрос. В начале 10-й главы в книге Learning Open CV - рассказывается про плотный оптический поток , разреженный оптический поток - объясняются некоторые "углы" - особые точки, к которым привязывается текущая картинка, и в следующем кадре куда они передвинулись. И соответственные функции

cvGoodFeaturesToTrack - находит точки - "углы", которые будут смотреться на предмет движения.

cvFindCornerSubPix - нахождение координаты "угла" между пикселями (т.е. более точная предыдущая функция)

и наконец функция cvCalcOpticalFlowLK - выявление движения методом Люкаса Канаде

cvCalcOpticalFlowPyrLK - (тот же вариант но с применением пирамид, чтобы выявить большое движение , вблизи камеры когда объект очень большой)

Далее рассматривается cvCalcOpticalFlowHS и cvCalcOpticalFlowBM - опять таки речь про оптический поток, но с применением другого метода.

Все что я сказал более менее понятно - нахождение точки в предыдущем кадре и попытка связать ее с точкой в текущем кадре. Окей.

Вопросы:

1. что делают эти функции??? cvMeanShift() и cvCamShift ?? как я понял смотрят теми же методами опто-потока смотрят куда передвинулись точки в совокупности? ...то есть например я перед камерой прыгаю - на мне можно много точек найти, я передвинулся, все мои точки как то передвинулись и MeanShift смотрит куда передвинулся "центр тяжести" меня?? CamShift вообще не понял...- типа если я отошел от камеры то точки как бы во мне стянулись ... я хотел бы услышать Ваше мнение по этому вопросу...

2. и собственно основной вопрос, ради которого я пишу - Шаблоны ДВижения (motion templates) - ЧТО ЭТО???

cvUpdateMotionHistory ;

cvCalcMotionGradient ;

cvCalcGlobalOrientation;

cvSegmentMotion;

Огромная просьба, напишите что каждая функция делает? ...

p.s. Заранее ОГРОМНОЕ спасибо! :)

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


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

Писал как-то давно перевод руководства, полностью не закончил, но то что Вы спрашиваете там есть:

CV Руководство.pdf

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


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

ОГО! полезная вещь! ;)

А я че т в просторах интернета не нашел - спасибо Compvision.ru и Вам, Smorodov! Буду изучать и тестить!)

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


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

В придачу руководство к интелловской версии. Документы с которых делался перевод. Там значительно больше информации, и формулы видны лучше.

OpenCVManuals(orig).rar

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


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

Функция нахождения контуров

cvFindContours(greyImage, mem_storage2, &faces2, sizeof(CvContour), CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE );

1.й вопрос - почему функция описыванием прямоугольником cvBoundingRect иногда как то неправильно описывает контуры... например контур в одном месте а она его описывает в другом месте

rect2 = cvBoundingRect(faces2,1);

2й вопрос - как правильно написать строчки кода где определяется принадлежит ли точка cvPoint(x,y) контуру ??

cvFindContours(greyImage, mem_storage2, &faces2, sizeof(CvContour), CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE );

			cvZero(greyImage);

			for( ; faces2!=0 ; faces2 = faces2->h_next )

			{

				if (faces2->total >= 100)

				rect2 = cvBoundingRect(faces2,1);

				cvDrawRect(greyImage, cvPoint(rect2.x, rect2.y), cvPoint(rect2.x + rect2.width, rect2.y + rect2.height), cvScalar(255, 0, 0)); //НЕ ХОЧЕТ ПРАВИЛЬНО РИСОВАТЬ ИНОГДА

				cvDrawContours(greyImage,faces2, CV_RGB(100,200,255), CV_RGB(255,0,0),3,1,8);

			}

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×