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.

[参考译文] TDA4VH-Q1:TIOVX 图像裁剪

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1428138/tda4vh-q1-tiovx-image-crop

器件型号:TDA4VH-Q1

工具与软件:

团队成员、您好!

我们正在使用 Vision Apps > app single cam、我们想知道裁剪的相关信息。

目前、我可以使用 Display 节点 configs 进行裁剪和缩放。 但是、我无法出于任何其他目的访问裁剪图像。这些配置仅用于显示选项。 是否有其他执行裁剪的方法(例如在标量节点中)?

我在论坛上看到了一些建议、例如移动缓冲区中的起点并使用"tivxNodeSendCommand"到 scalerNode、但我在 SDK 中找不到任何相关示例。 有具体的裁剪示例吗? 您能不能为此提供支持?

谢谢。

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

    各位同事、您好!  

    我尝试了 根据我在论坛上找到的内容使用" TIVX_VPAC_MSC_CMD_SET_CROP_PARAMS"进行裁剪。 请参阅以下代码段。 尽管我在任何阶段都没有遇到任何错误,但我们在屏幕或纯粉红色的帧中都被冻结。 我想知道我的实施是否错误?

    您能否就此提供支持?

    谢谢

        if (vx_true_e == obj->scaler_enable)
        {
            tivx_vpac_msc_coefficients_t sc_coeffs;
            vx_reference refs[1];
    
            printf("Scaler is enabled\n");
    
            tivx_vpac_msc_coefficients_params_init(&sc_coeffs, VX_INTERPOLATION_BILINEAR);
    
            obj->sc_coeff_obj = vxCreateUserDataObject(obj->context, "tivx_vpac_msc_coefficients_t", sizeof(tivx_vpac_msc_coefficients_t), NULL);
    
            if (status == VX_SUCCESS)
            {
                status = vxCopyUserDataObject(obj->sc_coeff_obj, 0, sizeof(tivx_vpac_msc_coefficients_t), &sc_coeffs, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
            }
            refs[0] = (vx_reference)obj->sc_coeff_obj;
            if (status == VX_SUCCESS)
            {
                status = tivxNodeSendCommand(obj->scalerNode, 0u, TIVX_VPAC_MSC_CMD_SET_COEFF, refs, 1u);
            }
            logger->info("MSC CROP!");
            int crop_mode = 1; // TODO:
            if (crop_mode ==1)
            {
                obj->crop_obj = vxCreateUserDataObject(obj->context,
                        "tivx_vpac_msc_crop_params_t",
                        sizeof(tivx_vpac_msc_crop_params_t), NULL);
                obj->crop.crop_start_x = 320;
                obj->crop.crop_start_y = 280;
                obj->crop.crop_width = 1280;
                obj->crop.crop_height = 480;
                status = vxCopyUserDataObject(obj->crop_obj, 0,
                        sizeof(tivx_vpac_msc_crop_params_t), &obj->crop, VX_WRITE_ONLY,
                        VX_MEMORY_TYPE_HOST);
                refs[0] = (vx_reference)obj->crop_obj;
                status = tivxNodeSendCommand(obj->scalerNode, 0u, TIVX_VPAC_MSC_CMD_SET_CROP_PARAMS,
                    refs, 1u);
                logger->info("Status Check: {} ",status);
            }

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

    您好!

    裁剪操作很简单、只需开始 移动指针和更改输入大小即可。 我们已经展示了如何在显示节点中实现这一点。 那么、您能否参考显示节点中的示例实现、并在所需节点中相应地进行更改?  

    此致、

    Brijesh

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

    您好!

    只是为了正确理解:

    1.您的意思是这个实现 test_display.c  显示了 TIVX_DISPLAY_SET_CROP_PARAMS? 这是我在 上一线程中的理解

                if ((1 == arg_->enableCrop) && (loop_count == (arg_->loopCount / 2)))
                {
                    vx_reference refs[1];
    
                    params.cropPrms.startX = 100;
                    params.cropPrms.startY = 100;
                    params.cropPrms.width = arg_->outWidth - 100;
                    params.cropPrms.height = arg_->outHeight - 100;
    
                    vxCopyUserDataObject(crop_obj, 0,
                        sizeof(tivx_display_crop_params_t),
                        &params.cropPrms, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
    
                    refs[0] = (vx_reference)crop_obj;
                    tivxNodeSendCommand(node, 0, TIVX_DISPLAY_SET_CROP_PARAMS,
                        refs, 1u);
                }
    

    我在 t 中找到了适用于 MSC 节点的类似实现、如下所示 est_vpac_msc_scale_multi_output.c     并相应地实现了 TIVX_VPAC_MSC_CMD_SET_CROP_PARAMS、但它不起作用。 我在上一份答复中已经分享了我的实施情况。 您能否告诉我们实施过程中可能存在什么问题?  

            if(crop_mode == 1)
            {
                /* Set Input Crop */
                ASSERT_VX_OBJECT(crop_obj = vxCreateUserDataObject(context,
                    "tivx_vpac_msc_crop_params_t",
                    sizeof(tivx_vpac_msc_crop_params_t), NULL),
                    (enum vx_type_e)VX_TYPE_USER_DATA_OBJECT);
    
                /* Center crop of input */
                crop.crop_start_x = w / 4;
                crop.crop_start_y =h / 4;
                crop.crop_width   = w / 2;
                crop.crop_height  = h / 2;
    
                VX_CALL(vxCopyUserDataObject(crop_obj, 0,
                    sizeof(tivx_vpac_msc_crop_params_t), &crop, VX_WRITE_ONLY,
                    VX_MEMORY_TYPE_HOST));
    
                refs[0] = (vx_reference)crop_obj;
                ASSERT_EQ_VX_STATUS(VX_SUCCESS,
                    tivxNodeSendCommand(node, 0u, TIVX_VPAC_MSC_CMD_SET_CROP_PARAMS,
                    refs, 5u));
    
                VX_CALL(vxReleaseUserDataObject(&crop_obj));
            }

    3.是否可以有任何标志用于启用 MSC 节点裁剪、例如:

            obj->display_params.enableCropping = 1;
    

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

    好的、

    #1、显示节点中的裁剪实现使用了 SW、即我们只需将起始指针移到缓冲区内并更改输入大小。 我想这就是您要找的。

    #2、MSC 支持的裁剪是 MSC 支持的裁剪、而 MSC 是唯一支持裁剪的硬件模块。 对于所有其他模块、你必须使用#1中的机制。  据我所知、MSC 裁剪功能存在未解决的错误、因此 可能无法正常工作。  

    #3、这是显示的输入参数、用以判断是否需要启用裁剪。 基于此标志、 OpenVX 节点会计算偏移参数以移动起始指针。  

    此致、

    Brijesh

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

    #1。 您是否指的是 vx_display_target.c 中的示例? 如果不能、请提供实施示例的位置?

    #2您是否记得 MSC 裁剪中的错误到底是什么? 您是否是指此 TIVX_VPAC_MSC_CMD_SET_CROP_PARAMS ioctl 无法正常工作? 因为我在某些线程中看到过、所以建议用户查看?

    #3好的

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

    #1、是的、这是 显示节点中支持的示例实现。 您可以对其进行引用、如果需要、 还可以将其移植到其他节点。  

    #2、据我所知、它不会生成正确的输出、尤其是对于色度。  

    此致、

    Brijesh

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

    您好、Brijesh:

    我试图了解启动指针移动的内核实现、但无法弄清它。 以下两个问题请您为我们提供支持吗?

    1.您能否分享有关开始指针移动的相关代码段的快照,并说明它在该代码中使用的参数方面的工作方式?  

    2.能否分享 vx_image 类型开始指针移动的实现示例? 为了移动 vx_image 类型的起始缓冲区偏移和更新宽度高度、我们需要更新哪些属性? 由于我们使用 vx_image 作为节点的输入和输出、因此最好使用 vx_image 类型。  

    提前感谢

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

    您好!

    在显示节点目标实现中、即在文件中 video_io/kernels/video_io/display/vx_display_target.c、  在函数 tivxDisplayProcess ()中,您可以看到变量 frm->addr[0U]和 frm->addr[1U],这是图像的起点

    您可以在此处添加参数 displayParams->offset0和 Offset1来计算起始地址。

    这将在 API tivxDisplayCalcOffset()中使用 cropPrms 来修改。

    此 cropPrms 由应用程序使用控制命令 TIVX_DISPLAY_SET_CROP_PARAMS 进行更新。

    因此、当使用 tivxNodeSendCommand 从应用程序更新 cropPrms 后、它会在目标端进行更新、从而进一步更新 frm->addr、这是一个正在被确认为驱动程序的 Fvid2Frame。

    由于所有 HWA 也使用 fvid2frame、因此您也可以在其他节点上遵循相同的实现

    此致、

    Nikhil

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

    感谢您发送编修。