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.

[参考译文] TDA4VM:摄像头 (v4l2) 会显示 Linux 到 CSITX 的输出

Guru**** 2419530 points
Other Parts Discussed in Thread: SK-TDA4VM

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1519961/tda4vm-the-camera-v4l2-displays-the-output-on-linux-to-csitx

器件型号:TDA4VM


工具/软件:

您好、

该计划需要得到执行。

相机 (v4l2-1920x1080 /dev/video2 @ UYVY) --> tiovx -> csiTX --> max96717f;

请提供相关文档和代码示例。

此致、

Cesar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 、Brijesh、

    1.我们没有 JTAG、然后放弃这种裸机方法。

    2.返回 vision app --/opt/vision_apps/vx_app_conformance_video_io.out --filter=tivxVideoIOCsitxCsirx*

      现在示波器可以测量该信号、但 96717 无法检测到该信号;

      可以在 CSITx 中调整哪些时序或参数。

    此致、

    Cesar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Cesar:

    我不确定关于 96717、您能否咨询此模块的供应商?  

    从 CSITX 优先级来看、如果通道速度、通道数、通道极性设置正确、就只需要这样做。  

    此致、

    Brijesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 、Brijesh、

      我们有 max96717 相机解决方案,只要传感器提供数据, max96717 就能识别它。 寄存器状态的读取方式如下

     但未检测到 CSITx、max96717、视频接收到的 PCLK 的输出

    此致、

    Cesar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 、Brijesh、

    1. 现在显示图像,但由于图像尚未初始化,显示的图像如下

     assert_vx_object (csitx_image_examplear = vxCreateImage(上下文,宽度,高度,vx_DF_image_UYVY)、vx_type_image);

    2.现在我们要通过读取文件图像来显示它

    vx_image read_uyvy_file_to_vx_image(vx_context context, const char* filename, vx_uint32 width, vx_uint32 height) 
    {
        vx_status status = VX_SUCCESS;
        FILE* file = NULL;
        vx_image image = NULL;
        vx_map_id map_id = 0;
        void* image_data = NULL;
    
        vx_size data_size = width * height * 2;
    
        file = fopen(filename, "rb");
        image = vxCreateImage(context, width, height, VX_DF_IMAGE_UYVY);
    
        vx_rectangle_t rect = {0, 0, width, height};
        vx_size plane_index = 0;
        vx_imagepatch_addressing_t addr;
    
    	vxMapImagePatch(image, &rect, 0, &map_id, &addr, &image_data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST, 0);
    
        fread(image_data, 1, data_size, file);
    
        vxUnmapImagePatch(image, map_id);
        fclose(file);
    
        return image;
    }
    vx_image uyvy_image = read_uyvy_file_to_vx_image(graph.tiovx_context, "/mnt/1920x1080_vertical.yuv", 1920, 1080);
    //Consistent with the input image
    save_uyvy_image_to_file(uyvy_image, "/mnt/1920x1080_vertical_verify_ok.yuv");
    
    tx_frame = vxCreateObjectArray(graph.tiovx_context, (vx_reference)uyvy_image, 1);

    读取图像:

    3.但显示完全没有变化、相反、请验证存储的 TX_FRAME 的图像

    vx_status save_uyvy_image_to_file(vx_image image, const char* filename) {
        vx_status status = VX_SUCCESS;
        vx_map_id map_id = 0;
        void* image_data = NULL;
        FILE* file = NULL;
    
        if (!image || !filename) {
            return VX_ERROR_INVALID_PARAMETERS;
        }
        vx_uint32 width = 0, height = 0;
        vx_df_image format = VX_DF_IMAGE_VIRT;
    
        status = vxQueryImage(image, VX_IMAGE_WIDTH, &width, sizeof(width));
        status |= vxQueryImage(image, VX_IMAGE_HEIGHT, &height, sizeof(height));
        status |= vxQueryImage(image, VX_IMAGE_FORMAT, &format, sizeof(format));
    	printf("__________________wxh = %d x %d_______\n", width, height);
        if (status != VX_SUCCESS) {
            return status;
        }
    
        if (format != VX_DF_IMAGE_UYVY) {
            return VX_ERROR_INVALID_FORMAT;
        }
    
        vx_size data_size = width * height * 2;
    
        file = fopen(filename, "wb");
        if (!file) {
            return VX_FAILURE;
        }
    
        vx_rectangle_t rect = {0, 0, width, height};
        vx_size plane_index = 0;
        vx_imagepatch_addressing_t addr;
    
    	status = vxMapImagePatch(image, &rect, plane_index, &map_id, &addr, &image_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST, 0);
    
        if (status != VX_SUCCESS) {
            fclose(file);
            return status;
        }
    
        size_t bytes_written = fwrite(image_data, 1, data_size, file);
        if (bytes_written != data_size) {
            status = VX_FAILURE;
        }
        vxUnmapImagePatch(image, map_id);
    
        fclose(file);
    
        return status;
    }
    
    
    
    
    ref1 = vxGetObjectArrayItem(tx_frame, 0);
    if (!ref1) {
    
    	return VX_ERROR_INVALID_REFERENCE;
    }
    
    vx_enum ref_type = 0;
    status = vxQueryReference(ref1, VX_REFERENCE_TYPE, &ref_type, sizeof(ref_type));
    if (status != VX_SUCCESS || ref_type != VX_TYPE_IMAGE) {
    
    	return VX_ERROR_INVALID_TYPE;
    }
    save_uyvy_image_to_file((vx_image)ref1, "/mnt/save_tx_frame_1920x1080.yuv");

    保存的图像与未填充数据的图像相同

    我想问问题出在哪里

    此致、

    Cesar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Cesar:

    请映射图像对象阵列的所有图像缓冲区、复制此图像数据、然后执行 uMAP、然后查看是否有任何有效输出。  

    此致、

    Brijesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Brijesh、

    #include <stdio.h>
    #include <stdlib.h>
    #include <signal.h>
    #include <unistd.h>
    #include <tiovx_modules.h>
    #include <tiovx_utils.h>
    
    #define IMAGE_WIDTH          1920
    #define IMAGE_HEIGHT         1080
    
    vx_status app_modules_v4l2_capture_test(vx_int32 argc, vx_char* argv[])
    {
        vx_status status = VX_FAILURE;
        vx_context context;
    	vx_object_array tx_frame = 0;
    	vx_reference ref = NULL;
    
        context = vxCreateContext();
    
    	vx_image uyvy_image = vxCreateImage(context, IMAGE_WIDTH, IMAGE_HEIGHT, VX_DF_IMAGE_UYVY);
    	readImage("/mnt/1920x1080_vertical.yuv", uyvy_image);
    	writeImage("/mnt/1920x1080_vertical_verify.yuv", uyvy_image);
    
    	tx_frame = vxCreateObjectArray(context, (vx_reference)uyvy_image, 1);
    
    	ref = vxGetObjectArrayItem(tx_frame, 0);
        if (!ref) {
            return VX_ERROR_INVALID_REFERENCE;
        }
        vx_enum ref_type = 0;
        status = vxQueryReference(ref, VX_REFERENCE_TYPE, &ref_type, sizeof(ref_type));
        if (status != VX_SUCCESS || ref_type != VX_TYPE_IMAGE) {
            return VX_ERROR_INVALID_TYPE;
        }
    	//The result is inconsistent with the read image file
    	writeImage("/mnt/1920x1080_tx_frame.yuv", (vx_image)ref);
    
        return status;
    }
    
    
    

    我的常规测试的现象是相同的。 您也能运行一下。

    此致、

    Cesar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Cesar、

    您基于什么应用程序? 仍然是 VISION 应用程序-----/opt/vision_apps/vx_app_conformance_video_io.out --filter=tivxVideoIOCsitxCsirx*?

    此致、

    Adam

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Adam:

    1.edgeai-tiovx-apps、

    j721e 和 j722s 上的测试现象相同。 请参阅上述常规用法;

    2. tivxvideoiocsitxcsirx*默认映像初始化不与上述粉色映像相同

    请同时进行测试。 不要一直延迟。 这个问题已被推迟很长时间。

    此致、

    Cesar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    tivxvideoiocsitxcsirx*默认映像初始化不与上面的粉色映像相同

    这是否意味着用 tivxvideoiocsitxcsirx*进行测试也会产生上面的粉红色图像?

    如果可以、您能否在 video_io/kernels/video_io/test/test_csitx_csirx.c 中提供修改?

    此致、

    Adam

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    单击插入并选择图像/视频/文件

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Cesar:

    我检查了您的代码

    tx_frame 已经是一个 objectarray、您在创建同名的 objectarray 之前没有释放或删除它。 可能会导致意外行为。

    为什么不直接更改 PTR 在此处指向的数据?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Adam:

    它不是原始的 iamge、它已更改为 YUV 图像。

    此致、

    Cesar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Adam:

    此外、在实际应用场景中、经过处理的图像会发送到图像阵列上。

    此致、

    Cesar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Cesar:

    我知道您想要显示 YUV 图像。 但正如我之前所说、反复使用 TX_FRAME 的行为将引入意外结果。 您应尝试以其他方式修改内容、例如删除初始创建的 tx_frame。

    此致、

    Adam

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Adam:

    请自行测试、并提供可正常显示的例行程序。 谢谢你

    此致、

    Cesar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Adam:

    1.首先,从图像阵列获取图像,然后填入数据,这样,显示就会生效。

    vx_reference g_ref = vxGetObjectArrayItem (TX_frame、0);
    create_fill_image (context、(vx_image) g_ref);

    2. 然而,当我们将其发送给显示时,我们会提供一个包含已填充数据的 BUF;

       这种方法是如何运作的。

    此致、

    Cesar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Cesar:

    对不起,我在这里犯了一个错误:

    重复使用 tx_frame

    如前所述,vxCreateObjectArray 仅使用 vx_image 作为示例创建一个空数组。 创建的数组接受 vx_image 的特征(如宽度高度格式)、但不接受数组中的真实数据。 在数组中填充数据的正确方法是从数组中获取项目并在创建数组后填充数据。

    此致、

    Adam