2014-02-07 33 views
0

我有一塊的C++代碼:cvCaptureFromCAM(CV_CAP_ANY)返回NULL

#include <opencv/highgui.h> 
#include <iostream> 

int main() 
{ 
    CvCapture* capture = cvCaptureFromCAM(CV_CAP_ANY); //tried (0) too 
    if(capture == NULL) 
     std::cout<<"NULL"<<std::endl; 

    return 0; 
} 

和使用編譯:

g++ main.cpp `pkg-config opencv --cflags` `pkg-config opencv --libs` 

./a.out結果是

NULL 

我使用OpenCV 2.4.2和Ubuntu 12.04

但我確定我的攝像頭很好,因爲以下python代碼正常工作。

import cv2 
cap = cv2.VideoCapture(0) 
ret, frame = cap.read() 
cv2.imshow('frame', frame) # it shows a correct image from the webcam 
cv2.waitKey(0) 

有沒有人有想法,爲什麼我不能讀取我的攝像頭在C + +代碼?

更新:

然後我升級到OpenCV的2.4.8和重新編譯的C++代碼。 輸出仍然NULL無論是顯示一些錯誤消息:

VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
libv4l2: error setting pixformat: Device or resource busy 
HIGHGUI ERROR: libv4l unable to ioctl S_FMT 
libv4l2: error setting pixformat: Device or resource busy 
libv4l1: error setting pixformat: Device or resource busy 
HIGHGUI ERROR: libv4l unable to ioctl VIDIOCSPICT 

NULL 

回答

1

我看到它說,「設備/資源正忙」 ...我認爲你正在使用您的攝像頭別的地方.. 。例如Skype公司等。否則,嘗試使用下面的代碼:

嘗試使用(1)替代(0)

VideoCapture cap(1); 

for(;;) 
{ 
    Mat frame; 
    cap >> frame; 
    imshow("My webcam", frame); 
} 

上面的代碼是C++格式,如果你想獲得一個IplImage結構可以添加以下行來將Mat格式的「框架」轉換爲IplImage *格式

IplImage* img = new IplImage(frame); 
cvShowImage("IplImage format webcam", img); 
+0

我不知道。 Python代碼的作品,我想我沒有運行其他程序使用網絡攝像頭。 – 01zhou

+0

好的...但我也收到了同樣的錯誤,發現我的攝像頭在另一個應用程序中忙碌。 – skm

0

然後我重新啓動系統並解決問題。那麼...

+0

我認爲問題在於你的攝像頭在我的答案中提到的地方很忙。如果你同意,請接受答案:) – skm

+0

是的,也許你是對的。謝謝。但我想知道該設備是否忙碌,爲什麼Python代碼可以工作? – 01zhou

0

默認情況下,當你將你的相機連接到你的linux系統時,一個名爲「motion」的進程將保持它的佔用。 你必須殺死它。以下命令將查找並終止「運動」。

須藤killall -9運動

執行此之後,我想你的代碼將工作。如果您設法解決問題,請分享。 謝謝

+0

謝謝,但幾年前我就開始工作了,現在我無法重現它:(反正非常感謝您! – 01zhou

+0

哦,沒關係,歡迎。:) –