我是opencv的初学者,但精通C#/ C ++。 我创建了一个openCV控制台应用程序,用于捕获帧数据并将其写入来自多个设备或RTSP流的视频中,效果很好。 我需要将两个单独的设备帧的输出合并为一帧,并在下面的代码段中写入视频,但是生成的视频文件已损坏。
视频捕获和视频编写器设置为以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();
}
答案 0 :(得分:0)
通常必须重构您的方法。我不是说代码,而是关于架构。内存有很大问题-让我们计算一下!
一个RGB帧1920x1080的大小:frame_size = 1920 * 1080 * 3 = 6 Mb
您要从2个摄像机捕获多少帧?例如,一分钟30 fps的视频:video_size = 2摄像头* 6 Mb /帧* 60秒= 21 Gb!每个进程有这么多内存吗?
我建议在不同线程中为捕获帧创建队列,并在2个线程中从捕获队列中提取帧并将其写入文件。