OpenCV读取视频流转至图片序列保存

来源:互联网 发布:淘宝apple store可靠么 编辑:程序博客网 时间:2024/05/16 10:09


前言:记录自己工作中用到的一些小知识!


在做图像处理的时候,经常需要将视频流装换至一帧一帧的图片序列,这时候可以借用OpenCV提供的函数。此外,

除了将转换后的图片序列以灰度图格式保存下来,代码中还包括图片缩放至原先定好的大小,具体使用的OpenCV函数

包括以下几个:

         

       CvCapture*  cvCreateFileCapture(const char* filename)//视频流分配和初始化CvCapture结构体       IplImage* cvQueryFrame(CvCapture* capture)//返回视频帧的位置       double cvGetCaptureProperty(CvCapture* capture, int property_id)//获取视频流属性,具体属性参考官网       IplImage* cvCreateImage(CvSize size, int depth, int channels)//创建格式图片       void cvCopy(const CvArr* src, CvArr* dst, const CvArr* mask=NULL)//复制单通道图像       void cvCvtColor(const CvArr* src, CvArr* dst, int code)//颜色通道转换       void cvResize(const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR)//缩放图像尺寸       void cvReleaseImage(IplImage** image)//释放已创建的图像       void cvReleaseCapture( CvCapture** capture )//释放已分配的CvCapture结构体


具体实现的C代码可参考如下:


#include <stdio.h>#include <string.h>#include <stdlib.h>#include "cv.h"#include "highgui.h"int main(){    FILE *FpFrm = NULL;    unsigned char* TmpBuf = NULL;    unsigned int iFrmNum = 0;    char OutFrm[1024];    CvSize cvFrmSize;    CvSize cvFrmReSize;    CvCapture *cvFrm;    IplImage *iFrm;    IplImage *iGrayFrm;    IplImage *iReSizeFrm;    cvFrm = cvCreateFileCapture("E:\\Test.avi");    assert(cvFrm);    iFrm = cvQueryFrame(cvFrm);    cvFrmSize = cvSize((S32)cvGetCaptureProperty(cvFrm, CV_CAP_PROP_FRAME_WIDTH),                                     (S32)cvGetCaptureProperty(cvFrm, CV_CAP_PROP_FRAME_HEIGHT));    cvFrmReSize.width = 720;    cvFrmReSize.height = 640;    TmpBuf = (uchar*)malloc(cvFrmReSize.width * cvFrmReSize.height * sizeof(U8));    while ((iFrm = cvQueryFrame(cvFrm)) != NULL)    {        iGrayFrm = cvCreateImage(cvFrmSize, IPL_DEPTH_8U, 1);        iReSizeFrm = cvCreateImage(cvFrmReSize, IPL_DEPTH_8U, 1);        sprintf(OutFrm, "E:\\Picture\\%d.y", iFrmNum);        FpFrameY = fopen(OutFrm, "wb");        if (!FpFrm)        {            printf("Error: Failed to Open File!\n");        }        if (iFrm->nChannels == 1)        {            cvCopy(iFrm, iGrayFrm, 0);        }        else        {            cvCvtColor(iFrm, iGrayFrm, CV_RGB2GRAY);        }        cvResize(iGrayFrm, iReSizeFrm, CV_INTER_LINEAR);        for (int i = 0; i < cvFrmReSize.height; i++)        {            for (int j = 0; j < cvFrmReSize.width; j++)            {                TmpBuf[i * cvFrmReSize.width + j] = iReSizeFrm->imageData[i * cvFrmReSize.width + j];            }        }        fwrite(TmpBuf, sizeof(U8), cvFrameYReSize.width * cvFrameYReSize.height, FpFrameY);        fclose(FpFrm);        cvReleaseImage(&iGrayFrm);        cvReleaseImage(&iReSizeFrm);        iFrmNum++;    }    cvReleaseCapture(&cvFrm);    free(TmpBuf);}


0 0
原创粉丝点击