3.4.2 JDK 示例参考
基础示例
JDK 数据帧格式
JDK 模块间默认使用 JdkFrame
数据结构进行数据传递,定义如下:
class JdkFrame {
public:
JdkFrame(int dma_fd_, size_t size_, int w, int h);
~JdkFrame();
// 拷贝 DMA 缓冲区数据到主机内存并返回指针
unsigned char* toHost() const;
// 克隆数据至 vector
std::vector<unsigned char> Clone() const;
// 手动释放映射(如有必要)
// 保存为 YUV NV12 格式文件
bool saveToFile(const std::string& filename) const;
bool loadFromFile(const std::string& filename, size_t expected_size);
int getDMAFd() const;
size_t getSize() const { return size_; }
int getWidth() const { return width_; }
int getHeight() const { return height_; }
int MemCopy(const uint8_t* nalu, int nalu_size, int offset = 0);
private:
size_t size_; // 数据总大小,NV12格式宽高相关
int width_;
int height_;
JdkDma dma_;
std::shared_ptr<JdkDmaBuffer> data;
};
MIPI 摄像头采集
// 打开摄像节点
auto camera = JdkCamera::create("/device/video50", 1920, 1080, V4L2_PIX_FMT_NV12);
// 获取一帧数据
auto frame = camera->getFrame();
JDK 编码
// 创建编码器
auto encoder = std::make_shared<JdkEncoder>(width, height, CODING_H264, PIXEL_FORMAT_NV12);
// 对单帧数据进行编码
auto encodedFrame = encoder->Encode(jdkFrame);
JDK 解码
// 创建解码器
auto decoder = std::make_shared<JdkDecoder>(width, height, CODING_H264, PIXEL_FORMAT_NV12);
// 对单帧数据进行解码
auto decodedFrame = decoder->Decode(jdkFrame);
JDK V2D 模块
// 创建 V2D 模块实例
auto v2d = std::make_shared<JdkV2D>();
// NV12 转换为 RGB8888 格式
auto rgba_frame = v2d->convert_format(input_nv12, V2D_FMT_RGB888);
// 绘制单个矩形框
v2d->draw_rect(input_nv12, box, 0xFFFFFF00, 4); // 黄色,线宽4
// 绘制多个矩形框
v2d->draw_rects(input_nv12, {{30, 20, 100, 80}, {60, 40, 200, 160}}, 0x00ffcc66, 4); // 线宽4
// 对帧数据缩放
auto resized_frame = v2d->resize(jdkFrame, 1920, 1080);
// 同时缩放并格式转换
auto converted_frame = v2d->resize_and_convert(jdkFrame, 1920, 1080, V2D_FMT_RGB888);
JDK SDL 显示
// 创建视频输出(VO)对象
auto jdkvo = std::make_shared<JdkVo>(width, height, PIXEL_FORMAT_NV12);
// 显示一帧图像
auto ret = jdkvo->sendFrame(jdkFrame);
JDK DRM 显示
// 创建 DRM 对象
auto drm = std::make_shared<JdkDrm>(width, height, width, PixelFmt::NV12, "/dev/dri/card1");
// 显示一帧图像
auto ret = drm->sendFrame(jdkFrame1);
JDK 算法推理
// 创建算法推理引擎实例
auto engine = YOLOV8Det::create_infer("yolov8n.q.onnx", "onnx");
// 对帧数据进行推理
auto result = engine->commit(jdkFrame).get();
// 绘制推理结果
draw_nv12(jdkFrame, std::any_cast<YOLOV8Det::Objects>(result));
综合示例
BRDK JDK 相关源码下载地址:brdk_jdk
下面简单介绍相关实例的代码实现。