关于opencv2.4.9和VS2013在windows7下无法打开摄像头的问题的扯

最近在做一个关于在摄像头中捕捉人脸并追踪人的眼睛的项目,在编程过程中发现始终无法打开摄像头。

后来发现的问题主要集中在以下几个方面:

一 、opencv 的数据不足以支持获取的视频图像。

"buffers do not match"问题是捕捉的视频的图像的分辨率高于opencv 中的数据结构能够承载的最大的数据范围,所以导致虽然能够打开摄像头,但是显示出错,,所以在debug时会报错。

这种问题的解决 办法是在获取到frame后,对frame进行参数的重新设置,降低图像的分辨率,再显示图像,就没问题了。

二 、摄像头的驱动不匹配

始终无法打开摄像头,也不报错。

使用cvCaptureFromCam(-1)始终返回为NULL.或者使用CreateCameraCapture都无法打开摄像头。这种情况主要是由于windows 下的摄像头的都用了Directshow,而opencv 的这两个函数都需要使用VFW的驱动才能正常使用。解决办法:比较复杂,可以在VS中加入DirectShow的一些函数库,来实现二者的兼容。

主要就是这两个问题。起先为了解决摄像头打不开的问题,查找了无数的例程,始终解决不了问题。最后在opencv2.4.9的自带的几个sample中找到了一个使用摄像头的程序,发现其中并没有使用CvCaptureFromCam和CreateCameraCapture函数,而是使用了一个VideoCapture cap的结构来解决问题。

下面为代码:

#include <opencv2/opencv.hpp>#include <iostream>using namespace cv;int main(int argc, char** argv){ VideoCapture cap; if (argc > 1) cap.open(argv[1]); else cap.open(0); if (!cap.isOpened()) { std::cerr << "Cannot read video. Try moving video file to sample directory." << std::endl; return -1; } namedWindow("FG Segmentation", WINDOW_NORMAL); for (;;) { cap >> frame; if (frame.empty()) break; frame.copyTo(segm);imshow("FG Segmentation", segm); int c = waitKey(30); if (c == ‘q’ || c == ‘Q’ || (c & 255) == 27) break; } return 0;}

尝试了这么久,终于实现了基本的功能,好开心!!

来源:

杨豪 Hans

e-mail: Hansyang@buaa.edu.cn

以一种进取的和明智的方式同它们奋斗。

关于opencv2.4.9和VS2013在windows7下无法打开摄像头的问题的扯

相关文章:

你感兴趣的文章:

标签云: