[TI TDA4 J721E]TIOVX 单屏显示多路摄像头数据(Mosaic节点使用)

          首先感谢阅读,如果您也对TDA4相关的开发感兴趣,我们这边有个学习交流微信群,可以入群和大家一起交流学习。

资历较浅,水平有限,如遇错误,请大家多指正!

保持开源精神,共同分享、进步!

博主WX : AIR_12  我会拉你入群。

链接:TDA4 相关专栏        链接:TDA4  Demo  Gitee开源库

欢迎大家加入,一起维护这个开源库,给更多的朋友提供帮助。


很久没有更新博客了,最近测试了一个比较使用的Node,在这里和大家分享一下。


在工程项目上,有时会使用到一个屏幕需要显示多路摄像头数据的需求。在浏览TI官方提供的SDK开发包,发现一个比较简单的Demo。

我使用的是ti-processor-sdk-rtos-j721e-evm-08_00_00_12,大家可以自行在TI官网上下载这个开发包,这里不做赘述,如果有疑问的小伙伴,查看以下这个博客,步骤比较详细。

[TI TDA4]PROCESSOR-SDK-J721E RTOS Linux 开发环境搭建 基于 ubuntu 18.04_AIRKernel的博客-优快云博客

先给大家看下效果图(我这里只有一路摄像头,所以把一路摄像头得到YUV数据,复制了4份进行显示):

为了简单说明Mosaic节点的功能,我这里以原有的Demo为例,Demo位置如下:

ti-processor-sdk-rtos-j721e-evm-08_00_00_12/vision_apps/apps/basic_demos/app_linux_arm_opengl_mosaic/

Demo功能:

Demo内提供的图片应该是对方的一名工程师,看着比较面善,哈哈,致敬以下作者,如有侵权,请联系删除。

1、从系统文件内,读取bin文件数据

2、创建了一个RGBA格式的out    image

3、创建了4个NV12格式的input    image

4、将图像加载到Mosaic节点内,然后执行Graph。

具体流程如下:


Mosaic节点的移植

基于作者提供的线索,我对这个Demo进行了移植,将从文件获取,改为从USB获取YUV图像。

首先你需要一个另外的工程,我使用的是自己删除干净的只有DISP节点的工程,这个我会抽时间放到下载内,链接如下:

(暂缺,上传后修改以下)

1、concerto.mak内容移植,添加以下内容,到目标工程内。

ifeq ($(TARGET_OS),LINUX)
CFLAGS += -DEGL_NO_X11
SYS_SHARED_LIBS += gbm
endif


SYS_SHARED_LIBS += EGL
SYS_SHARED_LIBS += GLESv2

IDIRS += $(VISION_APPS_SRV_IDIRS)

STATIC_LIBS += $(VISION_APPS_SRV_LIBS)

2、头文件需要都包含进来

#include <VX/vx.h>
#include <TI/tivx.h>
#include <TI/tivx_sample.h>
#include <tivx_sample_kernels_priv.h>
#ifdef J7
#include <app_init.h>
#endif
#include <tivx_utils_file_rd_wr.h>
#include <TI/tivx_task.h>

3、添加以下全局变量,用于mosaic节点的创建核使用

    vx_graph mosaicGraph;
    vx_node mosaicNode;
    vx_object_array in_obj_array;
    vx_image input[4], mosaicOutput;

    vx_user_data_object mosaicParam_obj;
    tivx_opengl_mosaic_params_t mosaicParams;

4、初始化刚刚创建的全局变量,在app_init 内进行初始化

创建4个NV12格式的image,将4个NV12打包创建生成一个array,然后创建一个RGBX的输出图像,使用mosaicParams参数创建一个参数对象mosaicParam_obj,用于创建节点用。

5、 创建Graph,将此处代码放在app_create_graph(AppObj *obj)内

    //创建一个几点,用于将图像合并成一个RGB的图像,等待显示
    if(status == VX_SUCCESS)
    {
        obj->mosaicNode = tivxOpenglMosaicNode(obj->mosaicGraph, obj->mosaicParam_obj, obj->in_obj_array, obj->mosaicOutput);
    }
    if (status == VX_SUCCESS)
    {
        status = vxSetNodeTarget(obj->mosaicNode, VX_TARGET_STRING, TIVX_TARGET_A72_0);
    }

6、verify graph在app_verify_graph(AppObj *obj)内

    if (status == VX_SUCCESS)
    {
        status = vxVerifyGraph(obj->mosaicGraph);
    }

 7、将USB获取到的YUV数据,拷贝到4个input中。这里需要拷贝四次,所以放到了一个for循环内。

(usb提供的图像指针是pmap,这里USB获取图像数据,我会单独写一个博客,链接如下:)

[TI TDA4]TIOVX USB摄像头获取YUV数据并显示Demo的实现_AIRKernel的博客-优快云博客

会使用到vxMapImagePatch 、 vxCopyImagePatch等等,对应不同的图像,方法是不一样的。

8、 执行第7步以后,就可以执行graph了,运行

            if (status == VX_SUCCESS)
            {
                if (status == VX_SUCCESS)
                {
                    status = vxScheduleGraph(obj->mosaicGraph);
                }
                if (status == VX_SUCCESS)
                {
                    status = vxWaitGraph(obj->mosaicGraph);
                }
            }

9、执行成功后,会将输出的图像,RGBX拷贝到disp_image内进行显示。

特别说明:向内核创建的image内拷贝数据,需要执行一系列的操作,这个也会单独写一个博客(链接如下:)

需要注意的是RGBX转为RGB的方法,可以自行百度以下。我这里暂时没有做转换,只是将RGBX的前3个字节,拷贝出来,进行显示了。

 10、执行disp_graph,即可看到,编译后,正常运行即可。

整体工程,我会打包放到资料库,这里好像放不了。

因能力有限,有很多地方讲的不够清楚,有疑问的小伙伴,欢迎私信交流。


【声明】
【欢迎转载转发,请注明出处。原创比较辛苦,请尊重原创,祝大家学习愉快!】
【博主专注嵌入式开发,具有多年嵌入式软、硬件开发经验,欢迎大家学习交流!】
【如有嵌入式相关项目需求,欢迎私信】

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值