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.

[参考译文] TDA4VEN-Q1:关于缩放和翻转(上下和左右)摄像头图像的方法

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1618030/tda4ven-q1-regarding-the-method-to-zoom-and-flip-upside-down-and-left-right-camera-images

器件型号: TDA4VEN-Q1

基于 app_multi_cam、我们已成功实现了各个摄像机图像的缩放和翻转(上下和左右)。
但是、当我们以缩放状态翻转(上下颠倒和左右)图像时、图像会失真。 是否有解决这个问题的方法?

以下是每次查询的门票 URL。

■翻转(上下颠倒和左右)
https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1608098/j722sxh01evm-how-to-flip-camera-images-upside-down-or-left-right/6234323

■缩放
https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1612049/tda4ven-q1-methods-for-processing-camera-footageImagedata.zip 

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

    尊敬的 Masao:

    您共享的图像似乎没有放大、而是看起来像裁剪的图像。 您是否可以共享用于此图像的裁剪设置。 您是动态应用裁剪设置、还是在初始化阶段应用该设置。

    此致、
    Gokul  

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

    尊敬的 Gokul:

    我们使用 SingleCAM 的关键输入功能进行动态切换。
    随附的图像显示了使用以下参数放大后的结果:

    • X:640
    • Y: 120
    • 宽度:960
    • 高度:540

    然后翻转图像。


    ■拉电流

    坐标表
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~μ s
    typedef 结构{
    int x;
    int y;
    整型宽度;
    内部高度;
    }table_roi_disp1;

    table_roi_disp1 table[]={
    {960,120,640,360}
    };
    #endif
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~μ s

    按键输入
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~μ s
    案例'+'://放大
    chg_cnt++;
    obj->display_params.cropPrms.startx = table[chg_cnt].x;
    obj->display_params.cropPrms.startY = table[chg_cnt].y;
    obj->display_params.cropPrms.width = table[chg_cnt].width;
    obj->display_params.cropPrms.height = table[chg_cnt].height;
    休息;
    案例'-'://缩小
    chg_cnt-;
    obj->display_params.cropPrms.startx = table[chg_cnt].x;
    obj->display_params.cropPrms.startY = table[chg_cnt].y;
    obj->display_params.cropPrms.width = table[chg_cnt].width;
    obj->display_params.cropPrms.height = table[chg_cnt].height;
    休息;
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~μ s

    按键后输入共享处理
    vx_status = vxCopyUserDataObject (obj->roi_crop_obj、0、sizeof (tivx_display_cropp_params_t)、&obj->display_params.cropPrms、vx_write_only、 vx_memory_type_host);

    vx_reference refs[1];
    refs[0]=(vx_reference) obj->roi_crop_obj;
    status = tivxNodeSendCommandTimed (obj->displayNode、0U、TIVx_display_set_crop_Params、refs、1100u);
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~μ s

    e2e.ti.com/.../add_5F00_image.zip



    此致、
    Takayama 正夫。

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

    尊敬的 Masao:

    您是否可以使用以下代码修改 vx_display_target.c 文件

    1.

                    frm->addr[0U] = tivxMemShared2PhysPtr(
                            ((uint64_t)image_target_ptr1) + displayParams->offset0,
                            TIVX_MEM_EXTERNAL);
                    if((displayParams->dispParams.pipeCfg.flipType == FVID2_FLIP_TYPE_H) || (displayParams->dispParams.pipeCfg.flipType == FVID2_FLIP_TYPE_HV)) 
                    {
                        frm->addr[0U] += ((displayParams->cropPrms.height - 1) * displayParams->dispParams.pipeCfg.inFmt.pitch[0]);
                    }
                    if((vx_df_image)VX_DF_IMAGE_NV12 == obj_desc_image->format)
                    {
                        frm->addr[1U] = tivxMemShared2PhysPtr(
                            (uint64_t)image_target_ptr2 + displayParams->offset1,
                            TIVX_MEM_EXTERNAL);
                        if((displayParams->dispParams.pipeCfg.flipType == FVID2_FLIP_TYPE_H) || (displayParams->dispParams.pipeCfg.flipType == FVID2_FLIP_TYPE_HV))
                        {
                            frm->addr[1U] += (((displayParams->cropPrms.height/2)-1) * displayParams->dispParams.pipeCfg.inFmt.pitch[1]);
                        }
                    }
    
                    if (((vx_df_image)VX_DF_IMAGE_U16 == obj_desc_image->format)||((vx_df_image)VX_DF_IMAGE_U8 == obj_desc_image->format))
                    {
                        frm->addr[1U] = displayParams->chromaBufAddr;
                        if((displayParams->dispParams.pipeCfg.flipType == FVID2_FLIP_TYPE_H) || (displayParams->dispParams.pipeCfg.flipType == FVID2_FLIP_TYPE_HV))
                        {
                            frm->addr[1U] += (((displayParams->cropPrms.height/2)-1) * displayParams->dispParams.pipeCfg.inFmt.pitch[1]);
                        }
                    }

    并在应用翻转参数之前首先应用裁剪参数。

    请在此更改后将输出共享给我。

    随附的图像显示使用以下参数放大后的结果:

    这是通过应用作物参数? 那么它实际上并不是缩放图像、而只是裁剪图像。

    作为一个缩放更改文件的实验、如下补丁中所述、

    2.

    diff --git a/mcu_plus_sdk_j722s_11_01_00_15/source/drivers/dss/v0/disp/dss_dispApi.c b/mcu_plus_sdk_j722s_11_01_00_15/source/drivers/dss/v0/disp/dss_dispApi.c
    index 6dcce7ff..cfe203fd 100755
    --- a/mcu_plus_sdk_j722s_11_01_00_15/source/drivers/dss/v0/disp/dss_dispApi.c
    +++ b/mcu_plus_sdk_j722s_11_01_00_15/source/drivers/dss/v0/disp/dss_dispApi.c
    @@ -2064,6 +2064,12 @@ static int32_t Dss_dispDrvApplyRtParams(Dss_DispDrvInstObj *instObj,
         if(NULL != rtParams->inFrmParams)
         {
             pipeRtUpdate = TRUE;
    +        if( (pipeParams->pipeCfg.inFmt.width != rtParams->inFrmParams->width) || (pipeParams->pipeCfg.inFmt.height != rtParams->inFrmParams->height))
    +        {
    +            pipeParams->pipeCfg.scEnable = true;
    +            // scaler is enabled once the input frame changes during runtime.
    +            // hack to enable zooming of the frame !! not tested !!
    +        }
             pipeParams->pipeCfg.inFmt.width  = rtParams->inFrmParams->width;
             pipeParams->pipeCfg.inFmt.height = rtParams->inFrmParams->height;
             pipeParams->pipeCfg.inFmt.dataFormat =
    


    不要同时应用两个更改、首先应用 (1) 并共享结果、然后应用 (1) 和 (2) 并进行检查。

    此致、
    Gokul

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

    嗨、Gokul。

    很抱歉耽误了回复。

    我修改了该 vx_display_target.c 文件并执行了操作检查、但现象保持不变、导致与之前附加的映像结果相同。




    此致、
    Takayama 正夫。

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

    尊敬的 Masao:

    我将研究这一点、并在下周向您提供最新信息。

    此致、
    Gokul

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

    尊敬的 Masao:

    您能否参考以下更改并将其应用于 vx_display_target.c 文件。

    diff --git a/video_io/kernels/video_io/display/vx_display_target.c b/video_io/kernels/video_io/display/vx_display_target.c
    index bdbc353d..1a721603 100755
    --- a/video_io/kernels/video_io/display/vx_display_target.c
    +++ b/video_io/kernels/video_io/display/vx_display_target.c
    @@ -131,6 +131,7 @@ typedef struct
         uint32_t offset0;
         uint32_t offset1;
         tivx_display_crop_params_t cropPrms;
    +    uint32_t is_crop_enabled;
         uint32_t bpp;
     
         uint32_t isRtPrmsUpdated;
    @@ -171,6 +172,8 @@ static vx_status VX_CALLBACK tivxDisplayControl(
     static void tivxDisplayFreeChromaBuff(tivxDisplayParams *dispPrms);
     static vx_status tivxDisplaySwitchChannel(tivxDisplayParams *dispPrms,
         const tivx_obj_desc_user_data_object_t *usr_data_obj);
    +static vx_status tivxDisplayFlip(tivxDisplayParams *dispPrms,
    +    const tivx_obj_desc_user_data_object_t *usr_data_obj);
     static vx_status tivxDisplaySetCropParams(tivxDisplayParams *dispPrms,
         const tivx_obj_desc_user_data_object_t *usr_data_obj);
     
    @@ -212,6 +215,73 @@ static vx_status tivxDisplaySwitchChannel(tivxDisplayParams *dispPrms,
         return (status);
     }
     
    +static vx_status tivxDisplayFlip(tivxDisplayParams *dispPrms,
    +    const tivx_obj_desc_user_data_object_t *usr_data_obj)
    +{    
    +    int32_t                     fvid2_status = FVID2_SOK;                     
    +    vx_status                   status = (vx_status)VX_SUCCESS;
    +    tivx_display_fliptype_t     *display_flip = NULL;
    +    void                        *target_ptr;
    +
    +    if (NULL != usr_data_obj)
    +    {
    +        target_ptr = tivxMemShared2TargetPtr(&usr_data_obj->mem_ptr);
    +
    +        tivxCheckStatus(&status, tivxMemBufferMap(target_ptr, usr_data_obj->mem_size,
    +            (vx_enum)VX_MEMORY_TYPE_HOST, (vx_enum)VX_READ_ONLY));
    +
    +        if (sizeof(tivx_display_fliptype_t) == usr_data_obj->mem_size)
    +        {
    +            display_flip = (tivx_display_fliptype_t *)target_ptr;
    +            dispPrms->dispParams.pipeCfg.flipType = display_flip->flipType;
    +            
    +            if(dispPrms->is_crop_enabled)
    +            {   
    +                dispPrms->dispParams.pipeCfg.inFmt.width = dispPrms->cropPrms.width;
    +                dispPrms->dispParams.pipeCfg.inFmt.height = dispPrms->cropPrms.height;
    +                dispPrms->dispParams.pipeCfg.scEnable = true;
    +                // if(display_flip->flipType == FVID2_FLIP_TYPE_NONE)
    +                // {
    +                //     // dispPrms->isRtPrmsUpdated = 1;
    +                //     dispPrms->dispParams.pipeCfg.inFmt.width = dispPrms->dispParams.pipeCfg.outWidth;
    +                //     dispPrms->dispParams.pipeCfg.inFmt.height = dispPrms->dispParams.pipeCfg.outHeight;
    +                //     dispPrms->is_crop_enabled  = 0;
    +                // }
    +            }   
    +            fvid2_status = Fvid2_control(dispPrms->drvHandle,
    +                                IOCTL_DSS_DISP_SET_DSS_PARAMS,
    +                                &dispPrms->dispParams,
    +                                NULL);
    +            if(FVID2_SOK != fvid2_status)
    +            {
    +                status = (vx_status)VX_FAILURE;
    +                VX_PRINT(VX_ZONE_ERROR, "DISPLAY: ERROR: Display Set Parameters Failed!\r\n");
    +            }
    +            if(dispPrms->is_crop_enabled)
    +            {
    +                dispPrms->dispParams.pipeCfg.inFmt.width = dispPrms->dispParams.pipeCfg.outWidth;
    +                dispPrms->dispParams.pipeCfg.inFmt.height = dispPrms->dispParams.pipeCfg.outHeight;
    +            }
    +
    +        }
    +        else
    +        {
    +            VX_PRINT(VX_ZONE_ERROR, "Invalid Size \n");
    +            status = (vx_status)VX_ERROR_INVALID_PARAMETERS;
    +        }
    +
    +        tivxCheckStatus(&status, tivxMemBufferUnmap(target_ptr, usr_data_obj->mem_size,
    +            (vx_enum)VX_MEMORY_TYPE_HOST, (vx_enum)VX_READ_ONLY));
    +    }
    +    else
    +    {
    +        VX_PRINT(VX_ZONE_ERROR, "User Data Object is NULL \n");
    +        status = (vx_status)VX_ERROR_INVALID_PARAMETERS;
    +    }
    +
    +    return (status);
    +}
    +
     static vx_status tivxDisplaySetCropParams(tivxDisplayParams *dispPrms,
         const tivx_obj_desc_user_data_object_t *usr_data_obj)
     {
    @@ -231,6 +301,7 @@ static vx_status tivxDisplaySetCropParams(tivxDisplayParams *dispPrms,
             {
                 ch_prms = (tivx_display_crop_params_t *)target_ptr;
                 memcpy(&dispPrms->cropPrms, ch_prms, sizeof(tivx_display_crop_params_t));
    +            dispPrms->is_crop_enabled = 1;
                 dispPrms->isRtPrmsUpdated = 1;
             }
             else
    @@ -839,6 +910,12 @@ static vx_status VX_CALLBACK tivxDisplayControl(
                         (tivx_obj_desc_user_data_object_t *)obj_desc[0U]);
                     break;
                 }
    +            case TIVX_DISPLAY_SELECT_FLIP:
    +            {
    +                status = tivxDisplayFlip(dispPrms,
    +                    (tivx_obj_desc_user_data_object_t *)obj_desc[0U]);
    +                break;
    +            }
                 default:
                 {
                     VX_PRINT(VX_ZONE_ERROR, "Invalid Command Id\n");
    @@ -985,16 +1062,49 @@ static vx_status VX_CALLBACK tivxDisplayProcess(
                     frm->addr[0U] = tivxMemShared2PhysPtr(
                             ((uint64_t)image_target_ptr1) + displayParams->offset0,
                             TIVX_MEM_EXTERNAL);
    +                if((displayParams->dispParams.pipeCfg.flipType == FVID2_FLIP_TYPE_H) || (displayParams->dispParams.pipeCfg.flipType == FVID2_FLIP_TYPE_HV)) 
    +                {
    +                    if(displayParams->is_crop_enabled)
    +                    {
    +                        frm->addr[0U] += ((displayParams->cropPrms.height - 1) * displayParams->dispParams.pipeCfg.inFmt.pitch[0]);
    +                    }
    +                    else
    +                    {
    +                        frm->addr[0U] += ((displayParams->dispParams.pipeCfg.inFmt.height - 1) * displayParams->dispParams.pipeCfg.inFmt.pitch[0]);
    +                    }
    +                }
                     if((vx_df_image)VX_DF_IMAGE_NV12 == obj_desc_image->format)
                     {
                         frm->addr[1U] = tivxMemShared2PhysPtr(
                             (uint64_t)image_target_ptr2 + displayParams->offset1,
                             TIVX_MEM_EXTERNAL);
    +                    if((displayParams->dispParams.pipeCfg.flipType == FVID2_FLIP_TYPE_H) || (displayParams->dispParams.pipeCfg.flipType == FVID2_FLIP_TYPE_HV))
    +                    {
    +                        if(displayParams->is_crop_enabled)
    +                        {
    +                            frm->addr[1U] += (((displayParams->cropPrms.height/2)-1) * displayParams->dispParams.pipeCfg.inFmt.pitch[1]);
    +                        }
    +                        else
    +                        {
    +                            frm->addr[1U] += (((displayParams->dispParams.pipeCfg.inFmt.height/2)-1) * displayParams->dispParams.pipeCfg.inFmt.pitch[1]);
    +                        }
    +                    }
                     }
     
                     if (((vx_df_image)VX_DF_IMAGE_U16 == obj_desc_image->format)||((vx_df_image)VX_DF_IMAGE_U8 == obj_desc_image->format))
                     {
                         frm->addr[1U] = displayParams->chromaBufAddr;
    +                    if((displayParams->dispParams.pipeCfg.flipType == FVID2_FLIP_TYPE_H) || (displayParams->dispParams.pipeCfg.flipType == FVID2_FLIP_TYPE_HV))
    +                    {
    +                        if(displayParams->is_crop_enabled)
    +                        {
    +                            frm->addr[1U] += (((displayParams->cropPrms.height/2)-1) * displayParams->dispParams.pipeCfg.inFmt.pitch[1]);
    +                        }
    +                        else
    +                        {
    +                            frm->addr[1U] += (((displayParams->dispParams.pipeCfg.inFmt.height/2)-1) * displayParams->dispParams.pipeCfg.inFmt.pitch[1]);
    +                        }
    +                    }
                     }
                     frm->fid = FVID2_FID_FRAME;
     
    

    我通过同时启用翻转和裁剪来验证这一点。

    此致、
    Gokul

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

    尊敬的 Masao:

    我很抱歉。 我无法验证您提供的信息。
    我会检查一下并提供结果。

    此致、
    Takayama 正夫。

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

    好的、肯定会等待更新。

    此致、
    Gokul

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

    嗨、Gokul

    很抱歉耽误了回复。

    我已确认提供的源代码已解决此问题。

    感谢您解决此问题。 我现在将关闭此工单。

    此致、
    Takayama 正夫。

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

    感谢您的更新、请关闭此主题。

    此致、
    Gokul