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

Оптический поток (определяем куда движется мир) по Лукасу-Кенейду

Recommended Posts

OpticalFlowLK.jpg

Программа определения оптического потока методом Лукаса-Кенейда.

Архив с проектом тут: OpticalFlowLK.rar

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


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

Микро-игра на основе оптического потока и (или) шаблонов движения:

http://paratrooper.cup-of-net.ru/

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


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

А что же там сложного для переделки? Убирай всё, что касается Билдера (это будет интерфейс) и заменяй на стандартный OpenCV вывод.

Вообще, в примерах OpenCV есть отличный пример Лукаса-Канаде.

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


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

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

Но код выдает ошибку! Пожалуйста помогите!


#include "StdAfx.h"

#include "cv.h"

#include "highgui.h"


CvCapture* g_capture = NULL;

int main(int argc, char** argv)

{

	cvNamedWindow("Example", CV_WINDOW_AUTOSIZE );

	g_capture=cvCreateFileCapture("E:\\Станислав\\T_CAMERA.avi");

	bool first=true;

	IplImage* frame;

	IplImage* frame1=0;

	int i=0;

	IplImage* prevgray;

	IplImage* gray;

	CvMat flow;

	IplImage* cflow;

	while(1)

	{

		frame = cvQueryFrame( g_capture );

		if( !frame ) break;

		cvShowImage( "Example", frame );

		/*стандартная часть*/


		if (first)

		{

			CvSize c = cvGetSize(frame);

			frame1=cvCreateImage(c,8,3);

			gray = cvCreateImage(c,8,1);

			prevgray = cvCreateImage(c,8,1);

			flow = cvMat(c.height, c.width, CV_32FC2, NULL );

		}


		cvResize(frame,frame1,0);

		cvCvtColor(frame1,gray,CV_BGR2GRAY);


		if (!first)

		{

			cvCalcOpticalFlowFarneback(prevgray,gray,&flow,0.5, 3, 15, 3, 5, 1.2,0);

                        //вот здесь выдается ошибка на второй итерации !!

			cvCvtColor(prevgray,cflow, CV_GRAY2BGR);

			//

			cvShowImage("flow",cflow);


		}

		/*конец блока*/

		char c = cvWaitKey(0);

		if( c == 27 ) break;

		first=false;

		i++;

		cvCopy(gray,prevgray,NULL);

	}

	return 0;

}

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


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

потому что вы переводите в cvCvtColor

посмотрите в отладчике под дебагом кол-во каналов изображения(или размер) у prevgray и cflow, скорее всего на второй итерации что то портится.

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


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

потому что вы переводите в cvCvtColor

посмотрите в отладчике под дебагом кол-во каналов изображения(или размер) у prevgray и cflow, скорее всего на второй итерации что то портится.

Проверял эти параметры кучу раз, там ничего не портится, мне кажется вся проблема в cvMat которую я не правильно задаю. где бы мне посмотреть пример кода, как использовать эту функцию (для расчета оптического потока) ?

p.s В CvMat мне кажется я неправильно задаю кол-во строк и столбцов, как то по другому надо...

p.p.s код брал из книги "распознавание объектов" Кручинина

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


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

так CvMat у вас только flow

ну на всякий случай можно и проверить закоментировав.

if (!first)

                {

                        cvCalcOpticalFlowFarneback(prevgray,gray,&flow,0.5, 3, 15, 3, 5, 1.2,0);

                        //cvCvtColor(prevgray,cflow, CV_GRAY2BGR);


                }

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


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

так CvMat у вас только flow

ну на всякий случай можно и проверить закоментировав.

То что вы предлагаете закомментировать вообще никогда не выполняется в данном листинге. давайте я попробую объяснить

в самом начале я получаю кадр и спрашиваю "а первый ли это кадр?" Если да, то я снимаю размер и создаю все остальные изображения с размером моего фрейма НО применить метод cvCalcOpticalFlowFarneback Я не могу потому что мне надо хотя бы два изображения в оттенках серого - текущее и предыдущее поэтому я не захожу в цикл

if (!first) {}

после САМОГО ПЕРВОГО ПРОХОДА Я естесственно обнуляю first=false; и сохраняю "предыдущий кадр"

cvCopy(gray,prevgray,NULL);

все ! первый проход сделан, начинаем второй проход

cvCvtColor(frame1,gray,CV_BGR2GRAY); - этой строчкой я сохраняю текущий кадр в оттенках серого

и так как это уже не первый проход - захожу в функцию cvCalcOpticalFlowFarneback(prevgray,gray,&flow,0.5, 3, 15, 3, 5, 1.2,0);

на что у меня выдается ошибка , скорее всего потому что flow у меня это flow = cvMat(c.height, c.width, CV_32FC2, NULL ); но значения ее ячейкам не заданы ! надо наверное им всем присвоить нули, но я не знаю как....

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×