#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:
Ваш подход должен быть в целом переработан. Я говорю не о коде — просто об архитектуре. У него большая проблема с памятью — давайте посчитаем!
-
Размер одного RGB-кадра 1920×1080: frame_size = 1920 * 1080 * 3 = 6 Мбайт
-
Сколько кадров вы хотите снять с двух камер? Например, 1 минута видео со скоростью 30 кадров в секунду: video_size = 2 камеры * 6 Мб / кадр * 60 секунд = 21 Гб! У вас есть столько памяти на процесс?
Я советую создавать очереди в разных потоках для захвата кадров и 2 потока для извлечения кадров из очередей захвата и записи их в файлы.
Комментарии:
1. вы правы, я выбрал 720p (1280×720) 24 кадра в секунду, что дает мне около 120 мб файла для 1 камеры. Также из-за очень большого размера файла я подумываю о слиянии выходных данных двух устройств в одно видео. можете ли вы помочь мне со слиянием кадров.