一、需求分析
伴随着嵌入式技术、图像处理技术和无线网络传输技术的发展,传统模拟视频监控系统和基于PC的远程视频监控系统由于自身的不足,已经无法满足现代社会应用中不断涌现出来的新需求,于是基于嵌入式技术的无线网络数字视频监控系统就应因而生了。例如远程监控、远程教学、远程医疗诊断、远程购物、远程探视、电视电话会议等应用都迫切需要高质量的网络视频传输的支持。考虑到了所用的硬件设备大部分都已经具备和我们所学到的知识及本身的能力有限,选择基于rk3399的视频监控系统作为我们本次的课程设计题目是比较实际而且比较容易掌握嵌入式开发的基本方法
设计实现功能要求
1) 利用USB摄像头进行采集图像数据的采集;
2) 利用rk3399对所采集到图像数据进行解码
3) 将解码后的图像显示在LCD屏上。
设计用到的设备
1) PC机
2) RK3399开发板
3) USB摄像头
4) type-c usb线
5) CH340串口线
一、产品的系统构成
系统的工作原理
系统可以分为4 个模块:图像采集模块、图像存储模块、图像处理模块、图像显示模块。系统在RK3399 的控制下从USB 摄像头采集图像数据,然后经过DMA 方式将图像数据传输到内存缓冲区中,由软件将图像数据读出并对图像数据进行压缩和打包处理后存入Flash 中, 最后图像在LCD屏上。本系统的设计难点是如何保证内存中图像数据的读取与USB 摄像头的同步以及图像数据的实时处理。系统采用RK339作为嵌入式处理器,完全可以完成图像数据的实时处理需求,比一般采用添加图像硬件处理模块减少了系统的成本.
二、软硬件协同设计与程序建模
在开始应用编程之前,需要先准备好驱动,在LCD上显示摄像头图像,至少需要三个驱动:LCD驱动、背光驱动、UVC驱动。
以前都是使用的insmod xx.ko进行动态加载驱动,每次开发板上电后,都需要手动/脚本里加载驱动,有点麻烦。
反观内核自带的驱动,使用make menuconfig进入图形配置界面里,找到对应的驱动,可以设置为Y(编译到内核)、M(编译成模块)、N(不编译)。当设置为Y后,进入系统后,就自带了该驱动,不再需要手动加载。
四,嵌入式产品的设计与开发
1.1 LCD 显示原理
液晶显示的原理基于液晶的透光率随其所施电压大小而变化的特性。当光通过上偏振片后,变成线性偏振光,偏振方向与偏振片振动方向一致,与上下玻璃基板上面液晶分子排列顺序一致。当光通过液晶层时,由于受液晶折射,线性偏振光被分解为两束光。又由于这两束光传播速度不同(相位相同),因而当两束光合成后,必然使振光的振动方向发生变化。通过液晶层的光,则被逐渐扭曲。当光达到下偏振片时,其光轴振动方向被扭曲了90度,且与下偏振片的振动方向保持一致。这样,光线通过下偏振片形成亮场。加上电压以后,液晶在电场作用下取向,扭曲消失。这时,通过上偏振片的线性偏振光,在液晶层不再旋转,无法通过下偏振片而形成暗场。可见液晶本身不发光,在外光源的调制下,才能显示,在整个显示过程中,液晶起到一个电压控制的光阀作用。TFT-LCD的工作原理则可简述为:当栅极正向电压大于施加电压时,漏源电极导通,当栅极正向电压等于0或负电压时,漏源电极断开。漏电极与ITO象素电极连结,源电极与源线(列电极)连结,栅极与栅线(行电极)连结。这就是TFT-LCD的简单工作原理
1.2 lcd示例
1)打开lcd设备:
linux系统所有lcd设备名称是统一是 /dev/fbX ,X是0~31 .
RK3399 开发平台lcd设备情况:
[root@edu118 ~]# ls /dev/fb*
/dev/fb0
2)操作lcd设备
a.获得lcd屏的工作参数:可变参数和固定参数
b.使用 mmap 函数把lcd的显存映射到进程空间中 -- 得到一个显存首地址
c.通过映射得到的地址往显存写颜色数据。
第一步:
第二步:显存首地址偏移+目标点偏移量 ---> 目标点在内存中的绝对地址
第三步:根据 BPP 合成颜色写入到目标点内存中
3)关闭 lcd设备,取消映射(munmap)
2 Linux系统下摄像图像采集
172.16.14.208
1. Linux系统下标准的摄像头框架V4L2
2. V4L2框架不局限应用在摄像头,还有其他类设备
3. 摄像头设备文件:
/dev/videoX X是一个整数从0开始。
4. 摄像头编程流程
Linux下一切都是文件!
1)打开摄像头设备对应文件
int video_device_open(const char*dev)
{
fd_vd = open(dev, O_RDWR); //阻塞方式打开
if (-1 == fd_vd) {
fprintf(stderr, "Cannot open '%s': %d, %s\n", dev_name, errno, strerror(errno));
return -1;
}
return fd_vd;
}
2)各种操作
a. 查询设备功能:
因为打开的设备不一定就是摄像头设备,不一定支持捕获功能。
b. 根据上一步查询结果来判断是否支持捕获功能
c. 查询摄像头支持的数据格式:
因为不同型号的摄像头支持不一样格式,格式数量也不一样。
d. 从支持格式选择一种可以处理的数据格式 设置到硬件中。
e. 申请缓冲
f. 查询缓冲信息:得到内存偏移量和长度
g. 使用 mmap 进行映射到进程空间中
h. 添加到采集队列中
i. 启动图像采集
j. 取出一帧数据进行处理:实际把最早一帧数据从采集队列取下来,需要自己去复制数据。
k. 把缓冲区重新添加到采集队列
循环:j, k 两步
l. 停止采集
m. 取消映射,关闭设备
3)关闭
2. 示例代码
04-lcd-v4l2
3. 测试
1)编译
编译前根据自己的文件系统路径修改 Makefile &nbs