第一篇:使用DirectShow采集图像实现双目双窗口
使用DirectShow采集图像实现双目双窗口
本文档介绍的CCameraDS类调用采集函数可直接返回IplImage,使用更方便,且集成了DirectShow,勿需安装庞大的DirectX/Platform SDK。本类只在Visual C++ 6.0下进行了测试.CCameraDS中有如下函数:
CCameraDS()
构造函数
CCameraDS()
析构函数
bool OpenCamera(int nCamID, bool bDisplayProperties=true)
打开摄像头,nCamID指定打开哪个摄像头,取值可以为0,1,2,...。bDisplayProperties指示是否自动弹出摄像头属性页。
bool CCameraDS
:OpenCamera(int nCamID, bool bDisplayProperties=true, int nWidth=320, int nHeight=240):打开摄像头,nCamID指定打开哪个摄像头,取值可以为0,1,2,...。bDisplayProperties指示是否自动弹出摄像头属性页。nWidth和nHeight设置的摄像头的宽和高,如果摄像头不支持所设定的宽度和高度,则返回falsevoid CloseCamera()
关闭摄像头,析构函数会自动调用这个函数
static int CameraCount()
返回摄像头的数目。可以不用创建CCameraDS实例,采用int c=CCameraDS::CameraCount();得到结果。
static int CameraName(int nCamID, char* sName, int nBufferSize);
根据摄像头的编号返回摄像头的名字
nCamID: 摄像头编号
sName: 用于存放摄像头名字的数组
nBufferSize: sName的大小
可以不用创建CCameraDS实例,采用CCameraDS::CameraName();得到结果。int GetWidth()
返回图像宽度。
int GetHeight()
返回图像高度
IplImage * QueryFrame()
抓取一帧,返回的IplImage不可手动释放!返回图像数据的为BGR模式的Top-down(第一个字节为左上角像素),即IplImage::origin=0(IPL_ORIGIN_TL)
//////////////////////////////////////////////////////////////////////本范例根据于仕琪改编
// 使用说明:
//1.将CameraDS.h CameraDS.cpp以及目录DirectShow复制到你的项目中 //前面两者project-add to project-files
//2.菜单 Project->Settings->Settings for:(All configurations)->
//C/C++->Category(Preprocessor)->Additional include directories
//设置为 DirectShow/Include
//3.菜单 Project->Settings->Settings for:(All configurations)->Link
//->Category(Input)->Additional library directories
//设置为 DirectShow/Lib
//////////////////////////////////////////////////////////////////////
#include “camerads.h”
#include
#include
int main()
{
int cam_count;
cam_count = CCameraDS::CameraCount();//获取摄像头数目
printf(“There are %d cameras.n”, cam_count);//输出摄像头数目
for(int i=0;i < cam_count;i++)//获取所有摄像头名称并显示出来{
char camera_name[1024];//声明1024个字符空间,1024字节int retval= CCameraDS::CameraName(i,camera_name,sizeof(camera_name));//根据摄像头编号返回摄像头名字if(retval >0)
printf(“Camera #%d's Name is '%s'.n”, i, camera_name);
else
printf(“Can not get Camera #%d's name.n”, i);
}
if(cam_count==0)//如果没有摄像头,返回-1return-1;
CCameraDS camera0;//产生对象,打开第一个摄像头CCameraDS camera1;//产生对象,打开第二个摄像头//if(!camera.OpenCamera(0, true))
//打开摄像头,指定摄像头0开始,参数2指示是否自动弹出摄像头属性页。if(!camera0.OpenCamera(0,false,320,240))//false不弹出属性窗,用代码制定宽和高{
fprintf(stderr, “Can not open camera 0.n”);//不成功,if(!0),执行代码return-1;
}
}if(!camera1.OpenCamera(1,false,320,240)){fprintf(stderr, “Can not open camera 1.n”);//不成功,if(!0),执行代码return-1;} cvNamedWindow(“camera1”);//创建窗口1 cvNamedWindow(“camera2”);//创建窗口2 while(1){//获取一帧IplImage *pFrame0 = camera0.QueryFrame();IplImage *pFrame1 = camera1.QueryFrame();//显示cvShowImage(“camera1”, pFrame0);cvShowImage(“camera2”, pFrame1);if(cvWaitKey(20)== 'q')//输入按键为q,breakbreak;} camera0.CloseCamera();//可不调用此函数,CCameraDS析构时会自动关闭摄像头 camera1.CloseCamera();//可不调用此函数,CCameraDS析构时会自动关闭摄像头 cvDestroyWindow(“camera1”);cvDestroyWindow(“camera2”);return 0;
调试成功,出现两个窗口和DOS命令窗。