OpenCVs imdecode 在 C++ 中解码 MJPEG 时速度很慢

问题描述 投票:0回答:1

概述

我正在将 Luxonis Oak-1 摄像头的视频流传输到运行 Linux 的 Nvidia Jetson Orin AGX。我正在将一个脚本上传到我的相机,将图像编码为 mjpeg。 图像通过 TCP 传输到计算机。我在 python 上实现了低延迟和快速的摄像头输入(大约 27 fps)。然而,我正在制作一个 C++ 应用程序,并且在 C++ 上的帧速率(大约 8 fps)上得到的结果很差。

最小可重现示例 C++ 脚本

#include <opencv2/opencv.hpp>
#include <chrono>
#include <iostream>
#include <vector>

int main() {
    cv::Mat blackFrame = cv::Mat::zeros(cv::Size(1920, 1080), CV_8UC3);

    std::vector<uchar> encodedBuffer;
    cv::imencode(".jpg", blackFrame, encodedBuffer);

    auto start = std::chrono::high_resolution_clock::now();

    cv::Mat decodedImage = cv::imdecode(encodedBuffer, cv::IMREAD_COLOR);

    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> elapsed = end - start;

    std::cout << "Decode time: " << elapsed.count() << " seconds" << std::endl;

    return 0;
}

C++ 的输出:

Decode time: 0.111579 seconds

Python 中的最小可重现示例

import cv2
import numpy as np
import time

black_frame = np.zeros((1080, 1920, 3), dtype=np.uint8)
_, encoded_frame = cv2.imencode('.jpg', black_frame)

start_time = time.time()
decoded_image = cv2.imdecode(encoded_frame, cv2.IMREAD_COLOR)
end_time = time.time()

elapsed_time = end_time - start_time
print(f"Decode time: {elapsed_time} seconds")

Python 的输出:

Decode time: 0.010248184204101562 seconds

结论

上面的结果表明 cv::imdecode 在 c++ 上比在 python 上慢得多。 这会导致 python 中的相机输入流畅且快速,而使用 c++ 脚本的相机输入则较差且滞后,即使它们接收到相同的数据。

我尝试用 libjpeg-turbo 替换 cv::imdecode ,效果更好,但仍然太慢。

编辑1

代码使用 cmake 版本 3.28.3 和 gcc 编译器(Ubuntu 11.4.0-1ubuntu1~22.04)11.4.0 进行编译。 C++版本:20 OpenCV 是在清单模式下使用 vcpkg 构建的 cuda 支持。

编辑2

OpenCV 构建配置

Python 链接 Cpp链接

编辑 3 - 通过在发布模式下构建来解决

在 C++ 上以调试模式构建,这解释了处理速度较慢的原因。在发布模式下构建后 发布模式通常可实现 0.014769 秒的解码时间。

python c++ opencv tcp luxonis
1个回答
0
投票

解决方案

C++ 脚本是在调试模式下构建的。在发布模式下构建脚本解决了这个问题。 在发布模式下构建后,解码时间达到了 0.00828223 秒。

首先由Dan Mašek

解决
© www.soinside.com 2019 - 2024. All rights reserved.