主要参考:
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好像会闪烁的。