2013-01-20 121 views
3

我在使用opencv 2.4.3访问摄像头时遇到了问题。Opencv无法访问我的摄像头

我几乎到处都是Google搜索,但我无法解决我的问题。

我的系统:

惠普ProBook 4530s - 惠普固定的高清摄像头

的Ubuntu 12.10

的OpenCV 2.4.3

如果我想捕捉我的内置摄像头,收到错误:capture is NULL

我正在使用http://opencv.willowgarage.com/wiki/CameraCapture示例代码。

示例代码:

#include "cv.h" 
#include "highgui.h" 
#include <stdio.h> 
// A Simple Camera Capture Framework 
int main() { 
CvCapture* capture = cvCaptureFromCAM(CV_CAP_ANY); 
if (!capture) { 
fprintf(stderr, "ERROR: capture is NULL \n"); 
getchar(); 
return -1; 
} 
// Create a window in which the captured images will be presented 
cvNamedWindow("mywindow", CV_WINDOW_AUTOSIZE); 
// Show the image captured from the camera in the window and repeat 
while (1) { 
// Get one frame 
IplImage* frame = cvQueryFrame(capture); 
if (!frame) { 
    fprintf(stderr, "ERROR: frame is null...\n"); 
    getchar(); 
    break; 
} 
cvShowImage("mywindow", frame); 
// Do not release the frame! 
//If ESC key pressed, Key=0x10001B under OpenCV 0.9.7(linux version), 
//remove higher bits using AND operator 
if ((cvWaitKey(10) & 255) == 27) break; 
} 
// Release the capture device housekeeping 
cvReleaseCapture(&capture); 
cvDestroyWindow("mywindow"); 
return 0; 
} 

我还的xawtv -hwscan使用输入端子与尝试。我得到这样的输出:

looking for available devices 
port 129-144 

type : Xvideo, image scaler 
name : Intel(R) Textured Video` 


/dev/video0: OK  
      [ -device /dev/video0 ] 
type : libv4l 

name : HP HD Webcam [Fixed] 

flags: capture 

那么我就可以存取权限我的摄像头输入的xawtv video0的。我想我的摄像头没有问题。 我有麻烦与opencv。

+0

如果您使用C++给这个示例代码一个尝试:http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture – Niko

+0

我尝试您的代码是在http:// docs。 opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture 它不工作 – burakim

+1

尝试在这里使用不同的数字:'VideoCapture cap(0);',例如1和2.如果这没有帮助,问题不在OpenCV中。 – Niko

回答

6

我解决我的问题在几分钟前。我决定为处理类似错误的人分享我的解决方案。

首先我没有安装一些低于包(我不记得这其中的,所以我贴全部)

中的libjpeg62-dev的

的libtiff4-dev的

的zlib1g-dev的

libjasper-dev的

的libavcodec-dev的

libdc1394-22-dev的

libgstreamer0.10-dev的

libgstreamer-插件 - base0.10-dev的

了libavformat-dev的

libv4l-dev的

libswscale-dev的

然后您应该使用此代码配置您的cmake进程

cmake -D CMAKE_BULD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_PYTHON_SUPPORT=ON USE_V4L=ON WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON USE_GStreamer=ON .. 

请注意USE_V4L = ON此代码..

我希望你在阅读我的解决方案后解决。

2
#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 

using namespace cv; 
using namespace std; 

int main() 
{ 
    VideoCapture webcam; 
    webcam.open(0); 

    if(!webcam.isOpened())//**EDITED** 
    { 
     std::cout<<"CANNOT OPEN CAM"<<std::endl; 
     return -1; 
    } 

    Mat frame; 

    while(true) 
    { 
    webcam >> frame; 
    imshow("TEST",frame); 
    waitKey(20); 
    } 
    return 0; 
} 

试试上面的代码...

+1

。 ../src/view.cpp:13:14:错误:无法从类型'bool(cv :: VideoCapture ::)()const'转换'cv :: VideoCapture :: isOpened'到类型'bool' 。 ./src/view.cpp:13:14:错误:在一元参数中! – burakim

+0

检查编辑..... –

+1

程序退出立即。我认为,它返回-1因为!网络摄像头未打开。 – burakim

0

在某些情况下,它是内置摄像头的响应时间(正如我的情况)。我发现我的HP G62上的内置摄像头在第一次opencv cap.read(frame)调用之后才“醒来”。因此,要获得从相机正面读取(在后面的代码,因此没有错误),我继续之前发出的呼吁几次:

if (!cap.read(frame)) 
{ 
    if(!cap.read(frame)) 
    { 
     if(!cap.read(frame)) 
     { 
      if(!cap.read(frame)) 
      { 
       printf("Cam read error"); 
      } 
     } 
    } 
} 

对我来说,最佳的是4读取调用,从而确保我的相机已经醒了并在运行主代码块之前开启。有可能一个简单的“waitKey”调用可以工作,并且只有两个读取调用,尽管我还没有尝试过。

+1

其实,您的情况非常有趣。您是否提供了有关您的计算机配置的额外细节? – burakim