【原文】http://blog.csdn.net/watkinsong/article/details/7588505
依然是opencv老版的API
如果在前面那个项目的基础上添加保存摄像头信息,就可以简单的实现了,在原来项目的基础上调用cvCreateVideoWriter()函数创建一个写视频文件的指针,然后把每一帧的视频文件用cvWriteFrame(writer,m_Frame);这个函数实现就可以了。
- writer=cvCreateVideoWriter("MyVideo.avi",CV_FOURCC('x','v','I','D'),25,cvSize(640,480));
上面函数中的参数大概就是创建视频文件的名字,视频压缩的格式,每秒钟的视频帧数,视频的大小。具体的参数设置请参考opencv开发文档。
关于opencv项目的配置,请参考opencv社区教程。本项目的所有配置,可以参考链接:http://blog.csdn.net/weixingstudio/article/details/7360941
两个主要的函数:
- CvCapture* capture;
- CRect rect;
- CDC *pDC;
- HDC hDC;
- CWnd *pwnd;
- void CVideoMFCDlg::OnBnClickedButton1()
- {
- // TODO: Add your control notification handler code here
- //AfxMessageBox("OK");
- if(!capture)
- {
- capture = cvCaptureFromCAM(0);
- //AfxMessageBox("OK");
- }
- if (!capture)
- {
- AfxMessageBox("无法打开摄像头");
- return;
- }
- writer=cvCreateVideoWriter("MyVideo.avi",CV_FOURCC('x','v','I','D'),25,cvSize(640,480));
- // 测试
- IplImage* m_Frame;
- m_Frame=cvQueryFrame(capture);
- CvvImage m_CvvImage;
- m_CvvImage.CopyOf(m_Frame,1);
- if (true)
- {
- m_CvvImage.DrawToHDC(hDC, &rect);
- //cvWaitKey(10);
- }
- // 设置计时器,每10ms触发一次事件
- SetTimer(1,10,NULL);
- }
- void CVideoMFCDlg::OnTimer(UINT_PTR nIDEvent)
- {
- // TODO: Add your message handler code here and/or call default
- /************************************************************************/
- /* 显示摄像头 */
- /************************************************************************/
- IplImage* m_Frame;
- m_Frame=cvQueryFrame(capture);
- CvvImage m_CvvImage;
- m_CvvImage.CopyOf(m_Frame,1);
- if (true)
- {
- m_CvvImage.DrawToHDC(hDC, &rect);
- cvWriteFrame(writer,m_Frame);
- //cvWaitKey(10);
- }
- CDialogEx::OnTimer(nIDEvent);
- }
还是那句话,用新版的API方便得多,这种方式以后应该不会再用了。