This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我对 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); }
大家好 ,我是否可以就上述问题获得任何支持?
大家好 、Prathiksha Chikkamadal Manjunatha、
我看到您正在将 LUT 指针传递给该 API。 该 LUT 是否有效并以正确的大小分配? 请您检查一下吗?
由于此 API vxCopyImagePatch 仅从 LUT 地址复制到图像缓冲区、因此如果 LUT 不起作用、则会在 Linux 上导致 SEG 故障。
此致、
Brijesh
是的、LUT 有效。 我将其作为头文件附加、并将其包含在主代码中、如所示
#include "LDC_LUT_1936x1552.h"
静态 uint16_t LDC_LUT[]= LDC_LUT_1936_1552;
e2e.ti.com/.../ldc_5F00_lut_5F00_1936x1552.h
大家好 、Prathiksha Chikkamadal Manjunatha、
根据我们与 Gang 的内部讨论、此问题已得到解决、因此关闭此 TT。
此致、
Brijesh