您的位置:首页 > 运维架构

opencv+directshow采集视频图像

2012-01-01 00:16 381 查看
主要参考:

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好像会闪烁的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: