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.

[参考译文] SK-TDA4VM:Tiovix - IMX568简单图形问题

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1418800/sk-tda4vm-tiovix---imx568-simple-graph-problem

器件型号:SK-TDA4VM

工具与软件:

专家、您好!

我正在尝试使用 v4l2和 viss 模块创建一个用于 IMX568摄像头(摄像头的 Linux 驱动程序在内部开发)的简单图形(请参阅下面的代码)。

我们使用的是 SDK 09_02_00_05和 edgeai-app-stack 存储库:b6ff3ac11bf1c672eaa63f6dfadfa819da02c4b9。

目前最终的 YUV 图像非常模糊。

原始图像和 viss 模块输出:

我已经分离了 v4l2和 vis 模块。 仅使用 VISS 模块(从文件中读取原始图像)可以很好地工作。 使用 v4l2模块并从 v4l2_capture_module 内 tiovx_Buffer->handle 中映射 dma 也得出了一个好的原始图像。 这些模块之间的一些东西似乎会扭曲原始图像、或者在 v4l2模块中发生了一些我不理解的其他事情。

我已经尝试将 fps 降低到~30并更改图形调度、但问题仍然存在。

任何帮助或见解都会有所帮助! 非常感谢!

此致、

Andras

代码:

#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <unistd.h>

#include <TI/tivx.h>
#include <tiovx_modules.h>
#include <v4l2_capture_module.h>
#include <tiovx_utils.h>
#include <app_init.h>

#define APP_BUFQ_DEPTH      (7)
//#define APP_NUM_CH          (1)
#define APP_NUM_ITERATIONS  (20)

#define INPUT_WIDTH  (1236)
#define INPUT_HEIGHT (1032)

#define SENSOR_NAME "SENSOR_SONY_IMX568"
#define DCC_VISS "/opt/imaging/imx568/linear/dcc_viss.bin"


int main(int argc, char *argv[])
{
    int32_t statusInit = 0;

    statusInit = appInit();

    if (statusInit) {
        printf("App init error!\n");
    }

    vx_status status = VX_FAILURE;
    GraphObj graph;
    NodeObj *node = NULL;
    TIOVXVissNodeCfg cfg;
    BufPool *in_buf_pool = NULL, *out_buf_pool = NULL;
    Buf *inbuf = NULL, *outbuf = NULL;
    char* output_filename;
    v4l2CaptureCfg v4l2_capture_cfg;
    v4l2CaptureHandle *v4l2_capture_handle;
    
    tiovx_viss_init_cfg(&cfg);
    
    sprintf(cfg.sensor_name, SENSOR_NAME);
    snprintf(cfg.dcc_config_file, TIVX_FILEIO_FILE_PATH_LENGTH, "%s", DCC_VISS);
    cfg.width = INPUT_WIDTH;
    cfg.height = INPUT_HEIGHT;
    sprintf(cfg.target_string, TIVX_TARGET_VPAC_VISS1);
    

    cfg.input_cfg.params.format[0].pixel_container = TIVX_RAW_IMAGE_8_BIT;
    cfg.input_cfg.params.format[0].msb = 7;
   
    status = tiovx_modules_initialize_graph(&graph);
    if(VX_SUCCESS != status) {
        printf("Init graph error!\n");
    }
    
    node = tiovx_modules_add_node(&graph, TIOVX_VISS, (void *)&cfg);
    
    node->sinks[0].bufq_depth = APP_BUFQ_DEPTH;

    graph.schedule_mode = VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO;
    
    status = tiovx_modules_verify_graph(&graph);
    if (VX_SUCCESS != status) {
        printf("Verify graph error!\n");
    }
    
    in_buf_pool = node->sinks[0].buf_pool;
    out_buf_pool = node->srcs[0].buf_pool;

    v4l2_capture_init_cfg(&v4l2_capture_cfg);
    v4l2_capture_cfg.width = INPUT_WIDTH;
    v4l2_capture_cfg.height = INPUT_HEIGHT;
    v4l2_capture_cfg.pix_format = V4L2_PIX_FMT_SRGGB8;
    v4l2_capture_cfg.bufq_depth = APP_BUFQ_DEPTH + 1;
    sprintf(v4l2_capture_cfg.device, "/dev/video-imx568-cam0");

    v4l2_capture_handle = v4l2_capture_create_handle(&v4l2_capture_cfg);
    
    for (int i = 0; i < APP_BUFQ_DEPTH; i++) {
        inbuf = tiovx_modules_acquire_buf(in_buf_pool);
        v4l2_capture_enqueue_buf(v4l2_capture_handle, inbuf);
    }

    v4l2_capture_start(v4l2_capture_handle);

    for (int j = 0; j < 2; j++)
    {
        inbuf = v4l2_capture_dqueue_buf(v4l2_capture_handle);
        tiovx_modules_enqueue_buf(inbuf);
    }
    
    for (int i = 1; i < APP_NUM_ITERATIONS; i++) {
        do {
            inbuf = v4l2_capture_dqueue_buf(v4l2_capture_handle);
        } while (inbuf == NULL);
        
        tiovx_modules_enqueue_buf(inbuf);

        outbuf = tiovx_modules_acquire_buf(out_buf_pool);
        tiovx_modules_enqueue_buf(outbuf);

        //tiovx_modules_schedule_graph(&graph);
        //tiovx_modules_wait_graph(&graph);

        inbuf = tiovx_modules_dequeue_buf(in_buf_pool);
        outbuf = tiovx_modules_dequeue_buf(out_buf_pool);
        v4l2_capture_enqueue_buf(v4l2_capture_handle, inbuf);

        if ((i % 5) == 0)
        {
            sprintf(output_filename, "/opt/tiovx-imx568/output/imx568_1236x1032_%d.yuv", i);
            writeImage(output_filename, (vx_image)outbuf->handle);
        }
        
        tiovx_modules_release_buf(outbuf);        
    }
 
    v4l2_capture_stop(v4l2_capture_handle);
    v4l2_capture_delete_handle(v4l2_capture_handle);

    tiovx_modules_clean_graph(&graph);

    printf("Running test successful!\n");

    appDeInit();

    return status;
}

代码输出:

APP: Init ... !!!
MEM: Init ... !!!
MEM: Initialized DMA HEAP (fd=5) !!!
MEM: Init ... Done !!!
IPC: Init ... !!!
IPC: Init ... Done !!!
REMOTE_SERVICE: Init ... !!!
REMOTE_SERVICE: Init ... Done !!!
    30.807099 s: GTC Frequency = 200 MHz
APP: Init ... Done !!!
    30.810698 s:  VX_ZONE_INIT:Enabled
    30.810731 s:  VX_ZONE_ERROR:Enabled
    30.810746 s:  VX_ZONE_WARNING:Enabled
    30.813495 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target MPU-0 
    30.813642 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target MPU-1 
    30.813738 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target MPU-2 
    30.813893 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target MPU-3 
    30.813919 s:  VX_ZONE_INIT:[tivxInitLocal:136] Initialization Done !!!
    30.819293 s:  VX_ZONE_INIT:[tivxHostInitLocal:101] Initialization Done for HOST !!!
Running test successful!
    33.497632 s:  VX_ZONE_INIT:[tivxHostDeInitLocal:115] De-Initialization Done for HOST !!!
    33.502108 s:  VX_ZONE_INIT:[tivxDeInitLocal:204] De-Initialization Done !!!
