gpt4 book ai didi

c++ - OpenCV:VideoWriter 的写入是否应该在独立线程中运行?

转载 作者:太空宇宙 更新时间:2023-11-03 22:59:09 25 4
gpt4 key购买 nike

我正在编写一个程序来读取多个网络摄像头,将图片拼接在一起并将它们保存到视频文件中。

  1. 我应该使用线程来捕获图像并将生成的大图像写入文件吗?
  2. 如果是,我应该使用 c+11 还是 boost?
  3. 您是否有一些简单的示例代码来说明如何避免出现竞速情况?

我已经找到了this thread它使用线程进行写入,但似乎无法避免竞争条件。

我程序的伪代码:

camVector //vector with cameras
VideoWriter outputVideo //outputs the video

while(true){
for(camera:camVector){
camera.grab() //send signal to grab picture
}
picVector = getFrames(camVector) //collect frames of all cameras into a Vector

Mat bigImg = stitchPicTogether(picVector)

outputVideo.write(bigImg)
}

最佳答案

这就是我要做的:

camVector //vector with cameras
VideoWriter outputVideo //outputs the video

for(camera:camVector) camera.grab(); // request first frame

while(true){
parallel for(camera:camVector) {
frame = getFrame(camera);
pasteFrame(/* destination */ bigImg,
/* geometry */ geometry[camera],
/* source */ frame
);
camera.grab(); // request next frame, so the webcam driver can start working
// while you write to disk
}
outputVideo.write(bigImg)
}

这种拼接是并行完成的,如果您的网络摄像头驱动程序有不同的时间,您可以在等待另一个网络摄像头的帧时开始拼接从一个网络摄像头收到的内容。

关于实现,您可以简单地使用 OpenMP ,已经在 OpenCV 中使用,类似于 #pragma omp parallel。如果您更喜欢 C++,请给英特尔 TBB试一试,很酷。

或者如您所说,您可以使用原生 C++11 线程或 boost。在两者之间进行选择主要取决于您的工作环境:如果您打算使用较旧的编译器,boost 更安全。

在所有情况下,不需要锁定,除了最后的连接,等待所有线程完成他们的工作。

如果您的瓶颈是写入输出,则限制因素是磁盘 IO 或视频压缩速度。对于磁盘,您可以尝试更改编解码器和/或压缩更多。对于压缩速度,请查看 GPU 编解码器,如 this .

关于c++ - OpenCV:VideoWriter 的写入是否应该在独立线程中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22373627/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com