我正在尝试使用OpenCV进行视频稳定(没有OpenCV视频稳定类)。
我的算法的步骤如下 ->
-
冲浪点提取,
-
匹配,
-
同型矩阵,
-
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_fastVideVideostabilization.pdf当我回忆时,请提供MATLAB源代码。
在您的" warpaffine(帧,扭曲,transform_avg,size)(frame.cols,frame.rows)));"函数,您必须将标志指定为are stapilization的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);
}
希望这能解决您的问题:)
冲浪不是那么快。我的工作方式是光流。首先,您必须使用GoodFeatuRestotRack()函数在第一帧上计算出良好的功能。之后,我使用FindCornerSubpix()函数进行一些最佳化。
现在,您在开始框架中具有功能点,接下来要做的就是确定光流。有几个光流函数,但是我使用的一个是opticalFlow.pyrlk(),在一个OUT参数之一中,您在当前帧中获得了功能点。因此,您可以使用FindHomography()函数来计算同构矩阵。接下来,您要做的就是倒转此矩阵,您可以轻松地使用Google找到的解释,接下来,您将warpperpective()函数称为稳定框架。
ps。我从emgucv(opencv的.NET包装器)中放置的功能,因此可能有些差异