您的位置:首页 > 运维架构

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

2014-12-17 19:03 549 查看
最近在做一个关于在摄像头中捕捉人脸并追踪人的眼睛的项目,在编程过程中发现始终无法打开摄像头。

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

一 、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

http://write.blog.csdn.net/postlist

e-mail: Hansyang@buaa.edu.cn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