视频稳定性
视频超分辨率处理
图像拼接
视频稳定性
#include <opencv2/opencv.hpp> #include <opencv2/videostab.hpp> #include <iostream> #include <string> using namespace std; using namespace cv; using namespace cv::videostab; void processing(Ptr < IFrameSource>, string outputPath ); int main(int argc,const char ** argv) { //1 准备输入视频路径 //2 建立一个运动估计器 //3 建立一个稳定器 //4 使用创建的稳定器来稳定视频 Ptr<IFrameSource > stabilizedFrames; try { //1-准备输入视频进行检查 string inputPath; string outputPath; if (argc >1) { inputPath = argv [1]; } else { inputPath = ".\\cube4.avi" ; } if (argc > 2) outputPath = argv [2]; else outputPath = ".\\cube4_stabilized.avi" ; Ptr<VideoFileSource > source = makePtr<VideoFileSource>(inputPath); cout << "frame cout (rough):" << source->count() << endl; //准备运动估计器 //首先,准备运动估计生成器 double min_inlier_ratio = 0.1; Ptr<MotionEstimatorRansacL2> est = makePtr<MotionEstimatorRansacL2>(MM_AFFINE); RansacParams ransac = est-> ransacParams(); ransac.size = 3; ransac.thresh = 5; ransac.eps = 0.5; est ->setRansacParams(ransac); est ->setMinInlierRatio(min_inlier_ratio); //2 创建一个特征检查器 int nkps = 1000; Ptr<GoodFeaturesToTrackDetector > feature_detector = makePtr<GoodFeaturesToTrackDetector >(nkps); //3 创建运动估计器 Ptr<KeypointBasedMotionEstimator> motionEstBuilder = makePtr<KeypointBasedMotionEstimator>(est); motionEstBuilder ->setDetector(feature_detector); Ptr<IOutlinerRejector>(); motionEstBuilder ->setOutlinerRejector(outlinerRejector); //准备稳定器 StabilizerBase *stabilizer = 0; //首先,准备单程或者双程稳定器 bool isTwoPass = 1; int radius_pass = 15; if (isTwoPass) { //使用双程稳定器 bool est_trim = true ; TwoPassStabilizer *twoPassStabilizer = new TwoPassStabilizer(); twoPassStabilizer->setEstimateTrimRatio(est_trim); twoPassStabilizer->setMotionStabilizer(makePtr< GaussianMotionFilter>(radius_pass)); } else { //使用一个单程稳定器 OnePassStabilizer *onePassStabilizer = new OnePassStabilizer(); onePassStabilizer->setMotionFilter(makePtr< GaussianMotionFilter>(radius_pass)); stabilizer = onePassStabilizer; } //第二,设计参数 int radius = 15; double trim_ratio = 0.1; bool incl_constr = false ; stabilizer->setFrameSource(source); stabilizer->setMotionEstimator(motionEstBuilder); stabilizer->setRadius(radius); stabilizer->setTrimRatio(trim_ratio); stabilizer->setCorrectionForInclusion(incl_constr); stabilizer->setBorderMode( BORDER_REPLICATE); //将稳定器赋值给简单框架源接口,以读取稳定帧 stabilizedFrames.reset( dynamic_cast<IFrameSource *>(stabilizer)); //处理稳定帧,并显示和保存结果 processing(stabilizeFrames, outputPath); } catch (const exception &e) { cout << "error:" << e.what() << endl; stabilizedFrames.release(); return -1; } stabilizedFrames.release(); return 0; } void processing(Ptr <IFrameSource> stabilizedFrames, string outputPath) { VideoWriter writer; Mat stabilizedFrame; int nframes = 0; double outputFps = 25; //对于每个稳定帧 while (!(stabilizedFrame= stabilizedFrames->nextFrame()).empty()) { nframes++; //初始化writer(一次),并保存稳定帧 if (!outputPath .empty()) { if (!writer.isOpened()) { writer.open( outputPath, VideoWriter ::fourcc('X', 'V', 'I', 'D'), outputFps, stabilizedFrame.size ()); } writer << stabilizedFrame; } imshow( "stabilizedFrame", stabilizedFrame); char key = static_cast <char>(waitKey(3)); if (key==27) { cout << endl;break ; } } cout << "processed frames:" << nframes << endl; cout << "finished" << endl; }
未完待续......