opencv实现视频抽帧

来源:互联网 发布:河正宇电影知乎 编辑:程序博客网 时间:2024/05/16 06:39

初学opencv,又是第一次写博客,记录一下。

可能会遇到sprintf不安全的警报,稍微再配置里改一下即可

0//抽帧

#include<stdio.h>void capture_frame(){char FileName[80];memset(FileName, 0, sizeof FileName);CvCapture* capture = cvCaptureFromAVI("F:\\006.ts");IplImage* img = 0;int i=99;while (cvGrabFrame(capture))                                      //每100帧抽取一张图片{i++;if (i %100==0){img = cvRetrieveFrame(capture);       sprintf(FileName, "e:\\006\\%d.png", i);       //该步骤是连续抽帧的核心cvSaveImage(FileName, img);          }}cvReleaseCapture(&capture);}void main(){capture_frame();}

1.//如果需要对图片进行抽帧并裁剪:

#include<stdio.h>#include<highgui.h>#include <opencv2/opencv.hpp>  #include<opencv2/highgui/highgui.hpp>using namespace std;using namespace cv;void capture_frame(){char FileName[80];memset(FileName, 0, sizeof FileName);CvCapture* capture = cvCaptureFromAVI("F:\\002.ts");int i = 99;while (cvGrabFrame(capture)){i++;if (i % 100 == 0){            Mat img = cvRetrieveFrame(capture);        // retrieve the captured frame                    Mat  B = img(Range(541, 1080), Range::all());        //1920*1080的视频,将抽帧的图像分成4份    Mat  A = B(Range::all(), Range(961, 1920));                   sprintf(FileName, "e:\\002\\%d.png", i);    imwrite(FileName, A);}}cvReleaseCapture(&capture);}void main(){capture_frame();}

2//在1的基础上想对图像的ROI进行涂黑(或者涂白涂红等)

#include<stdio.h>#include<highgui.h>#include <opencv2/opencv.hpp>  #include<opencv2/highgui/highgui.hpp>using namespace std;using namespace cv;void capture_frame(){char FileName[80];memset(FileName, 0, sizeof FileName);CvCapture* capture = cvCaptureFromAVI("F:\\006.ts");int i = 99;while (cvGrabFrame(capture)){i++;if (i % 100 == 0){   Mat img = cvRetrieveFrame(capture);        // retrieve the captured frame   Mat  A = img(Range::all(), Range(961, 1920));Mat  B= A(Range(0, 540), Range::all());sprintf(FileName, "e:\\006\\%d.png", i);imwrite(FileName,B);IplImage iplimg = B;int x = 287;int y = 72;int width = 320;int height = 40;cvSetImageROI(&iplimg, cvRect(x, y, width, height));cvAddS(&iplimg, cvScalar(-255, -255, -255), &iplimg);cvResetImageROI(&iplimg);imwrite(FileName, B);cvWaitKey(0);}}cvReleaseCapture(&capture);}void main(){capture_frame();}


0 0