Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何用快速算法稳定视频?_C++_Opencv - Fatal编程技术网

C++ 如何用快速算法稳定视频?

C++ 如何用快速算法稳定视频?,c++,opencv,C++,Opencv,我是opencv新手,我正在尝试使用快速算法()稳定视频。 我已经写了一些代码,但结果不是很好,如何提高视频稳定? 这是我的代码: #include <opencv2/opencv.hpp> #include <iostream> #include <cassert> #include <cmath> #include <fstream> using namespace cv; using namespace std; int ma

我是opencv新手,我正在尝试使用快速算法()稳定视频。 我已经写了一些代码,但结果不是很好,如何提高视频稳定? 这是我的代码:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <cassert>
#include <cmath>
#include <fstream>

using namespace cv;
using namespace std;

int main(int argc, const char * argv[]) {

Mat frame, frame_edg, prev_frame,warped;
Mat T,last_T;
vector<KeyPoint> corners,prev_corners;
vector<Point2f> corners2f,prev_corners2f;
int key = 0;

VideoCapture cap("video.mp4");//inizializzo l'oggetto VideoCapture con il mio video

if (!cap.isOpened()) {//controllo se è stato aperto
    cout<<"Impossbile aprire il video"<<endl;
    return -1;
}
double fps = cap.get(CV_CAP_PROP_FPS);//ricavo i frame per secondo
cout<<"Frame per secondo: "<<fps<<endl;

namedWindow("Sequenza Originale",CV_WINDOW_AUTOSIZE);//creo una finestra auto-dimensionante
namedWindow("Sequenza in grigio",CV_WINDOW_AUTOSIZE);
namedWindow("Warped");

while (key!=27) {

    cap >> frame;
    cvtColor(frame, frame, CV_BGR2GRAY);
    equalizeHist(frame, frame);
    vector <Point2f> prev_corners2, cur_corners2;
    vector <uchar> status;
    vector <float> err;


    imshow("Sequenza Originale", frame);
    if (!prev_frame.empty())
    {
        FAST(frame, corners, 5);//corner detection
        FAST(prev_frame, prev_corners, 5);//corner detection
        KeyPoint::convert(corners, corners2f);
        KeyPoint::convert(prev_corners, prev_corners2f);
        calcOpticalFlowPyrLK(prev_frame, frame, prev_corners2f, corners2f, status, err);//matching
        // weed out bad matches
        for(size_t i=0; i < status.size(); i++) {
            if(status[i]) {
                prev_corners2.push_back(prev_corners2f[i]);
                cur_corners2.push_back(corners2f[i]);
            }
        }
        T=estimateRigidTransform(cur_corners2, prev_corners2, false);
        // in rare cases no transform is found. We'll just use the last known good transform.
        if(T.data == NULL) {
            last_T.copyTo(T);
        }

        T.copyTo(last_T);
        warpAffine(frame, warped, T, Size(frame.cols,frame.rows));
        imshow("Warped", warped);
        prev_frame = frame.clone();
    }
    if(prev_frame.empty())
    {
        prev_frame = frame.clone();
    }
    key = waitKey(30);

}
destroyAllWindows();
return 0;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间cv;
使用名称空间std;
int main(int argc,const char*argv[]{
垫框、框边、前框、翘曲;
matt,last;
矢量角点、上角点;
矢量角2f,上一个角2f;
int键=0;
VideoCapture cap(“video.mp4”);//Ilizalizzo l'oggetto VideoCapture con il mio视频
如果(!cap.isOpened()){//controllo seèstato aperto

cout由于您使用的是特征,因此您的结果可能不太稳定,因为特征可能会出现或消失,从而导致抖动。您可能希望尝试基于找到变换的方法,该变换可以最小化整个帧中对应像素之间的强度差

当我在摆弄视频稳定时,我把它作为一个主要工具。我不确定现在是否有可用的实现,但如果你对雅可比矩阵和矩阵运算有信心的话,就不难实现。你可以从链接的纸上看到图5作为一个例子——它可以用来非常稳健地跟踪/稳定平面区域。但是你的帧可能不是真正的平面,因此你必须实现某种异常值拒绝。你还必须弄清楚如何比较帧-最后一帧与前一帧,或最后一帧与前一帧。我正在为某种timelapse视频进行稳定化工作,所以使用后一种方法,但对于真实视频,你可能会使用前一种方法,因为它允许相机位置随时间漂移