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

Сравнение двух кадров видео

Recommended Posts

Использую OpenCV 2.3 и C++

Каким образом получить доступ в одном цикле к двух последовательным кадрами видеопоследовательности?


VideoCapture capture("C:\\ice_cif.avi");

double rate= capture.get(CV_CAP_PROP_FPS);

int delay= 1000/rate;

Mat frame;

namedWindow("frame");

bool stop(false);

	while(!stop){

		if(!capture.read(frame)) break;	


		for(int c=0;c<frame.cols;c+=16)

			for(int r=0;r<frame.rows;r+=16)

			{

                                //здесь и ко второму кадру обратиться

				line(frame,Point(c,r),Point(c,r),(60,80,120),1,1,0);

			}


		imshow("frame",frame);

		if(waitKey(delay)>=0)  stop = true;

	}

	capture.release();

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


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

Запоминать предыдущий захваченный в глобальной переменной не годится?

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


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

Цель - сравнить два последовательных кадра поблочно в одном цикле.

Запоминать предыдущий захваченный в глобальной переменной не годится?

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


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

Форматы видео есть разные. Но чаще всего для получения n-го кадра нужно декодировать кадр с номером n-1 и так далее до ключевого кадра. А если ключевых кадров всего 1 на весь файл. То мы имеем только 2 выхода. Декодировать весь видео в несжатый формат. Либо использовать запоминание предыдущих кадров.

Иначе для получения произвольного нам придётся проходить по всему файлу, что очень сильно замедлит работу.

Так что для вашей задачи лучше, а можно сказать и единственный верный/возможный способ - это запомнить кадр на предыдущем витке цикла.

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


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

В принципе, я взял тестовое видео, в .y4m. Сохранил его в .avi с помощью VirtualDub в несжатом виде. Буду признателен, если покажете, как в OpenCV два последовательных кадра сравнить.

Форматы видео есть разные. Но чаще всего для получения n-го кадра нужно декодировать кадр с номером n-1 и так далее до ключевого кадра. А если ключевых кадров всего 1 на весь файл. То мы имеем только 2 выхода. Декодировать весь видео в несжатый формат. Либо использовать запоминание предыдущих кадров.

Иначе для получения произвольного нам придётся проходить по всему файлу, что очень сильно замедлит работу.

Так что для вашей задачи лучше, а можно сказать и единственный верный/возможный способ - это запомнить кадр на предыдущем витке цикла.

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


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

А что значит сравнить?

Есть разные варианты:

- Вычислить интегральную степень отличия кадров (получаем одно число, характеризующее степень отличия)

- Локализовать отличающиеся участки (получаем области отличий)

Два соседних кадра не должны сильно отличаться, если это конечно не переключение между разными кусками видео. Тут можно просто найти разность (что-то типа cvAbsDiff), а потом эту разность суммировать (можно заюзать cvReduce).

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


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

Мне не нужны функции OpenCV(cvAbsDiff или cvReduce). Представьте, что я хочу реализовать один из методов BMA. А это значит попиксельная обработка двух последовательных кадров.

А что значит сравнить?

Есть разные варианты:

- Вычислить интегральную степень отличия кадров (получаем одно число, характеризующее степень отличия)

- Локализовать отличающиеся участки (получаем области отличий)

Два соседних кадра не должны сильно отличаться, если это конечно не переключение между разными кусками видео. Тут можно просто найти разность (что-то типа cvAbsDiff), а потом эту разность суммировать (можно заюзать cvReduce).

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


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

BMA - надо думать, это Bayesian Model Averaging, или что то еще?

Все еще не очень понятно на чем затык, в методе или реализации?

Если в реализации, то каких пунктов метода?

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


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

Block Matching Algorithm

Самый простой метод - FSA (Full Search Algorithm).

Непонятно, как попиксельно сравнить два кадра в OpenCV без функций OpenCV на весь кадр. (хотел реализовать свой метод).

BMA - надо думать, это Bayesian Model Averaging, или что то еще?

Все еще не очень понятно на чем затык, в методе или реализации?

Если в реализации, то каких пунктов метода?

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


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

Разобрался в итоге, может кому пригодится:


int main()

{

	VideoCapture capture("C:\\ice_cif.avi");

	double rate= capture.get(CV_CAP_PROP_FPS);

	int delay= 1000/rate;

	Mat currFrame;

	Mat prevFrame;


	namedWindow("currFrame");

	namedWindow("prevFrame");


	capture.read(currFrame);

	currFrame.copyTo(prevFrame);


	bool stop(false);

	while(!stop){

		if(!capture.read(currFrame)) break;	


		imshow("currFrame",currFrame);

		imshow("prevFrame",prevFrame);

		currFrame.copyTo(prevFrame);


		if(waitKey(delay)>=0)  stop = true;

	}

	capture.release();

}

Block Matching Algorithm

Самый простой метод - FSA (Full Search Algorithm).

Непонятно, как попиксельно сравнить два кадра в OpenCV без функций OpenCV на весь кадр. (хотел реализовать свой метод).

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×