使用双目视觉这里用到了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; }