APP: Deinit ... !!!
REMOTE_SERVICE: Deinit ... !!!
REMOTE_SERVICE: Deinit ... Done !!!
IPC: Deinit ... !!!
IPC: DeInit ... Done !!!
MEM: Deinit ... !!!
DDR_SHARED_MEM: Alloc's: 13 alloc's of 16116181 bytes 
DDR_SHARED_MEM: Free's : 13 free's  of 16116181 bytes 
DDR_SHARED_MEM: Open's : 0 allocs  of 0 bytes 
MEM: Deinit ... Done !!!
APP: Deinit ... Done !!!

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

    另有一条评论:

    运行 演示也可以正常工作、因此在显示上正确显示了摄像头图像。

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

    安德拉斯、您好!

    您能否确认是否使用了以下 Linux 边缘 AI 映像? https://www.ti.com/tool/download/PROCESSOR-SDK-LINUX-SK TDA4VM/09.02.00.05

    谢谢!

    Fabiana

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

    Fabiana、您好!

    是的、我可以确认我确实使用了链接版本。 上周、我还尝试了使用最新 SDK (ti-processor-sdk-linux-edgeai-j721e-evm-10_00_00_08-linux-x86-Install)和最新 edgeai-app-stack repo (提交散列886e47d52e6c7cfdc64ff3f828b77a7ea7f3c1)进行的测试、但问题仍然存在。

    Andras

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

    安德拉斯、您好!

    在命令行中运行测试 GStreamer 流水线时是否会遇到相同的失真?

    谢谢!

    Fabiana

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

    Fabiana、您好!

    对不起,我上星期就要病假了。  我们已经成功运行了 OptiFlow python 应用程序(使用 GST 流水线)、并且如前所述、edgeai tiovx 演示应用使用基础 v4l2模块、我在上面的引用代码中使用该模块。 两者都工作正常。

    Andras

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

    安德拉斯、您好!

    我希望你这周感觉更好! 您能否说明您是否以 IMX568作为输入运行演示应用?

    谢谢!

    Fabiana

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

    尊敬的 Fabiana:

    是、对于 OptiFlow 和演示应用、IMX568都用作输入。

    Andras

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

    安德拉斯、您好!

    感谢您的确认。 我将使用不同的传感器运行几个测试、因为我手头没有 imx568。

    - Fabiana

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

    Fabiana、您好!

    我不知道您是否成功执行过任何测试、但我认为、如果提示我任何可能导致此图像失真的解决方案或可能的问题、也会很有帮助。

    当然、执行测试也会对您非常有帮助!

    正在等待您的回复!  

    谢谢!

    Andras

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

    安德拉斯、您好!

    我建议查看边缘 ai 数据流、以便更好地了解边缘 ai 应用如何从传感器输出良好的图像。

    https://software-dl.ti.com/jacinto7/esd/processor-sdk-linux-sk-tda4vm/10_00_00/exports/edgeai-docs/common/edgeai_dataflows.html

    谢谢!

    Fabiana

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

    Fabiana、您好!

    我们已经设法获得了良好的图像分辨率2472*2036。 DCC 文件生成和 edgeai-app-stack 的版本控制存在一些问题。

    但是,当我们尝试以其他分辨率(1236*1032)运行应用程序,或者只是将位深度从12位更改为8位时,我们没有得到任何图像(只是纯白图像)。 我更改了 edgeai-app-stack 代码库中每个与分辨率相关的属性。

    您对此有任何相关信息吗? 是否足以生成具有适当分辨率的新 DCC 文件、为每个节点的配置结构提供适当的分辨率、或者对于分辨率(最小值等)或我们未考虑的任何其他参数是否存在任何限制?

    再次感谢您的回答!

    此致、

    Andras

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

    安德拉斯、您好!

    请查看下面链接的资源。

    ISP 调优指南: https://www.ti.com/lit/an/sprad86a/sprad86a.pdf

    DCC 调优工具: https://www.ti.com/drr/opn/ADAS-SW-IMAGING

    常见问题: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1275034/faq-default-dcc-profile-generation-tool-for-tda4-am6xa-isp-vpac

    使用不同的分辨率或格式时、请确保更改传感器配置和 DCC 二进制文件。

    谢谢!

    Fabiana