FFMpeg与OpenCV:格式转换/简单变换比较

4
我需要创建一个可以实时处理图像的系统。我已经用C++实现了一个像素格式转换系统,还可以进行一些简单的变换(目前:旋转和镜像)。
系统的输入/输出格式是以下格式的帧:
- RGB(24,32) - YUYV420、YUYV422 - JPEG - 原始灰度
例如,一个操作可能是:
- YUYV422 -> 旋转90 -> 水平翻转 -> RGB24 - 灰度 -> 旋转270 -> 垂直翻转 -> YUYV420
该系统的目标是为旋转/镜像和像素格式转换提供最佳性能。我的当前实现依赖于OpenCV,但在处理超过2k分辨率的数据时存在性能问题。
当前的实现使用cv::Mat和cv::transpose/cv::flip/cv::cvtColor,并且我优化了系统以删除过渡缓冲区并尽可能复制。
我不太想重复造轮子,我知道使用FFmpeg的swscale和一些过滤器可以实现相同的结果。我的问题是:
1. FFMpeg系统相当通用,您认为我可能会遇到此解决方案的占用空间/性能问题吗? 2. 在OpenCV中似乎对格式转换进行了某种优化,但我对FFMpeg实现没有任何了解...(注:我在具有SSE的x86_64英特尔平台上) 3. 您是否了解任何可以处理此类实时简单变换的库?
谢谢。

2k是非常大的。硬件设置中是否有足够的改进空间?(I/O带宽等) - 9dan
OpenCV可以使用FFMpeg作为其背景:https://docs.opencv.org/3.4/d0/da7/videoio_overview.html 你所说的实时是什么意思?您想要实现多少帧率?正如@9dan指出的那样,可能会有硬件限制。 - Piotr Siekański
@9dan 你有什么建议? - lp35
1个回答

1
OpenCV的实现已经针对您的配置进行了优化。不要期望从ffmpeg中获得改进。最近,OpenCV切换到了带有SSE优化的libjpeg-turbo,这可能会改善JPEG转换。

@Catree感谢您的澄清。我明白这涉及到官方发布,本地构建可以轻松启用SIMD,对吗? - Alex Cohn
1
在OpenCV中作为第三方库包含的libjpeg-turbo没有SIMD代码。是的,您应该能够安装libjpeg-turbo(例如从软件包管理器)并且OpenCV应该能够自动检测和链接到主机的libjpeg-turbo。 - Catree
嗨,Alex,你有一些资源/数字/链接可以提供这个评估吗?这是你的个人经验吗?谢谢 - lp35
OpenCV在尝试将其他格式转换为YUV时非常糟糕(例如:无法将RGB(A)转换为YUV420)。 - lp35
@lp35请查看https://stackoverflow.com/a/48125183/192373,如果您在此方面遇到问题。 - Alex Cohn
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接