Объедините кадр захвата двух разных устройств в один кадр и запишите видео

#c #opencv

#c #opencv #c

Вопрос:

Я новичок в opencv, но хорошо разбираюсь в C # / C . Я создал консольное приложение OpenCV для захвата и записи данных кадров в видео с нескольких устройств или RTSP-потоков, которое работает нормально. Мне требуется объединить выходные данные двух отдельных устройств в один кадр и записать в video, я сделал это во фрагменте ниже, но сгенерированный видеофайл поврежден.

Захват видео и устройство записи видео настроены на захват с разрешением 1920 x 1080.

   for (int i = 0; i < devices; i  ) {
  Mat frame;
  Mat f1, f2;
  //Grab frame from camera capture
  if (videoCapturePool[i].grab()) {
    videoCapturePool[i].retrieve(f1);
    f2 = f1.clone();
    if (isPause) {
      circle(f1, Point(f1.size().width / 2, f1.size().height / 2), 10, (255, 255, 10), -1);
      circle(f2, Point(f2.size().width / 2, f2.size().height / 2), 10, (255, 255, 10), -1);
    }
    hconcat(f1, f2, frame);

    imshow("Output", frame);

    waitKey(10);

    frameData[i].camerFrames.push_back(frame);
  }
  f1.release();
  f2.release();

}

for (int i = 0; i < devices; i  ) {
  int32_t frame_width(static_cast < int32_t > (videoCapturePool[i].get(CV_CAP_PROP_FRAME_WIDTH)));
  int32_t frame_height(static_cast < int32_t > (videoCapturePool[i].get(CV_CAP_PROP_FRAME_HEIGHT)));

  VideoWriter vidwriter = VideoWriter(videoFilePaths[i], CV_FOURCC('M', 'J', 'P', 'G'), 30, Size(frame_width, frame_height), true);

  videoWriterPool.push_back(vidwriter);
  writer << frameData[i].camerFrames.size() << endl;
  for (size_t j = 0; j < frameData[i].camerFrames.size(); j  ) {
    //write the frame
    videoWriterPool[i].write(frameData[i].camerFrames[j]);
  }
  frameData[i].camerFrames.clear();
}
  

Ответ №1:

Ваш подход должен быть в целом переработан. Я говорю не о коде — просто об архитектуре. У него большая проблема с памятью — давайте посчитаем!

  1. Размер одного RGB-кадра 1920×1080: frame_size = 1920 * 1080 * 3 = 6 Мбайт

  2. Сколько кадров вы хотите снять с двух камер? Например, 1 минута видео со скоростью 30 кадров в секунду: video_size = 2 камеры * 6 Мб / кадр * 60 секунд = 21 Гб! У вас есть столько памяти на процесс?

Я советую создавать очереди в разных потоках для захвата кадров и 2 потока для извлечения кадров из очередей захвата и записи их в файлы.

Комментарии:

1. вы правы, я выбрал 720p (1280×720) 24 кадра в секунду, что дает мне около 120 мб файла для 1 камеры. Также из-за очень большого размера файла я подумываю о слиянии выходных данных двух устройств в одно видео. можете ли вы помочь мне со слиянием кадров.