OpenCV摄像头保存视频和图像

#include 
#include "highgui.h"//包含OpenCV库头文件
#include "cv.h"
using namespace std;

int main( int argc, char** argv ) {//主函数
    cvNamedWindow("Example2", CV_WINDOW_AUTOSIZE );//创建窗口,(名字,默认大小)
    CvCapture *capture   = NULL;// 视频获取结构,用来作为视频获取函数的一个参数
    CvVideoWriter *video=NULL;
    int n;
    capture = cvCreateCameraCapture(0);//打开摄像头,从摄像头中获取视频
    if(!capture) //如果不能打开摄像头给出警告
    {
        //       cout<<"Can not open the camera."<
        return -1;
    }
    IplImage* frame;//申请IplImage类型指针,就是申请内存空间来存放每一帧图像
    int i=0;
    while(1)
    {
        frame = cvQueryFrame( capture );// 从摄像头中抓取并返回每一帧
        if( !frame ) break;//如果抓取帧为空   break 打破循环否则将抓取的那一帧显示在创建的窗口上
        //创建cvvideowriter对象并分配空间,保存文件名为camera.avi,编码要在运行时选择,大小就是摄像头视频的大小,帧率为32
        if(i==0)
        video=cvCreateVideoWriter("camera.avi",CV_FOURCC('X', 'V', 'I', 'D'),25,cvSize(frame->width,frame->height)); //创建CvVideoWriter对象并分配空间
//        video=cvCreateVideoWriter("camera.avi",CV_FOURCC('M','P','4','3'),15,cvSize(frame->width,frame->height),1);
        if(video)
        {
            //cout<<"video writer has created!"<
        }
        n=cvWriteFrame(video,frame);
          printf("cvWriteFrame %d\n", n);
        i++;
        //cout<
        cvShowImage( "Example2", frame );//在窗口上显示每一帧
        char c = cvWaitKey(33);//延时,每秒钟约33帧;符合人眼观看速度;
        if( c == 27 ) break;
//         cvReleaseImage(&frame);
        //由于是死循环,而且没有控制台,当按下键盘esc键,将按键的ASCII值给C,如果CESCASCII 27)循环退出退出循环;
    }
     cvReleaseVideoWriter(&video);
    cvReleaseCapture( &capture );//释放内存;
    cvDestroyWindow( "Example2" );//销毁窗口
    return 0;
}


下面是保存图片的例子:


int main4()
{
    CvCapture* capture=cvCaptureFromCAM(-1);
    CvVideoWriter* video=NULL;
    IplImage* frame=NULL;
    int n;
    if(!capture) //如果不能打开摄像头给出警告
    {
        //cout<<"Can not open the camera."<
        return -1;
    }
    else
    {
        frame=cvQueryFrame(capture); //首先取得摄像头中的一帧
        video=cvCreateVideoWriter("camera.avi",-1,32,
                                  cvSize(frame->width,frame->height)); //创建CvVideoWriter对象并分配空间
        //保存的文件名为camera.avi,编码要在运行程序时选择,大小就是摄像头视频的大小,帧频率是32
        if(video) //如果能创建CvVideoWriter对象则表明成功
        {
            //cout<<"VideoWriter has created."<
        }
        cvNamedWindow("Camera Video",1); //新建一个窗口
        while(1)
        {
            frame=cvQueryFrame(capture); //CvCapture中获得一帧
            if(!frame)
            {
                //cout<<"Can not get frame from the capture."<
                break;
            }
             char ImagesName[1024];
                   sprintf(ImagesName, "Image%.3d.bmp", n);
                   cvSaveImage(ImagesName, frame);
            n=cvWriteFrame(video,frame); //判断是否写入成功,如果返回的是1,表示写入成功
            //cout<
            cvShowImage("Camera Video",frame); //显示视频内容的图片
            if(cvWaitKey(2)>0) break; //有其他键盘响应,则退出
        }
        cvReleaseVideoWriter(&video);
        cvReleaseCapture(&capture);
        cvDestroyWindow("Camera Video");
    }
    return 0;
}




你可能感兴趣的:(opencv)