Jump to content
Compvision.ru
Sign in to follow this  
Smorodov

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

Recommended Posts

OpticalFlowLK.jpg

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Уважаемые форумчане! Добрый день. подскажите где ошибка, хочу воспользоваться функцией 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;

}

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

if (!first)

                {

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

                        //cvCvtColor(prevgray,cflow, CV_GRAY2BGR);


                }

Share this post


Link to post
Share on other sites

так 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 ); но значения ее ячейкам не заданы ! надо наверное им всем присвоить нули, но я не знаю как....

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

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×