图像处理2打开多个摄像头



使用双目视觉这里用到了opencv和directshow两个方面的内容,本次没有用到MFC。
需要对编译器进行设置(opencv在图像处理方面很强大,但是在图像采集方面似乎只能采集一个摄像头,因此这里借用directshow进行双目图像的获取,之后就可以利用opencv进行处理)
首先新建一个console应用程序,空工程,添加一个main.cpp
一、与directshow有关的设置
首先要去下载两个类CameraDS.h CameraDS.cpp,并要拷贝目录DirectShow,因为采集图像时会用到其中的函数。下载话在CSDN上找一个双目视觉的工程,里面一般都有。
//////////////////////////////////////////////////////////////////////


//   1. 将CameraDS.h CameraDS.cpp以及目录DirectShow复制到你的项目中
//   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
//////////////////////////////////////////////////////////////////////
二、与opencv有关的设置
1全局设置


菜单Tools->Options->Directories:先设置lib路径,选择Library files,在下方填入路径:
C:\Program Files\OpenCV\lib
然后选择include files,在下方填入路径:
C:\Program Files\OpenCV\cxcore\include
C:\Program Files\OpenCV\cv\include
C:\Program Files\OpenCV\cvaux\include
C:\Program Files\OpenCV\ml\include
C:\Program Files\OpenCV\otherlibs\highgui
C:\Program Files\OpenCV\otherlibs\cvcam\include
2
然后选择source files,在下方填入路径:
C:\Program Files\OpenCV\cv\src
C:\Program Files\OpenCV\cxcore\src
C:\Program Files\OpenCV\cvaux\src
C:\Program Files\OpenCV\otherlibs\highgui
C:\Program Files\OpenCV\otherlibs\cvcam\src\windows
最后点击“ok”,完成设置。
[编辑]
项目设置
3
每创建一个将要使用OpenCV的VC Project,都需要给它指定需要的lib。菜单:Project->Settings,然后将Setting for选为All Configurations,然后选择右边的link标签,在Object/library modules附加上
cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib




注:其中opencv的1、2为一次性设置,及一旦一次设定后即记录在系统中,无需再次设置。3需要每次新建工程都要设置。




三、摄像头型号:现代HYUNDAI 舞动系列 HYC-W300高清摄像头
无驱 五玻 静态1000万像素


下面是main.cpp源代码
#include "camerads.h"
#include <highgui.h>
#include <stdio.h>


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)//如果没有摄像头,返回-1
return -1;


CCameraDS camera0;//产生对象,打开第一个摄像头
CCameraDS camera1;//产生对象,打开第二个摄像头
//if(! camera.OpenCamera(0, true)) 
//打开摄像头,指定摄像头0开始,参数2指示是否自动弹出摄像头属性页。
if(! camera0.OpenCamera(2)) //false不弹出属性窗,用代码制定宽和高
{
fprintf(stderr, "Can not open camera 0.\n");//不成功,if(!0),执行代码
return -1;
}
if(! camera1.OpenCamera(1)) 
{
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,break
break;
}


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





原文地址:https://www.cnblogs.com/libing64/p/2878757.html