工具与软件:
您好、TI 专家!
我正在实施一个参考 app_tidl_od_cam 和 app_tidl_od 演示应用的自定义 tidl 应用。
该应用程序接收从另一个与之并行运行的应用程序捕获的 nv12图像。
流水线如下所示
收到的 NV12图像->缩放节点-->(输出1) TIDL 节点-> DrawDetections 节点-> Mosaic 节点->显示节点
| |
-->(output2)-------------------------------------------------------
显示屏是非常必要的、看起来像是 DrawDetection Node 处理索引错误的缓冲区。
e2e.ti.com/.../20250121_5F00_drawdetect_5F00_image_5F00_buffer_5F00_issue.mp4
如果我在 DrawDetection Node 的输入直接进入 Display Node 时改变流量、则显示效果为 Find。
收到的 NV12图像->缩放节点-->(输出1) TIDL 节点-> DrawDetections 节点-> Mosaic 节点
|
-->(output2)--------------- > 显示节点
e2e.ti.com/.../20250121_5F00_scaler_5F00_to_5F00_display.mp4
所以我想标量的输出是可以的、但是 DrawDetection Node 可能有问题。
下面是相关的代码片段。 (从 vision_apps/modules 和 app_tidl_od_cam 使用的内核模块 API)
static vx_status app_init(AppObj *obj)
{
vx_status status = VX_SUCCESS;
/* Create OpenVx Context */
obj->context = vxCreateContext();
status = vxGetStatus((vx_reference) obj->context);
if(status == VX_SUCCESS)
{
tivxHwaLoadKernels(obj->context);
tivxImgProcLoadKernels(obj->context);
tivxTIDLLoadKernels(obj->context);
tivxVideoIOLoadKernels(obj->context);
}
/* Initialize modules */
app_init_scaler(obj->context, &obj->scalerObj, "scaler_obj", 1, 2);
app_init_tidl(obj->context, &obj->tidlObj, "tidl_obj", 1);
app_update_pre_proc(obj->context, &obj->preProcObj, obj->tidlObj.config, 1);
app_init_pre_proc(obj->context, &obj->preProcObj, "pre_proc_obj");
app_update_draw_detections(&obj->drawDetectionsObj, obj->tidlObj.config);
app_init_draw_detections(obj->context, &obj->drawDetectionsObj, "draw_detections_obj", 1);
app_init_img_mosaic(obj->context, &obj->imgMosaicObj, "img_mosaic_obj", 4);
app_init_display(obj->context, &obj->displayObj, "display_obj");
return status;
}
static vx_status app_create_graph(AppObj *obj)
{
vx_status status = VX_SUCCESS;
vx_graph_parameter_queue_params_t graph_parameters_queue_params_list[2];
vx_int32 graph_parameter_index;
obj->graph = vxCreateGraph(obj->context);
status = vxGetStatus((vx_reference)obj->graph);
vxSetReferenceName((vx_reference)obj->graph, "app_tidl_od_cam_graph");
app_create_graph_scaler_single(obj->context, obj->graph, &obj->scalerObj, obj->imgs[0]);
app_create_graph_pre_proc(obj->graph, &obj->preProcObj, obj->scalerObj.output[0].arr);
app_create_graph_tidl(obj->context, obj->graph, &obj->tidlObj, obj->preProcObj.output_tensor_arr);
status = app_create_graph_draw_detections(obj->graph, &obj->drawDetectionsObj, obj->tidlObj.output_tensor_arr[0], obj->scalerObj.output[1].arr);
obj->draw_detect_output_img = (vx_image)vxGetObjectArrayItem((vx_object_array)obj->drawDetectionsObj.output_image_arr, 0);
vx_int32 idx = 0;
obj->imgMosaicObj.input_arr[idx++] = obj->drawDetectionsObj.output_image_arr;
obj->imgMosaicObj.num_inputs = idx;
app_create_graph_img_mosaic(obj->graph, &obj->imgMosaicObj, NULL);
//obj->display_image = (vx_image)vxGetObjectArrayItem(obj->scalerObj.output[1].arr, 0);
obj->display_image = obj->draw_detect_output_img;
//obj->display_image = obj->imgMosaicObj.output_image[0];
status = app_create_graph_display(obj->graph, &obj->displayObj, obj->display_image);
if(status == VX_SUCCESS)
{
graph_parameter_index = 0;
add_graph_parameter_by_node_index(obj->graph, obj->scalerObj.node, 0);
obj->scalerObj.graph_parameter_index = graph_parameter_index;
graph_parameters_queue_params_list[graph_parameter_index].graph_parameter_index = graph_parameter_index;
graph_parameters_queue_params_list[graph_parameter_index].refs_list_size = obj->imgs_num;
graph_parameters_queue_params_list[graph_parameter_index].refs_list = (vx_reference*)&obj->imgs[0];
graph_parameter_index++;
vxSetGraphScheduleConfig(obj->graph,
VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO,
graph_parameter_index,
graph_parameters_queue_params_list);
tivxSetGraphPipelineDepth(obj->graph, APP_PIPELINE_DEPTH);
tivxSetGraphPipelineDepth(obj->graph, 5);
tivxSetNodeParameterNumBufByIndex(obj->scalerObj.node, 1, 4);
tivxSetNodeParameterNumBufByIndex(obj->scalerObj.node, 2, 4);
printf("Pipeline params setup done!\n");
}
return status;
}
您能告诉我导致问题的原因吗?
此致、
Juhyun



