2015-10-02 5 views
1

Я пытаюсь получить доступ к нескольким USB-камерам в openCV с MacOS 10.11. Моя цель - подключить до 20 камер к компьютеру через USB-четырехканальные расширения и сделать отдельные снимки. Мне не нужно жить в прямом эфире.OpenCV несколько камер одно изображение

Я пробовал использовать следующий код, и я могу сделать одно изображение со всех камер (в настоящее время только 3, через один контроллер usb).

Вопрос заключается в том, что opencv постоянно транслирует видео в реальном времени с USB-камер или делает захват() сохраняет изображение на камере, которое можно получить с помощью retrieve()?

Я не мог найти информацию, так как opencv использует команду grab() в своем внутреннем видео-буфере или на камере.

int main(int argument_number, char* argument[]) 
{ 
    std::vector<int> cameraIDs{0,1,2}; 
    std::vector<cv::VideoCapture> cameraCaptures; 
    std::vector<std::string> nameCaptures{"a","b","c"}; 

    //Load all cameras 
    for (int i = 0;i<cameraIDs.size();i++) 
    { 
     cv::VideoCapture camera(cameraIDs[i]); 
     if(!camera.isOpened()) return 1; 

     camera.set(CV_CAP_PROP_FRAME_WIDTH, 640); 
     camera.set(CV_CAP_PROP_FRAME_HEIGHT, 480); 
     cameraCaptures.push_back(camera); 
    } 

    cv::namedWindow("a"); 
    while(true) { 
     int c = cvWaitKey(2); 
     if(27 == char(c)){ //if esc pressed. grab new image and display it. 
      for (std::vector<cv::VideoCapture>::iterator it=cameraCaptures.begin();it!=cameraCaptures.end();it++) 
      { 
       (*it).grab(); 
      } 

      int i=0; 
      for (std::vector<cv::VideoCapture>::iterator it=cameraCaptures.begin();it!=cameraCaptures.end();it++) 
      { 
       cv::Mat3b frame; 
       (*it).retrieve(frame); 
       cv::imshow(nameCaptures[i++], frame); 
      } 
     } 
    } 

    return 0; 
} 

ответ

1

Не могли бы вы сделать заявление более ясным. Вам нужен только кадр из фида или вы хотите, чтобы потоки были подключены все время.

Захват камеры Opencv всегда находится в рабочем режиме, если вы не отпустите устройство захвата. Поэтому, если вы говорите, что хотите только один кадр с устройства, тогда лучше освободить это устройство после извлечения кадра.

Другой вопрос заключается не в том, чтобы использовать захват или ретривер в среде с несколькими камерами, но лучше использовать read(), который сочетает в себе оба вышеупомянутых метода и уменьшает накладные расходы в потоках декодирования. Так что, если вы хотите сказать frame @ 2sec позицию от каждого из кулачков, то во временной области они довольно близко захвачены, как говорят в кадре x из камеры 1 захвачено положение @ 2sec, тогда кадр x на 2.00001 сек и кадр x из cam3, захваченный в 2.00015 сек. .. (временное мультиплексирование - многопоточность - внутреннее по ocv)

Надеюсь, что я поясняю в объяснении.

+0

Я хочу, чтобы поток камеры был открыт все время, без фактической отправки текущего изображения, пока я не скажу openCV, чтобы захватить изображение. –

+0

Ну, вот что я думаю. И более того, лучшим способом может быть создание общего буфера, который может сохранить последние 30 кадров. Теперь у вас есть кадры из всех потоков в вашем распоряжении. Или, может быть, я думаю, что для вашего конкретного случая, когда вы хотите, чтобы соединение оставалось установленным, но пакеты не отправляются, вам нужно написать прошивку для камеры, которая может находиться в текущей области. –

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