【发布时间】:2019-06-26 01:34:17
【问题描述】:
我必须创建一个可以实时处理图像的系统。我已经用 C++ 实现了一个像素格式转换系统,它也可以进行一些简单的转换(目前:旋转和镜像)。
系统的输入/输出格式为以下格式的帧:
- RGB (24, 32)
- YUYV420, YUYV 422
- JPEG
- 原始灰度
例如,一个操作可以是:
- YUYV422 -> 旋转 90 -> 翻转水平 -> RGB24
- 灰度 -> 旋转 270 -> 翻转垂直 -> YUYV420
系统的目标是为旋转/镜像和像素格式转换提供最佳性能。我目前的实现依赖于 OpenCV,但在处理超过 2k 分辨率的数据时会遇到性能问题。
当前实现使用 cv::Mat 和 cv::transpose/cv::flip/cv::cvtColor,我对系统进行了优化以去除过渡缓冲区并尽可能多地复制。
不太乐意重新发明轮子,我知道使用 swscale 和 FFMpeg 的一些过滤器,可以达到相同的结果。我的问题是:
FFMpeg 系统相当通用,您认为我可能会因使用此解决方案而受到占用空间/性能警告的困扰吗?
OpenCV 中的格式转换似乎有些优化,但我不知道 FFMpeg 的实现...(注意:我在带有 SSE 的 x86_64 intel 平台上)
你知道有什么库可以实时处理这种简单的转换吗?
谢谢
【问题讨论】:
-
2k 是巨大的。硬件设置是否有足够的提升空间? (I/O 带宽等)
-
OpenCV 可以使用 FFMpeg 作为其背景:docs.opencv.org/3.4/d0/da7/videoio_overview.html 实时是什么意思?你想达到多少fps?正如@9dan 所发现的那样——可能存在硬件限制。
-
@9dan 你有什么建议?
标签: c++ performance opencv ffmpeg vision