OpenCV摄像头采集图像问题及DirectShow的使用
2013-04-20 10:27
525 查看
在用OpenCV打开USB摄像头时,分别用两个软件采集图像结果是上面两幅,第一幅我是用OpenCV采集的,第二幅是用别人的软件采集的,感觉颜色上差异好大啊,在OpenCV感觉无法设置摄像头本身的许多属性,造成这样的原因我个人以为是两个软件用不同的库,其默认的采集图像的参数不一样,所以想用DirectShow,据说里面有一些设置属性的东西。
安装DirectShow
1、下载安装及配置OpenCV
2、下载DirectShow免费的,哈哈(http://download.csdn.net/detail/b5w2p0/5279121)
3、解压到OpenCV所在的文件夹。
4、VS2010新建Win32工程,空文档。
5、配置OpenCV(其他文章有很多这里就不说了)。
6、配置DirectShow:在属性管理器中,在VC++目录中include这一项中添加DirectShow下include文件路径。
在Library中添加DirectShow下lib路径。
7、将CameraDS.h CameraDS.cpp以及目录DirectShow复制到你的项目中
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#.E4.B8.8B.E8.BD.BD
这个路径里有你要的试验程序。也可以下载到CameraDS.h CameraDS.cpp。
8、需要的话在属性管理器中 常规下,将使用unicode字符集改成未设置,这样可以避免一些编译错误。
//////////////////////////////////////////////////////////////////////+ // Video Capture using DirectShow // Author: Shiqi Yu (shiqi.yu@gmail.com) // Thanks to: // HardyAI@OpenCV China // flymanbox@OpenCV China (for his contribution to function CameraName, and frame width/height setting) // Last modification: April 9, 2009 // // 使用说明: // 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 ////////////////////////////////////////////////////////////////////// #include <stdio.h> #include "CameraDS.h" #include <highgui.h> const char *g_szTitle = "Camera"; int main() { // 1、考虑到已经存在了显示图像的窗口,那就不必再次驱动摄像头了,即便往下驱动那也是摄像头已被占用。 if(IsWindowVisible(FindWindow(NULL, g_szTitle))) { return (-1); } //仅仅获取摄像头数目 int m_iCamCount = CCameraDS::CameraCount(); printf("There are %d cameras.\n", m_iCamCount); if(m_iCamCount == 0) { return (-1); } CCameraDS m_CamDS; //获取所有摄像头的名称 for(int i = 0; i < m_iCamCount; i++) { char szCamName[1024]; int retval = m_CamDS.CameraName(i, szCamName, sizeof(szCamName)); if(retval >0) { printf("Camera #%d's Name is '%s'.\n", i, szCamName); } else { printf("Can not get Camera #%d's name.\n", i); } } // 2、考虑到如果有多个摄像头,或者又有其中某个或某几个正在被其它程序占有,故需要逐个遍历, // 直到找到可用的为止。 int m_iCamNum = 0; // 摄像头编号 IplImage *pFrame = NULL; while(m_iCamNum < m_iCamCount) { if((! m_CamDS.OpenCamera(m_iCamNum, true , 320, 240)) || ((pFrame = m_CamDS.QueryFrame()) == NULL)) { m_iCamNum++; } else { // 找到合适的摄像头,退出循环。 break; } // 关闭摄像头,必须要关闭,因为即将要进行下一次的检测,检测前要清空当前的占用空间。 m_CamDS.CloseCamera(); } if(m_iCamNum == m_iCamCount) { fprintf(stderr, "Can not open camera or is used by another app.\n"); return (-1); } cvNamedWindow(g_szTitle); //显示 cvShowImage(g_szTitle, pFrame); while(1) { //获取一帧 pFrame = m_CamDS.QueryFrame(); //显示 cvShowImage(g_szTitle, pFrame); if (cvWaitKey(20) == 'q') { break; } } m_CamDS.CloseCamera(); //可不调用此函数,CCameraDS析构时会自动关闭摄像头 cvDestroyWindow(g_szTitle); return 0; }
9、这里我跳出了摄像头的属性设置页,没有我要的属性,还是没有达到我的效果,采集的图像还是像第一张,纠结啊!看来还有好长的路要走。
相关文章推荐
- 使用OpenCV 实现多摄像头图像处理笔记(1):DirectShow的配置过程可能出现的问题
- Qt5.3里使用OpenCV库采集摄像头图像保存为图片和视频
- opencv+directshow实现4个摄像头同步采集图像
- (转载)opencv 使用DirectShow采集图像
- 二.使用OpenCv操纵摄像头采集一幅图像
- 在wxWidgets中使用OpenCV绘制摄像头图像
- 图像凸性检测函数convexityDefects在Python2.7下使用opencv3.0的问题
- Jetson TX1开发笔记(五):TX1使用OpenCV3.1实时采集视频图像
- 四.使用OpenCv采集图像及图像边缘检测
- zynq-7000学习笔记(十六)——opencv采集USB摄像头图像
- 使用OpenCV读取摄像头图像并显示
- 在Ubuntu16.04安装OpenCV3.1并实现USB摄像头图像采集
- Visual Studio 2010 调用 DirectShow 采集摄像头图像
- 在visual studio 2010中使用opencv imread函数读取图像失败,数据为空的问题解决方法。
- 使用Qt+OpenCV+VideoInput 显示摄像头图像
- 使用DirectShow采集图像
- OpenCV ios 摄像头获取和磁盘读取的图像RGB顺序问题
- 使用 Video4Linux 采集USB摄像头的图像,并保存到一张 jpg图像文件中的程序
- opencv实现摄像头的实时图像采集与显示
- 移植opencv到开发板,摄像头在开发板6410上的采集使用(1)