【opencv学习之十七】摄像头及视频操作VideoCapture

opencv操作摄像头和视频都需要用VideoCapture类;话不多说吧,内容都在代码和注释里(Qt+opencv3);

1、打开摄像头并修改保存

//1.打开摄像头
void VideoOpen()
{
    //下面的代码在mian函数里或用其他函数调用即可
    /*VideoCapture结构体,保存图像信息,open()参数为int index(0为默认摄像头),读入摄像头视频,
           open()参数为路径,读入视频文件*/
    VideoCapture cap(0); // 打开摄像头0
    if (!cap.isOpened())  // 异常处理
    {
        QMessageBox mesg;
        mesg.about(NULL,"提示","摄像头打开失败");
        waitKey(1000);
    }
    double width = cap.get(CV_CAP_PROP_FRAME_WIDTH);  //帧宽度
    double height = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //帧高度
    double frameRate = cap.get(CV_CAP_PROP_FPS);  //帧率 x frames/s
    double totalFrames = cap.get(CV_CAP_PROP_FRAME_COUNT); //总帧数
    //输出视频相关参数信息
    qDebug()<<"视频宽度="<
效果如下:
【opencv学习之十七】摄像头及视频操作VideoCapture_第1张图片

2.读取视频文件并修改:

//2.读取并修改视频文件
void AVIopen()
{
    //    VideoCapture cap("http:/.avi");//也可以是网络视频,不过很少网站时avi格式的
    //    VideoCapture cap;        //读取视频方法二
    //    cap.open("E:\\2.avi");
    //下面的代码在mian函数里或用其他函数调用即可,我是加了按钮调用;
    /*VideoCapture结构体,保存图像信息,open()参数为int index(0为默认摄像头),读入摄像头视频,
           open()参数为路径,读入视频文件*/
    VideoCapture cap("D:\\1.avi"); // 打开摄像头0
    if (!cap.isOpened())  // 异常处理
    {
        QMessageBox mesg;
        mesg.about(NULL,"提示","摄像头打开失败");
        waitKey(1000);
    }
    /////////////////////////////创建一个视频格式并写入
    //VideoCapture的get方法返回指定视频类的相关参数信息
    double width = cap.get(CV_CAP_PROP_FRAME_WIDTH);  //帧宽度
    double height = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //帧高度
    double frameRate = cap.get(CV_CAP_PROP_FPS);  //帧率 x frames/s
    double totalFrames = cap.get(CV_CAP_PROP_FRAME_COUNT); //总帧数
    //输出视频相关参数信息
    qDebug()<<"视频宽度="<
效果如下,左边是opencv读取,右边原图:

【opencv学习之十七】摄像头及视频操作VideoCapture_第2张图片

3.视频分解,将avi视频每一帧都单独保存为一张图片:

void AVIseparate()//3.视频文件分解
{
    Mat frame;
    char outfile[50];
    VideoCapture cap("D:\\1.avi"); //创建VideoCapture类读视频
    if(!cap.isOpened())         //判断是否成功打开视频
        return;
    int totalFrame = cap.get(CV_CAP_PROP_FRAME_COUNT); //VideoCapture类的get方法获取视频总帧数
    for(int i = 1; i<=totalFrame; i++)     //for循环totalFrame次
    {
        cap>>frame;                 //读取每一帧
        if(frame.empty())           //判断帧异常
            break;
        sprintf(outfile, "D:\\allframe\\%d.bmp", i); //利用sprintf格式化图片名
        imwrite(outfile, frame);    //保存每一帧到目标地址
        imshow("video", frame);
        waitKey(15);
    }
    cap.release();
    destroyAllWindows();
    QMessageBox mesg;
    mesg.about(NULL,"信息","视频分解完毕");
}
效果如下:
【opencv学习之十七】摄像头及视频操作VideoCapture_第3张图片

4.将有序图片合成视频,注意图片大小和类型要一样,我合成的就是上面分解的视频:

void AVIcombine()//4.有序图片合成
{
    //创建VideoWriter类写视频到本地,要确定好size,不然不能够合成
    VideoWriter writer("D:\\out2.avi", CV_FOURCC('X', 'V', 'I', 'D'), 20, Size(640, 480), true);
    //VideoCapture cap;
    char filename[50];
    Mat frame;
    for(int i = 1; i<200; i++)
    {
        sprintf(filename, "D:\\allframe\\%d.bmp", i);
        frame = imread(filename);   //读图片的方法(一句就行)
        if(frame.empty())     //检测帧异常
            break;
        writer<
然后出现如下文件:

【opencv学习之十七】摄像头及视频操作VideoCapture_第4张图片


你可能感兴趣的:(opencv)