我正在将 Luxonis Oak-1 摄像头的视频流传输到运行 Linux 的 Nvidia Jetson Orin AGX。我正在将一个脚本上传到我的相机,将图像编码为 mjpeg。 图像通过 TCP 传输到计算机。我在 python 上实现了低延迟和快速的摄像头输入(大约 27 fps)。然而,我正在制作一个 C++ 应用程序,并且在 C++ 上的帧速率(大约 8 fps)上得到的结果很差。
#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;
}
Decode time: 0.111579 seconds
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")
Decode time: 0.010248184204101562 seconds
上面的结果表明 cv::imdecode 在 c++ 上比在 python 上慢得多。 这会导致 python 中的相机输入流畅且快速,而使用 c++ 脚本的相机输入则较差且滞后,即使它们接收到相同的数据。
我尝试用 libjpeg-turbo 替换 cv::imdecode ,效果更好,但仍然太慢。
代码使用 cmake 版本 3.28.3 和 gcc 编译器(Ubuntu 11.4.0-1ubuntu1~22.04)11.4.0 进行编译。 C++版本:20 OpenCV 是在清单模式下使用 vcpkg 构建的 cuda 支持。
在 C++ 上以调试模式构建,这解释了处理速度较慢的原因。在发布模式下构建后 发布模式通常可实现 0.014769 秒的解码时间。