OKxx18(飞凌嵌入式)环境搭建和视频显示(Qt)

OKxx18系列开发板子,能很好的支持Qt应用程序的开发和部署,可以应用于很多行业和领域。今天和大家分享一下OKxx18 开发相关心得,主要包含:开发环境搭建、视频帧抓取、视频帧处理以及视频显示等。
一、 系统环境

Qt开发版本:qt4.8.6

系统版本:ubuntu 16.04 LTS

步骤如下:

1、 安装开发板产商提供的交叉编译工具arm-cortex_a9-eabi-4.7-eglibc-2.18(具体安装方式,开发厂商开发手册有详细说明)

2、 安装Qt开发库(Qt4.8.6),这个有两种方式:第一种直接使用厂商提供的编译好的Qt库;第二种从Qt官网(http://download.qt.io/archive/qt/4.8/4.8.6/)下载对应的版本,使用交叉工具编译;

3、 配置QtCreator【需要注意和qt版本对应,不同的qt版本,支持的creator版本不一样,我们这里的qtcreator-3.2.1】

a) 打开creator程序,程序路径qtcreator-2-2.1下bin目录中的qtcreator

b) 配置交叉编译工具,路径Tools->Build&Run->Compilers, Add 新增一个编译类型,编译工具路径就是步骤1中的交叉编译路径,其它的默认就可以的,配置完成如下图所示:

c) Qt库的配置,路径Tools->Build&Run->Qt Version, 在Manual Add 新增一个Qt版本,qmake location就是步骤2中的按照的Qt版本路径,其它的默认就可以的,配置完成如下图所示:


d) Qt开发环境配置(Qt库和编译器), 路径Tools->Build&Run->Kits, 在Manual Add 新增一个Qt Kit版本,Device type: Desktop ; Compiler: GCCust(步骤b中配置);Qt version: Qt 4.8.6(qt4.8.6)usr(步骤d中配置),其它的默认就可以的,配置完成如下图所示:


二、 视频处理视频处理基本流程首先打开视频设备,获取视频帧,处理视频整(可以调色、改变大小、分发等操作)

a) 打开视频设备:

open(“/dev/ion”,O_RDWR);

b) 设置视频帧大小:

v4l2_set_format(info.sensor_id, info.sensor_width, info.sensor_height, V4L2_MBUS_FMT_YUYV8_2X8);

c) 视频帧数据缓存区申请和初始化:

v4l2_reqbuf(info.decimator_id, MAX_BUFFER_COUNT);

alloc_buffers(ion_fd, MAX_BUFFER_COUNT, bufs, info.decimator_width, info.decimator_height, format);

for (int i = 0; i < MAX_BUFFER_COUNT; i++)

{

struct nxp_vid_buffer *buf = &bufs[i];

v4l2_qbuf(info.decimator_id, buf->plane_num, i, buf, -1, NULL);

}

v4l2_streamon(info.decimator_id);

d) 循环读取视频帧数据:

struct nxp_vid_buffer *buf = &bufs[capture_index];

v4l2_dqbuf(info.decimator_id, buf->plane_num, &capture_index, NULL);

memcpy(bufY,buf->virt[0],buf->sizes[0]);

memcpy(bufU,buf->virt[1],buf->sizes[1]);

memcpy(bufV,buf->virt[2],buf->sizes[2]);

// YUV转成RGB,供Qt使用

yuvtorgb(perframe, info.decimator_width, info.decimator_height, bufY, bufU, bufV);

// Qt图片数据

QImage image(perframe, info.decimator_width, info.decimator_height,QImage::Format_RGB888);

//图片数据化,用于存档、显示或者分发

QByteArray byteImage;

QBuffer buffer(&byteImage);

buffer.open(QIODevice::WriteOnly);

image.save(&buffer, “JPG”);

buffer.close();

e) 关闭视频设备:

v4l2_streamoff(info.decimator_id);

for (int i = 0; i < MAX_BUFFER_COUNT; i++)

{

for (int j = 0; j < 3; j++)

{

struct nxp_vid_buffer *buf = &bufs[i];

munmap(buf->virt[j], buf->sizes[j]);

close(buf->fds[j]);

}

}

close(ion_fd);
视频帧输入如图:

三、 结束语

OKxx18(飞凌嵌入式)Qt应用程序开发以及其它技术细节、方案,欢迎反馈、讨论,如有兴趣,可以私聊沟通,谢谢!