opencv 读取摄像头并保存

	m_capture = 0;
	m_writer = 0;
	m_frame = 0;
	m_capture = cvCaptureFromCAM(0/*m_CamIndex*/);
	int count = 0;
	m_frame = cvQueryFrame( m_capture );
	while (m_frame==NULL)
	{
		m_frame = cvQueryFrame( m_capture );
		count++;
	}
	m_writer=cvCreateVideoWriter(m_strVideoPathTemp,CV_FOURCC('X','V','I','D'),25.0,cvSize(m_frame->width,m_frame->height));

上面的代码的变量定义如下:

	CvCapture *		m_capture;
	CvVideoWriter*	m_writer;
	IplImage*		m_frame;
现在只是抓取了一帧图像,定义好了写指针但是并没有写到本地,要想将视频写入本地,有两种方法,一种用while循环,再用waitkey等待时间间隔,还可以使用定时器实现这个操作,主要用到的是三个函数:settimer、ontimer、killtimer,功能分别是设置一个定时器、定时器消息响应函数、终止定时器。

这里先设置一个定时器:

SetTimer(2,25,NULL);


接下来就需要在ontimer消息响应函数中添加代码:

void CxxView::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: Add your message handler code here and/or call default

	switch (nIDEvent)
	{
	//case 1:
	//	getProbeRecord();
	//	UpdateData(FALSE);
	//	break;
	case 2:

		CMainFrame *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;
		m_hWndStatic = pMain->m_wndNativeView.m_wndDrawContent.m_widget_NativeViedo.GetSafeHwnd();
		m_pWndStatic = FromHandle(m_hWndStatic);
		if( !m_capture ) //打开视频流失败
		{
			AfxMessageBox("数据流载入失败");
			KillTimer(2);
			return ;
		}
		m_frame = cvQueryFrame( m_capture );
		if (m_frame)
		{
			int frameH    = (int) cvGetCaptureProperty(m_capture, CV_CAP_PROP_FRAME_HEIGHT);    
			int frameW    = (int) cvGetCaptureProperty(m_capture, CV_CAP_PROP_FRAME_WIDTH);    

			cvWriteFrame(m_writer, m_frame);
			m_pWndStatic->GetClientRect(&m_oRect);
			videoFrameDisplay(m_frame,m_oRect,m_hWndStatic,m_pWndStatic->GetDC(),1);
		}
		break;
	}

	CView::OnTimer(nIDEvent);
}


videoFrameDisplay()是自己写的函数,用来显示视频在指定的mfc的控件上。


                
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值