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好像会闪烁的。

你可能感兴趣的:(opencv+directshow采集视频图像)