Я пытаюсь сделать стабилизацию видео с помощью opencv (без класса стабилизации видео opencv).
шаги для моего алгоритма следующие ->
Извлечение точек серфинга,
Matching,
Гомографическая матрица,
warpPerspective
И выходное видео вообще не стабилизировано :(. Оно просто выглядит как оригинальное видео. Не смог найти и ссылочный код для стабилизации видео. Я следовал описанной процедуре Вот . Кто-нибудь может мне помочь, сообщив мне, где я ошибаюсь, или предоставив мне ссылку на исходный код, чтобы улучшить мой алгоритм.
Пожалуйста помоги. Спасибо
Вы можете использовать мой фрагмент кода в качестве отправной точки (не очень стабильный, но, кажется, он работает):
#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.
В вашем «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);
}
Надеюсь, что это решит вашу проблему 🙂
Прибой не такой быстрый. я работаю с Optical Flow. Сначала вы должны рассчитать хорошие функции в первом кадре с помощью функции GoodFeaturesToTrack (). После этого я делаю некоторую оптимизацию с помощью функции FindCornerSubPix ().
Теперь у вас есть характерные точки в вашем начальном кадре, следующее, что вам нужно сделать, это определить оптический поток. Существует несколько функций оптического потока, но я использую OpticalFlow.PyrLK (), в одном из параметров которого вы получаете точки возможностей в текущем кадре. При этом вы можете вычислить матрицу гомографии с помощью функции FindHomography (). Далее вам нужно инвертировать эту матрицу, объяснение, которое вы можете легко найти с помощью Google, затем вы вызываете функцию WarpPerspective () для стабилизации вашего фрейма.
PS. Функции, которые я здесь поставил, от EmguCV, оболочки .NET для OpenCV, поэтому могут быть некоторые отличия