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:无法使用镶嵌片显示

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1351955/tda4vh-q1-unable-to-display-using-mosaicnode

器件型号:TDA4VH-Q1

尊敬的专家:

我正在尝试使用镶嵌合+显示节点来显示多幅图像。

我创建4 vx_image、然后使用 vxCreateObjectArray 将其转换为数组、然后设置为镶嵌片节点。

但是、我在运行图形时未能显示图像。

她的表情似乎是那样的自然。

我如何实现它是否有任何错误? 这是我实现的 create_graph。

谢谢。

static vx_status app_create_graph(AppObj *obj)
{
    vx_status status = VX_SUCCESS;
    vx_graph_parameter_queue_params_t graph_parameters_queue_params_list[2] = {0};
    vx_int32 graph_parameter_index;

    obj->graph = vxCreateGraph(obj->context);
    status = vxGetStatus((vx_reference)obj->graph);
    if (status == VX_SUCCESS)
    {
        status = vxSetReferenceName((vx_reference)obj->graph, "app_multi_cam_graph");
        APP_PRINTF("Graph create done!\n");
    }


    vx_int32 idx = 0;
 
    obj->mosaic_in_arr1 = vxCreateObjectArray(obj->context, (vx_reference)obj->display_image1, 1);
    obj->mosaic_in_arr2 = vxCreateObjectArray(obj->context, (vx_reference)obj->display_image2, 1);
    obj->mosaic_in_arr3 = vxCreateObjectArray(obj->context, (vx_reference)obj->display_image3, 1);
    obj->mosaic_in_arr4 = vxCreateObjectArray(obj->context, (vx_reference)obj->display_image4, 1);

    obj->imgMosaicObj.input_arr[0] = obj->mosaic_in_arr1;
    obj->imgMosaicObj.input_arr[1] = obj->mosaic_in_arr2;
    obj->imgMosaicObj.input_arr[2] = obj->mosaic_in_arr3;
    obj->imgMosaicObj.input_arr[3] = obj->mosaic_in_arr4;
    obj->imgMosaicObj.num_inputs = 4;
    
    vx_image display_in_image;

    status = app_create_graph_img_mosaic(obj->graph, &obj->imgMosaicObj, NULL);
    APP_PRINTF("Img Mosaic graph done!\n");
    display_in_image = obj->imgMosaicObj.output_image[0];

    if(status == VX_SUCCESS)
    {
        status = app_create_graph_display1(obj->graph, &obj->displayObj, display_in_image);
        APP_PRINTF("Display graph done!\n");
    }
    if(status == VX_SUCCESS)
    {
        status = vxVerifyGraph(obj->graph);
    }
    return status;
}

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

    您好!

    为什么要创建对象数组? 相反,您能否创建一个对象数组,获取这些对象数组的图像,用适当的图像填充这些图像,然后将它们用作马赛克节点的输入?  

    此致、

    布里耶什

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

    您好!

    对不起,我不熟悉 VX,我如何用我的图像填充一个数组?

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

    您好!

    我建议参考现有的示例、如 单摄像头应用中的 API READ_TEST_IMAGE_RAW。 该 API 读取原始映像、您需要读取 yuv420映像。  实际上、您需要 在应用程序中映射映像、 填充缓冲区、然后取消映射映像。  

    此致、

    布里耶什

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

    您好!

    我已经将数据映射到 obj->display_image1、obj->display_image2、...、obj->display_image4、但 ImgMosaicObj 需要 vx_object_array 作为 input_arr。 因此,我使用 vxCreateObjectArray 转换图像并将其用作马赛克输入。 马赛克节点如何使用这些数组?

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

    当从映像创建对象数组时,不会复制图像内容 ,仅 此输入映像的属性用于创建对象数组。

    like obj->Mosace_in_arr1 = vxCreateObjectArray (obj->context、(VX_reference) obj->display_image1、1);

    在 上述指令中、display_image1的属性 用于创建对象数组、但 display_image1的内容不会复制到 对象数组映像中。  

    另请注意、 对象数组(Mosace_in_arr1)中的图像将被分配、并且与 dispay_image1的内存不同。  

    因此、您需要在 对象数组的每个索引处绘制映像、映射此映像并需要填充。  

    Rgds、

    布里耶什

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

    您好!

    现在我可以将图像映射到一个数组中。 如何仅使用1个阵列同时显示4幅图像?

    在本示例中、它们使用多个数组来显示多个图像。

    是否仍需要设置 obj->imgMosaicObj.num_inputs = 4?
       

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

    您好!

    我建议参考现有的示例、如多摄像头示例中的示例。 这显示了如何 将来自不同摄像机的4幅图像合并为一幅图像、然后使用视频管道显示。  

    此致、

    布里耶什

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

    在多摄像头示例中、它使用设置马赛克图像:

    obj->imgMosaicObj.input_arr[idx++]= obj->ldcObj.output_arr;

    这是否意味着每个图像都 与每个 Idx 相对应?

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

    不需要,只需提供一个输入对象数组, 该对象数组可以包含 要放置在马赛克输出中的所有图像。  

    无需提供多个对象数组。  

    此致、

    布里耶什

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

    您的意思是这样吗?

    obj->mosaic_in_arr1 = vxCreateObjectArray(obj->context, (vx_reference)obj->display_image1, 4);
    obj->imgMosaicObj.input_arr[0] = obj->mosaic_in_arr1;

    如何为每个图像设置参数、例如 startx、startY?

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

    是的、看起来是正确的。 您可以 在马赛克参数中设置每个图像的位置和输出大小。  

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

    您好!

    我试图从 CV::Mat 使用 for 循环将每个图像填充到对象数组中,但面临一些问题。

    1.虽然我使用不同的图像,但所有图像都是一样的

    2.图像看起来是绿色的,我认为是因为 CV::Mat 是从 BGR 图像中读出来的,但马赛克只支持 NV12,我怎么能转换颜色格式?

    这是使用映射和取消映射填充图像的方法:

    static vx_status vxCvMatToVxObjectArray(vx_context context, vx_object_array *array, const std::vector<cv::Mat> &cv_images)
    {
        vx_status status = VX_SUCCESS;
        status = vxGetStatus((vx_reference)(*array));       
        vx_size arrLen;
        vxQueryObjectArray((*array), VX_OBJECT_ARRAY_NUMITEMS, &arrLen, sizeof(vx_size)); 
        vx_int32 i;
    
        for (i = 0; i < arrLen; i++)        
        {
            int width = cv_images[i].cols;
            int height = cv_images[i].rows;
    
            vx_rectangle_t patch;
            patch.start_x = 0;
            patch.start_y = 0;
            patch.end_x = width;
            patch.end_y = height;
    
            vx_map_id map_id;
            vx_imagepatch_addressing_t addr;
            unsigned char *ptr;
            vx_image image = (vx_image)vxGetObjectArrayItem((*array), i);           
    
            vx_status status = vxMapImagePatch(image, &patch, 0, &map_id, &addr, (void **)&ptr, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST, VX_NOGAP_X);
            if (status != VX_SUCCESS)
            {
                return NULL;
            }
    
            if (addr.stride_x != 1 && addr.stride_x != 3)
            {
                return NULL;
            }
    
            for (int y = 0; y < height; y++)
            {
                unsigned char *ptr_y = ptr + y * addr.stride_y;
                memcpy(ptr_y, cv_images[i].ptr(y), addr.stride_y);
            }
    
            status = vxUnmapImagePatch(image, map_id);
    
        }
                
        return status;
    }

    显示屏现在的外观如下所示:

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

    您好!

    现在我能够以正确的颜色显示图像、但仍然不确定为什么所有显示图像都相同。 我使用 vxGetObjectArrayItem 将不同的图像映射到数组中。

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

    您好!

    是否在马赛克参数中正确设置 INPUT_SELECT 和 CHANNEL_SELECT 参数? 由于您使用的是 单输入对象数组、INPUT_SELECT 可以固定为0、但对于马赛克输出中的每个窗口、您可以使用 CHANNEL_SELECT 参数选择通道。  

    此致、

    布里耶什

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

    您好!

    原因是我将所有 CHANNEL_SELECT 设置为0以配置马赛克参数。

    现在我可以正确显示图像了。

    非常感谢您的帮助。