2013-01-20 153 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