关于虚拟机下Linux的opencv获取摄像头图像问题

最近在虚拟机Ubuntu14.04下运行PTAM。

配置过程参考:http://makaidong.com/zhuquan945/1/129074_12259634.html

在最后运行时想使用购买外接USB摄像头(YUYV)进行实验,但发现怎么也读取不到图片(官网下载的Code)Linux下的makefile文件的更改

CC = g++
COMPILEFLAGS =  -I /usr/include -I /usr/local/include -D_LINUX -D_REENTRANT -Wall  -O3 -march=nocona -msse3
LINKFLAGS = -L /usr/local/lib -lGVars3 -lcvd -lopencv_legacy -lopencv_core -lopencv_video -lopencv_highgui -lGLU -lGL -llapack -lblas -lgfortran

# Edit this line to change video source
VIDEOSOURCE = VideoSource_Linux_V4L.o
读取的图片为虚拟机的桌面图片:
                                     关于虚拟机下Linux的opencv获取摄像头图像问题_第1张图片

    对后面的问题进行查验后,又经过多次调试发现:仅将虚拟机的USB接口改为3.0的该Code可正常运行(知道这个结果的喔整个人都不好了 ,就这样浪费了我超长时间,不过也对OPENCV的读取问题有了进一步发现)。

一开始尝试很多次觉得是系统的V4L工作有问题,变想更改为用opencv的方式读取摄像头信息。

在git上下载了:https://github.com/jonazpiazu/PTAM  由opencv的读取文件 VideoSource_Linux_OpenCV.cc 。

make后运行仍然只能读取桌面图象。(非摄像头问题,在window下尝试了可正常捕获图片)便尝试在kdevelop下单独编写opencv的获取摄像头的程序,发现一直都不出图片,select time out  所以显示图片和一片黑。针对该问题最终找到了解决方案:https://stackoverflow.com/questions/15177313/accessing-a-webcam-from-pyside-opencv

即需要添加延时,由充足的时间对图像进行捕获(延时也不必过长)。在While下可正常获得图片帧流。变将其转到PTAM的VideoSource_Linux_OpenCV.cc下尝试发现仍然不行。后来将While语句改为顺序语句发现需要先读取几帧(该几帧显示为黑),然后后面才可以正常进行,单独的opencv尝试代码如下:

#include 
#include
#include
using namespace std;

int main(int argc, char **argv) {
    std::cout << "Hello, world!" << std::endl;
    /*
	void *mptr = new cv::VideoCapture(0);
	cv::VideoCapture* cap = (cv::VideoCapture*)mptr;
	if(!cap->isOpened()){
	cerr << "Unable to get the camera" << endl;
	exit(-1);
	}
	cv::Mat frame;
	(*cap).read(frame);      //第一次 也可将read 用 >>
	cv::imshow("1",frame);
	cv::waitKey(1);
	(*cap).read(frame);     //第二次   前俩次读取显示为全黑图
	cv::imshow("1",frame);
	cv::waitKey(1);
	(*cap).read(frame);     //第三次  从此处开始后有图
	cv::imshow("1",frame);
	cv::waitKey(1);
	cv::waitKey(0);
    */
    cv::VideoCapture capture(0);
    if (!capture.isOpened()){
	cout << "create camera capture error" << endl;
	exit(-1);
    }
    cv::Mat img;
    capture>>img;
    cv::imshow("image", img);
    cv::waitKey(1);//必须加一个延时  第一次无图
    capture>>img;
    cv::imshow("image", img);
    cv::waitKey(1);//必须加一个延时  开始有图
    cv::waitKey(0);
	
    return 0;
}


对该问题进行了总结:首先注意USB是不是3.0  我的主要问题就是这个,

                                    然后opencv的话应该注意第几帧才可以在正常读取图片以及时间的延时(在window下没有该问题 可能是虚拟机造成的原因),

                                    在PTAM的官方 Code下我没有进行延时和读取前几帧的操作,只是把虚拟机的USB改为3.0,便可以正常工作。


你可能感兴趣的:(计算机视觉)