стабилизация видео с использованием opencv

Я пытаюсь сделать стабилизацию видео с помощью opencv (без класса стабилизации видео opencv).

шаги для моего алгоритма следующие ->

  1. Извлечение точек серфинга,

  2. Matching,

  3. Гомографическая матрица,

  4. warpPerspective

И выходное видео вообще не стабилизировано :(. Оно просто выглядит как оригинальное видео. Не смог найти и ссылочный код для стабилизации видео. Я следовал описанной процедуре Вот . Кто-нибудь может мне помочь, сообщив мне, где я ошибаюсь, или предоставив мне ссылку на исходный код, чтобы улучшить мой алгоритм.

Пожалуйста помоги. Спасибо

2

Решение

Вы можете использовать мой фрагмент кода в качестве отправной точки (не очень стабильный, но, кажется, он работает):

#include "opencv2/opencv.hpp"#include <iostream>
#include <vector>
#include <stdio.h>

using namespace cv;
using namespace std;

int main(int ac, char** av)
{
VideoCapture capture(0);
namedWindow("Cam");
namedWindow("Camw");
Mat frame;
Mat frame_edg;
Mat prev_frame;
int k=0;
Mat Transform;
Mat Transform_avg=Mat::eye(2,3,CV_64FC1);
Mat warped;
while(k!=27)
{
capture >> frame;
cv::cvtColor(frame,frame,cv::COLOR_BGR2GRAY);
cv::equalizeHist(frame,frame);
cv::Canny(frame,frame_edg,64,64);
//frame=frame_edg.clone();
imshow("Cam_e",frame_edg);
imshow("Cam",frame);

if(!prev_frame.empty())
{
Transform=estimateRigidTransform(frame,prev_frame,0);
Transform(Range(0,2),Range(0,2))=Mat::eye(2,2,CV_64FC1);
Transform_avg+=(Transform-Transform_avg)/2.0;
warpAffine(frame,warped,Transform_avg,Size( frame.cols, frame.rows));

imshow("Camw",warped);
}

if(prev_frame.empty())
{
prev_frame=frame.clone();
}

k=waitKey(20);
}
cv::destroyAllWindows();
return 0;
}

Вы также можете найти бумагу: Chen_Halawa_Pang_FastVideoStabilization.pdf, насколько я помню, был предоставлен исходный код MATLAB.

3

Другие решения

В вашем «warpAffine (frame, warped, Transform_avg, Size (frame.cols, frame.rows));» функция, вы должны указать FLAG как WARP_INVERSE_MAP для стабилизации.

Пример кода, который я написал:

Mat src, prev, curr, rigid_mat, dst;

VideoCapture cap("test_a3.avi");

while (1)
{
bool bSuccess = cap.read(src);
if (!bSuccess) //if not success, break loop
{
cout << "Cannot read the frame from video file" << endl;
break;
}

cvtColor(src, curr, CV_BGR2GRAY);

if (prev.empty())
{
prev = curr.clone();
}

rigid_mat = estimateRigidTransform(prev, curr, false);

warpAffine(src, dst, rigid_mat, src.size(), INTER_NEAREST|WARP_INVERSE_MAP, BORDER_CONSTANT);// ---------------------------------------------------------------------------//

imshow("input", src);
imshow("output", dst);

Mat dst_gray;
cvtColor(dst, dst_gray, CV_BGR2GRAY);
prev = dst_gray.clone();

waitKey(30);
}

Надеюсь, что это решит вашу проблему 🙂

2

Прибой не такой быстрый. я работаю с Optical Flow. Сначала вы должны рассчитать хорошие функции в первом кадре с помощью функции GoodFeaturesToTrack (). После этого я делаю некоторую оптимизацию с помощью функции FindCornerSubPix ().

Теперь у вас есть характерные точки в вашем начальном кадре, следующее, что вам нужно сделать, это определить оптический поток. Существует несколько функций оптического потока, но я использую OpticalFlow.PyrLK (), в одном из параметров которого вы получаете точки возможностей в текущем кадре. При этом вы можете вычислить матрицу гомографии с помощью функции FindHomography (). Далее вам нужно инвертировать эту матрицу, объяснение, которое вы можете легко найти с помощью Google, затем вы вызываете функцию WarpPerspective () для стабилизации вашего фрейма.

PS. Функции, которые я здесь поставил, от EmguCV, оболочки .NET для OpenCV, поэтому могут быть некоторые отличия

0
По вопросам рекламы [email protected]