opencv+directshow采集视频图像

主要参考:
http://www.opencv.org.cn/index.php/%E4%BD%BF%E7%94%A8DirectShow%E9%87%87%E9%9B%86%E5%9B%BE%E5%83%8F

CCameraDS类调用采集函数可直接返回IplImage,使用更方便,且集成了DirectShow,勿需安装庞大的DirectX/Platform SDK。
但是文中介绍的方法只能显示在OPENCV创建的窗口中,无法控制它的窗口。而且试图关闭它的窗口时,程序就会死掉。

下面的方法可以把视频显示在窗体中的控件中。
关键代码:

(1) 启动视频函数
int CCarDemoView::StartVideo()
{

CCameraDS camera;
int cam_count;

//获取摄像头数目
cam_count = CCameraDS::CameraCount();
printf("There are %d cameras.\n", cam_count);

if(cam_count==0)
   return -1;


if(! camera.OpenCamera(0, 0))
{
   AfxMessageBox("不能打开摄像头!");
   return -1;
}

CString name;
while(1)
{
   IplImage *pFrame;
   
   //获取一帧视频图像
   pFrame = camera.QueryFrame();
   name="C:\\My pictures\\test.bmp";
   cvSaveImage(name,pFrame);   // 保存采集到的图像
  
   //显示到控件所在的区域
   DrawPicToHDC(pFrame, IDC_VIDEO0);
  
   Sleep(100);
}

camera.CloseCamera(); //可不调用此函数,CCameraDS析构时会自动关闭摄像头
return 0;
}

(2)显示子函数
//将图像显示到一个static控件中
void CCarDemoView::DrawPicToHDC(IplImage *img, UINT ID)
{
CDC *pDC = GetDlgItem(ID)->GetDC();
HDC hDC= pDC->GetSafeHdc();
CRect rect;
GetDlgItem(ID)->GetClientRect(&rect);
CvvImage cimg;

cimg.CopyOf(img);
cimg.DrawToHDC(hDC,&rect);

ReleaseDC(pDC);
}

忘了说一下了:StartVideo()是用一个线程调用的,用OnTimer好像会闪烁的。

转载于:https://my.oschina.net/tofro/blog/1503147

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值