关于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
#include
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: [email protected]


你可能感兴趣的:(opencv,之,混乱的初期学习)