2013-05-25 4 views
2

Я пытаюсь сделать дешевую стереокамеру, читая с двух веб-камер USB одновременно. Мой код:ошибка потоковой передачи из двух веб-камер в opencv

int main(int argc, char** argv) 
{ 
    char * window1_name = "Cam 1"; 
    char * window2_name = "Cam 2"; 
    CvCapture* capture1 = cvCaptureFromCAM(1); 
    CvCapture* capture2 = cvCaptureFromCAM(2); 
    namedWindow(window1_name, CV_WINDOW_AUTOSIZE); 
    namedWindow(window2_name, CV_WINDOW_AUTOSIZE); 


    while (1) { 
     // Get one frame                               
     IplImage* cam1_frame = cvQueryFrame(capture1); 
     IplImage* cam2_frame = cvQueryFrame(capture2); 
     usleep(100000); 
     cvShowImage(window1_name, cam1_frame); 
     cvShowImage(window2_name, cam2_frame);                                                  
     if ((cvWaitKey(10) & 255) == 27) break; 
    }                      
    cvReleaseCapture(&capture1); 
    cvReleaseCapture(&capture2); 
} 

Я получаю следующий выход.

VIDIOC_QUERYMENU: Invalid argument 
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 

Моя камера - Logitech c210, и я на Ubuntu 12.10. Когда я пытаюсь передать из одной камеры, я могу видеть каналы с каждой камеры. Одна камера - cvCaptureFromCAM (1), а другая - cvCaptureFromCAM (2), но она не будет работать одновременно. Я попытался собрать последнюю версию v4l, которая, я считаю, является тем, что использует камера. Еще ничего.

Edit:

Оказывается, я мой USB автобус поддерживается только 900 Мбайт/с, а каждая камера принимает 480 МБ/с при разрешении по умолчанию 640x480. Я использовал программу v4l2-ctl для изменения разрешения по умолчанию перед выполнением программы, и она работала при более низком разрешении.

v4l2-ctl -d /dev/video1 --set-fmt-video=width=320,height=240,pixelformat=YUYV 
v4l2-ctl -d /dev/video2 --set-fmt-video=width=320,height=240,pixelformat=YUYV 
./my_program 
+0

Вы пробовали cvCaptureFromCAM (0) и cvCaptureFromCAM (1). Потому что номер камеры по умолчанию равен 0. Попробуйте. – 2vision2

ответ

0

Возможно, вы случайно пропустили некоторые файлы заголовков. Следующий код отлично работает на моей машине. хотя я использую окна. У меня нет машины UBUNTU для тестирования. Любой, как попробуйте приведенный ниже код.

Opencv принимает «0» в качестве камеры по умолчанию. Так что сделайте это 0 и 1.

#include "opencv2/objdetect/objdetect.hpp" 
    #include "opencv2/highgui/highgui.hpp" 
    #include "opencv2/imgproc/imgproc.hpp" 
    #include "opencv2/contrib/contrib.hpp" 

    #include <stdio.h> 
    #include <iostream> 
    #include <string> 
    #include <fstream> 
    #include <sstream> 
    #include <stdlib.h> 
    #include <time.h> 
    int main(int argc, const char** argv) 
    { 
     const char * window1_name = "Cam 1"; 
     const char * window2_name = "Cam 2"; 
     CvCapture* capture1 = cvCaptureFromCAM(0); 
     CvCapture* capture2 = cvCaptureFromCAM(1); 
     namedWindow(window1_name, CV_WINDOW_AUTOSIZE); 
     namedWindow(window2_name, CV_WINDOW_AUTOSIZE); 


     while (1) { 
      // Get one frame                               
      IplImage* cam1_frame = cvQueryFrame(capture1); 
      IplImage* cam2_frame = cvQueryFrame(capture2); 
    //  sleep(100000); 
      cvShowImage(window1_name, cam1_frame); 
      cvShowImage(window2_name, cam2_frame);                                                  
      if ((cvWaitKey(10) & 255) == 27) break; 
     }                      
     cvReleaseCapture(&capture1); 
     cvReleaseCapture(&capture2); 
    } 
+0

My video0 был встроенным ноутбуком, и мой код пытался получить доступ к другим камерам. – user1505520

Смежные вопросы