首先感谢阅读,如果您也对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的博客-CSDN博客
先给大家看下效果图(我这里只有一路摄像头,所以把一路摄像头得到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
endifSYS_SHARED_LIBS += EGL
SYS_SHARED_LIBS += GLESv2IDIRS += $(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的博客-CSDN博客
会使用到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,即可看到,编译后,正常运行即可。
整体工程,我会打包放到资料库,这里好像放不了。
因能力有限,有很多地方讲的不够清楚,有疑问的小伙伴,欢迎私信交流。
【声明】
【欢迎转载转发,请注明出处。原创比较辛苦,请尊重原创,祝大家学习愉快!】
【博主专注嵌入式开发,具有多年嵌入式软、硬件开发经验,欢迎大家学习交流!】
【如有嵌入式相关项目需求,欢迎私信】