代码改变世界

rkipc的npu(iva)学习笔记 - 实践

2025-09-15 14:25  tlnshuju  阅读(30)  评论(0)    收藏  举报

rkipc这里支持很多产品 

详见 SDK/project/app/rkipc/rkipc/docs

比如我们用的是rv1106的开发板,在./build.sh  lunch 的时候,选择luckfox_pro_max 

后面 ./build.sh app的时候  就编译的是rv1106_ipc  这个产品类型

源码位置:SDK/project/app/rkipc/src/rv1106_ipc/main.c

主函数里检测rkipc-200w.ini 里的enable_npu 设置是否为1

如果开启npu 则进入iva初始化

跳到SDK/project/app/rkipc/rkipc/common/rockiva/rockiva.c  这里

globalParams.detModel |= ROCKIVA_DET_MODEL_PFP;

这里指定使用 PFP(person、face、pet)前级目标检测算法模型

initParams.baRules.areaInBreakRule[0].objType = ROCKIVA_OBJECT_TYPE_BITMASK(ROCKIVA_OBJECT_TYPE_PERSON);
// initParams.baRules.areaInBreakRule[0].objType |= ROCKIVA_OBJECT_TYPE_BITMASK(ROCKIVA_OBJECT_TYPE_FACE);
initParams.baRules.areaInBreakRule[0].objType |= ROCKIVA_OBJECT_TYPE_BITMASK(ROCKIVA_OBJECT_TYPE_PET);

假如我们不想识别人脸的话可以注释掉;

SDK/project/app/rkipc/rkipc/src/rv1106_ipc/video/video.c的rkipc_get_nn_update_osd() 函数把识别到的人体框出来,默认是没把哈基米框出来,但可以在终端中打印出识别结果,这里手动给加上

if (object->objInfo.type == ROCKIVA_OBJECT_TYPE_PERSON) {
draw_rect_2bpp((RK_U8 *)stCanvasInfo.u64VirAddr, stCanvasInfo.u32VirWidth,
stCanvasInfo.u32VirHeight, x, y, w, h, line_pixel,
RGN_COLOR_LUT_INDEX_0);
} else if (object->objInfo.type == ROCKIVA_OBJECT_TYPE_FACE) {
draw_rect_2bpp((RK_U8 *)stCanvasInfo.u64VirAddr, stCanvasInfo.u32VirWidth,
stCanvasInfo.u32VirHeight, x, y, w, h, line_pixel,
RGN_COLOR_LUT_INDEX_0);
} else if (object->objInfo.type == ROCKIVA_OBJECT_TYPE_PET) {
draw_rect_2bpp((RK_U8 *)stCanvasInfo.u64VirAddr, stCanvasInfo.u32VirWidth,
stCanvasInfo.u32VirHeight, x, y, w, h, line_pixel,
RGN_COLOR_LUT_INDEX_1);
}

rockiva.c 这里有个回调函数

坐标 xy,归一化为1-10000,要乘于图像分辨率才是真正的物体在图像中的坐标;objId是检测到的第几个物体,假如哈基米在图像中消失了,当哈基米再次出现在画面中时,objId加1;type 6对应的是哈基米 ;