您好、TI 专家!
我正在尝试使用 TIvxVpacMscScaleNode。
我想做一个简单的示例、以 NV12中的图像1920x1080为例、将器件裁剪为512x512。
我研究了示例 vision_apps/apps/dl_demos/app_tidl_AVP、并执行了从1920x1080扩展到512x512的项目。
但是、当我为裁剪做相同的事情时-它不起作用。
请告诉我如何找出根本原因。
两种情况的初始化节点:裁剪和使用系数
static void scale_set_crop_params(tivx_vpac_msc_crop_params_t ¶ms)
{
params.crop_start_x = 0;
params.crop_start_y = 0;
params.crop_width = 512;
params.crop_height = 512;
}
vx_status init_scaler(vx_context context, ScalerObj *scalerObj, vx_int32 bufq_depth)
{
vx_status status = VX_SUCCESS;
vx_int32 q;
vx_image input = vxCreateImage(context, scalerObj->input.width, scalerObj->input.height, VX_DF_IMAGE_NV12);
vx_image output_1 = vxCreateImage(context, scalerObj->output_1.width, scalerObj->output_1.height, VX_DF_IMAGE_NV12);
for(q = 0; q < bufq_depth; q++)
{
scalerObj->input.arr[q] = vxCreateObjectArray(context, (vx_reference)input, 1);
scalerObj->input_images[q] = (vx_image)vxGetObjectArrayItem((vx_object_array)scalerObj->input.arr[q], 0);
}
scalerObj->output_1.arr[0] = vxCreateObjectArray(context, (vx_reference)output_1, 1);
#if CROP
tivx_vpac_msc_crop_params_t cropParams;
scale_set_crop_params(cropParams);
/* Set Coefficients */
scalerObj->crop_params_obj = vxCreateUserDataObject(context,
"tivx_vpac_msc_crop_params_t",
sizeof(tivx_vpac_msc_crop_params_t),
NULL);
vxCopyUserDataObject(scalerObj->crop_params_obj, 0,
sizeof(tivx_vpac_msc_crop_params_t),
&cropParams,
VX_WRITE_ONLY,
VX_MEMORY_TYPE_HOST);
#else
tivx_vpac_msc_coefficients_t coeffs;
scale_set_coeff(&coeffs, VX_INTERPOLATION_BILINEAR);
/* Set Coefficients */
scalerObj->coeff_obj = vxCreateUserDataObject(context,
"tivx_vpac_msc_coefficients_t",
sizeof(tivx_vpac_msc_coefficients_t),
NULL);
vxCopyUserDataObject(scalerObj->coeff_obj, 0,
sizeof(tivx_vpac_msc_coefficients_t),
&coeffs,
VX_WRITE_ONLY,
VX_MEMORY_TYPE_HOST);
#endif
vxReleaseImage(&input);
vxReleaseImage(&output_1);
}
创建图和验证两种情况
vx_status create_graph_scaler(vx_context context, vx_graph graph, ScalerObj *scalerObj)
{
vx_status status = VX_SUCCESS;
vx_image input = (vx_image)vxGetObjectArrayItem((vx_object_array)scalerObj->input.arr[0], 0);
vx_image output_1 = (vx_image)vxGetObjectArrayItem((vx_object_array)scalerObj->output_1.arr[0], 0);
scalerObj->node = tivxVpacMscScaleNode(graph, input, output_1, NULL, NULL, NULL, NULL);
vxSetNodeTarget(scalerObj->node, VX_TARGET_STRING, TIVX_TARGET_VPAC_MSC1);
vxSetReferenceName((vx_reference)scalerObj->node, "ScalerNode");
vx_bool replicate[] = { vx_true_e, vx_true_e, vx_false_e, vx_false_e, vx_false_e, vx_false_e};
vxReplicateNode(graph, scalerObj->node, replicate, 6);
vxReleaseImage(&input);
vxReleaseImage(&output_1);
return status;
}
vx_status verify_graph(vx_graph *graph, ScalerObj *scalerObj)
{
vx_status status = VX_SUCCESS;
vx_reference refs[1];
status = vxVerifyGraph(*graph);
if(status == VX_SUCCESS)
{
status = tivxExportGraphToDot(*graph,".", "vx_app_tidl_avp");
}
#if CROP
refs[0] = (vx_reference)scalerObj->crop_params_obj;
#else
refs[0] = (vx_reference)scalerObj->coeff_obj;
#endif
if(status == VX_SUCCESS)
{
#if CROP
status = tivxNodeSendCommand(scalerObj->node, 0u, TIVX_VPAC_MSC_CMD_SET_CROP_PARAMS, refs, 1u);
#else
status = tivxNodeSendCommand(scalerObj->node, 0u, TIVX_VPAC_MSC_CMD_SET_COEFF, refs, 1u);
#endif
printf("App Send MSC Command Done!\n");
}
if(status != VX_SUCCESS)
{
printf("MSC: Node send command failed!\n");
}
/* wait a while for prints to flush */
tivxTaskWaitMsecs(100);
return status;
}
一项主要任务
void main_task(vx_context context)
{
const std::string name_file = "xaa";
const std::string name_file_output = "out_xaa";
vx_status status = VX_SUCCESS;
if(status == VX_SUCCESS)
{
tivxHwaLoadKernels(context);
tivxImgProcLoadKernels(context);
tivxTIDLLoadKernels(context);
}
ScalerObj scaler;
scaler.input.width = 1920;
scaler.input.height = 1080;
scaler.output_1.width = 512;
scaler.output_1.height = 512;
init_scaler(context, &scaler, 2);
vx_graph graph = vxCreateGraph(context);
status = vxGetStatus((vx_reference)graph);
vxSetReferenceName((vx_reference)graph, "avp_graph");
if(VX_SUCCESS == status)
{
printf("graph was created\n");
status = create_graph_scaler(context, graph, &scaler);
if (VX_SUCCESS == status)
{
printf("scaler was created\n");
status = verify_graph(&graph, &scaler);
if (VX_SUCCESS == status)
{
printf("graph was verified\n");
status = readScalerInput(name_file.data(), scaler.input.arr[0], 0);
if (VX_SUCCESS == status)
{
status = vxProcessGraph(graph);
if (VX_SUCCESS == status)
{
printf("Graph is done!\n");
status = writeScalerOutput(name_file_output.data(), scaler.output_1.arr[0]);
if (VX_SUCCESS == status)
{
printf("file was written\n");
}
}
}
}
}
}
printf("release Graph\n");
vxReleaseGraph(&graph);
deinit_scaler(&scaler, AVP_BUFFER_Q_DEPTH);
delete_scaler(&scaler);
tivxTIDLUnLoadKernels(context);
tivxImgProcUnLoadKernels(context);
tivxHwaUnLoadKernels(context);
}