slicktail 1 Жалоба Опубликовано March 16, 2012 Использую 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(); Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано March 16, 2012 Запоминать предыдущий захваченный в глобальной переменной не годится? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
slicktail 1 Жалоба Опубликовано March 16, 2012 Цель - сравнить два последовательных кадра поблочно в одном цикле. Запоминать предыдущий захваченный в глобальной переменной не годится? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Pavia00 32 Жалоба Опубликовано March 16, 2012 Форматы видео есть разные. Но чаще всего для получения n-го кадра нужно декодировать кадр с номером n-1 и так далее до ключевого кадра. А если ключевых кадров всего 1 на весь файл. То мы имеем только 2 выхода. Декодировать весь видео в несжатый формат. Либо использовать запоминание предыдущих кадров. Иначе для получения произвольного нам придётся проходить по всему файлу, что очень сильно замедлит работу. Так что для вашей задачи лучше, а можно сказать и единственный верный/возможный способ - это запомнить кадр на предыдущем витке цикла. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
slicktail 1 Жалоба Опубликовано March 16, 2012 В принципе, я взял тестовое видео, в .y4m. Сохранил его в .avi с помощью VirtualDub в несжатом виде. Буду признателен, если покажете, как в OpenCV два последовательных кадра сравнить. Форматы видео есть разные. Но чаще всего для получения n-го кадра нужно декодировать кадр с номером n-1 и так далее до ключевого кадра. А если ключевых кадров всего 1 на весь файл. То мы имеем только 2 выхода. Декодировать весь видео в несжатый формат. Либо использовать запоминание предыдущих кадров. Иначе для получения произвольного нам придётся проходить по всему файлу, что очень сильно замедлит работу. Так что для вашей задачи лучше, а можно сказать и единственный верный/возможный способ - это запомнить кадр на предыдущем витке цикла. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано March 16, 2012 А что значит сравнить? Есть разные варианты: - Вычислить интегральную степень отличия кадров (получаем одно число, характеризующее степень отличия) - Локализовать отличающиеся участки (получаем области отличий) Два соседних кадра не должны сильно отличаться, если это конечно не переключение между разными кусками видео. Тут можно просто найти разность (что-то типа cvAbsDiff), а потом эту разность суммировать (можно заюзать cvReduce). Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
slicktail 1 Жалоба Опубликовано March 17, 2012 Мне не нужны функции OpenCV(cvAbsDiff или cvReduce). Представьте, что я хочу реализовать один из методов BMA. А это значит попиксельная обработка двух последовательных кадров. А что значит сравнить? Есть разные варианты: - Вычислить интегральную степень отличия кадров (получаем одно число, характеризующее степень отличия) - Локализовать отличающиеся участки (получаем области отличий) Два соседних кадра не должны сильно отличаться, если это конечно не переключение между разными кусками видео. Тут можно просто найти разность (что-то типа cvAbsDiff), а потом эту разность суммировать (можно заюзать cvReduce). Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано March 17, 2012 BMA - надо думать, это Bayesian Model Averaging, или что то еще? Все еще не очень понятно на чем затык, в методе или реализации? Если в реализации, то каких пунктов метода? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
slicktail 1 Жалоба Опубликовано March 17, 2012 Block Matching Algorithm Самый простой метод - FSA (Full Search Algorithm). Непонятно, как попиксельно сравнить два кадра в OpenCV без функций OpenCV на весь кадр. (хотел реализовать свой метод). BMA - надо думать, это Bayesian Model Averaging, или что то еще? Все еще не очень понятно на чем затык, в методе или реализации? Если в реализации, то каких пунктов метода? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
slicktail 1 Жалоба Опубликовано March 18, 2012 Разобрался в итоге, может кому пригодится: 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 на весь кадр. (хотел реализовать свой метод). Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах