您好!
我对 LDC 节点处理有疑问。 我使用 所附相关链接中提到的方法 为 IMX623摄像头生成我的网格 LUT 硬件版本。 我确保使用 与 IMX623相对应的正确规格文件。
我在此附上使用的输入图像,MATLAB 生成的网格 LUT ( mesh.txt )和相应的 DCC 工具生成的网格 LUT 硬件版本( IMX623_mesh_lut.txt )。
e2e.ti.com/.../2100.mesh.txt e2e.ti.com/.../IMX623_5F00_mesh_5F00_lut.txt e2e.ti.com/.../Input_5F00_image.zip
我使用生成的 IMX623_mesh_LUT 作为 LDC 节点的 LUT。 下面是我们编写的用于自己应用的 LDC 节点。 当我在 EVM 上运行时、我在中遇到分段故障
(第40行) status = vxCopyImagePatch (mesh_img、&rect、0、ℑ Ω_addr、LDC_LUT、Vx_write_only、 vx_memory_type_host);
void NodeGraphProcessing::lDCprocessing(vx_context context)
{
vx_status status = VX_SUCCESS;
vx_image ldc_in_image = getInputImage();
GraphBaseInfo graphBaseInfo = {getGraph(), getContext()};
GraphNodeGenerator mGraphNodeGenerator(graphBaseInfo);
GraphNodeCommon *GraphCommonNode = new GraphNodeCommon();
vx_image mesh_img = NULL;
vx_rectangle_t rect;
vx_image ldc_out = NULL;
uint32_t table_width, table_height;
vx_imagepatch_addressing_t image_addr;
vx_user_data_object mesh_params_obj;
tivx_vpac_ldc_mesh_params_t mesh_params;
tivx_vpac_ldc_region_params_t region_params;
vx_user_data_object region_params_obj;
tivx_vpac_ldc_params_t ldc_params;
vx_user_data_object ldc_param_obj;
vx_node node_ldc;
table_width = (((1936 / (1 << 2)) + 1u) + 15u) & (~15u);
table_height = ((1552 / (1 << 2)) + 1u);
/* Mesh Image */
mesh_img = vxCreateImage(context, table_width, table_height, VX_DF_IMAGE_U32);
/* Copy Mesh table */
rect.start_x = 0;
rect.start_y = 0;
rect.end_x = table_width;
rect.end_y = table_height;
image_addr.dim_x = table_width;
image_addr.dim_y = table_height;
image_addr.stride_x = 4u;
image_addr.stride_y = table_width * 4u;
if (status == VX_SUCCESS)
{
status = vxCopyImagePatch(mesh_img, &rect, 0, &image_addr,
ldc_lut, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
}
if (VX_SUCCESS != status)
{
printf("Copy Image Failed\n");
}
ldc_out = vxCreateImage(context, 1936, 1552, (vx_df_image)VX_DF_IMAGE_NV12);
/* Mesh Parameters */
mesh_params_obj = vxCreateUserDataObject(context,
"tivx_vpac_ldc_mesh_params_t", sizeof(tivx_vpac_ldc_mesh_params_t), NULL);
memset(&mesh_params, 0, sizeof(tivx_vpac_ldc_mesh_params_t));
tivx_vpac_ldc_mesh_params_init(&mesh_params);
mesh_params.mesh_frame_width = 1936;
mesh_params.mesh_frame_height = 1552;
mesh_params.subsample_factor = 4;
if (status == VX_SUCCESS)
{
status = vxCopyUserDataObject(mesh_params_obj, 0,
sizeof(tivx_vpac_ldc_mesh_params_t), &mesh_params,
VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
}
/* Block Size parameters */
region_params_obj = vxCreateUserDataObject(context,
"tivx_vpac_ldc_region_params_t", sizeof(tivx_vpac_ldc_region_params_t),
NULL);
region_params.enable = 1;
region_params.out_block_width = 64;
region_params.out_block_height = 32;
region_params.pixel_pad = 1;
if (status == VX_SUCCESS)
{
status = vxCopyUserDataObject(region_params_obj, 0,
sizeof(tivx_vpac_ldc_region_params_t), ®ion_params,
VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
}
/* LDC Configuration */
tivx_vpac_ldc_params_init(&ldc_params);
ldc_params.luma_interpolation_type = 1;
ldc_param_obj = vxCreateUserDataObject(context,
"tivx_vpac_ldc_params_t", sizeof(tivx_vpac_ldc_params_t), NULL);
if (status == VX_SUCCESS)
{
status = vxCopyUserDataObject(ldc_param_obj, 0, sizeof(tivx_vpac_ldc_params_t),
&ldc_params, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
}
vx_graph graph = getGraph();
// change mesh_image to NULL and check
node_ldc = tivxVpacLdcNode(graph, ldc_param_obj, NULL,
region_params_obj, mesh_params_obj,
mesh_img, NULL, ldc_in_image,
ldc_out, NULL);
GraphCommonNode->setNode(node_ldc);
if (status == VX_SUCCESS)
{
status = vxSetNodeTarget(node_ldc, VX_TARGET_STRING, TIVX_TARGET_VPAC_LDC1);
}
else
{
printf("app_create_ldc returned error \n");
}
setOutputImage(ldc_out);
vx_uint32 outWidth, outHeight;
vx_size outSize, inSize;
vxQueryImage(ldc_out, VX_IMAGE_SIZE, &outSize, sizeof(vx_size));
vxQueryImage(ldc_out, VX_IMAGE_WIDTH, &outWidth, sizeof(vx_uint32));
vxQueryImage(ldc_in_image, VX_IMAGE_SIZE, &inSize, sizeof(vx_size));
vxQueryImage(ldc_out, VX_IMAGE_HEIGHT, &outHeight, sizeof(vx_uint32));
printf("Output image width: %d\n", outWidth);
printf("Output image height: %d\n", outHeight);
printf("Input image size: %ld bytes\n", inSize);
printf("Output image size: %ld bytes\n", outSize);
}
我不能完全确定为什么这会在这里失败。 LUT 的生成方式是否存在故障,或者我是否在此处遗漏了某个内容? 您能不能建议进行任何更改或测试、我可以尝试对此进行调试?
谢谢你
-普拉希克沙