基于 Linux 的虚拟试妆系统设计
作者:邢岚 陈锋
导师:何 伟
(重庆大学 通信工程学院,重庆 400044)
摘 要:结合 SOPC 技术裁剪灵活的特点和嵌入式 Linux 操作系统高性能多任务的特性,设计了基于 Linux
和轻量级图形库 FTK 的虚拟试妆系统。以带 MMU 的 Nios II 处理器和 Linux 操作系统为基础,采用自行
设计的模块实现影像采集和存储,通过在触摸屏上移植轻量级图形库 FTK 实现交互界面开发,利用 FTK
的可扩展性编写自定义控件实现特殊交互功能。最终实现了具有商品浏览、模拟化妆、真人上妆等功能
的虚拟试妆系统。
关键词:Linux,FTK,自定义控件,虚拟试妆
中图分类号:TP316 文献标识码:A
Design of Virtual Makeup System based on Linux
Author:XING Lan CHEN Feng
Tutor:HE Wei
(College of Communication Engineering, Chongqing University, Chongqing, 400044)
Abstract: SOPC technology has flexible cutting feature and imbedded Linux operating system is characterized in high
performance and multi-task. Combined with the two advantages, a virtual makeup system with the basis of Nios II, Linux
operating system and light graphics library was designed in this paper. Based on Nios II processor with MMU and Linux
operating system, image acquisition and storage was realized by adopting the self-designed module. The development of
interaction interface was realized through the transplantation of light graphics library FTK on LTM. The extensibility of FTK
was utilized to compose custom widget and lip-contour extraction algorithm. Finally, the virtual makeup system equipped
with the functions of items browsing, simulated makeup and live makeup was realized.
Keywords: Linux;FTK;custom widget;virtual makeup
引言
随着社会的进步,人们对自身形象愈加重视,化妆成为女性一门必修课。如何选择合适的化妆
品尤其是颜色对于不少女性来说是一项难题。到商场柜台反复试用费时费力,求助于专业人士则费
用昂贵。柜台上反复试妆既繁琐又存在多人试用导致的卫生隐患。近几年针对该问题提出了多种虚
拟试妆解决方案。这些方案要么通过浏览器进行本地与远程服务器交互,要么利用接入 PC 机的影
像采集卡和 Visual C++开发上位机软件[1],由于体积和成本等原因无法在更多应用场合进行推广。
SOPC 技术拥有灵活的设计方式,具有可裁减、可扩充、可升级等特点[2];嵌入式 Linux 操作系
统具有代码量小、实时性高等特点,支持多种硬件平台和设备,适合在嵌入式平台上进行大型复杂
软件开发。本系统结合两种技术的优势,以 Altera 公司的 SOPC 技术和 Linux 操作系统为基础,设
计了一款嵌入式虚拟试妆系统。该系统在 SD 卡中按照腮红、眼影、唇彩分类存储信息,通过摄像
头采集用户面部影像,用户可通过触摸屏浏览、选择商品对影像进行上妆,上妆效果实时显示在屏
上。同时本系统还提供部分模板影像供用户选择,用户可选择模板观察上妆效果,最终达到选购化
- 1 -
北京革新创展科技有限公司 电话:010-82608898 网址:http://www.gexin.com.cn
妆品的目的。系统具有体积小巧,方便易用等特点,适合于各种商场的化妆品柜台。
1 系统总体结构设计
图 1 系统设计示意图
系统采用 FPGA 技术和嵌入式 Linux 操作系统作为方案实现的基础,用户通过触摸屏实现交互
操作并得到相应反馈;为使系统具有可扩展的数据库,将所有信息都存储在 SD 卡中,管理者可方
便地进行商品更新等操作;另外,除了使用数据库自带的虚拟模特进行试妆效果观察,为使系统能
给予用户更直观的信息反馈,增加了摄像头进行用户面部影像采集,使试妆效果能直接与用户本身
关联,大大增加了系统的实用性。图 1 展示了本系统设计的示意图。
实际设计中,系统以 DE2-70 为核心板,外接 PS2 键盘录入信息,通过扩展口分别接入 LTM 触
摸屏和 D5M 500 万像素摄像头。为使用 Linux 操作系统,构建了基于带 MMU 的 Nios II 处理器的
SOPC。通过 SDRAM 运行内核和 RAM 文件系统,使用 SSRAM 作为显示缓存,将硬件编程代码烧
入 EPCS,而将压缩的内核、文件系统与引导代码一起烧入 FLASH。系统采用 Altera 大学计划 IP 中
的 PS2 Controller 和 Video IPs 分别管理 PS2 接口和触摸屏的显示部分,自行编写硬件模块实现触摸
屏的配置、摄像头采集和 SSRAM 多路复用等功能。此外,系统还使用 SPI 模式管理 SD/MMC 卡以
及第三方 IP 进行网络物理芯片管理。系统结构框图如图 2 所示。
SOPC
Nios2 CPU
JTAG
MMU
FPGA
SD Card
PS2
EPCS
Flash
SD
PS2
EPCS
CFI
SDRAM
A
v
a
l
o
n
SSRAM
+SSRAM
- 2 -
Flash
Memory
SDRAM
SSRAM
CMOS
北京革新创展科技有限公司 电话:010-82608898 网址:http://www.gexin.com.cn
图 2 系统结构框图
2 系统硬件设计
系统硬件设计首先要搭建嵌入式 Linux 运行的最小系统;在最小系统正常运行的基础上通过向
Avalon 总线添加显示子系统相关模块实现 LTM 触摸屏图像显示,同时在顶层设计 HDL 模块配置
LTM 触摸屏使其正常工作;为了使摄像头采集的图像能直接显示在 LTM 触摸屏上,需自行设计模
块复用 LTM 的显示缓存,在不影响 LTM 显示前提下将采集到的影像数据导入 LTM 显示缓存中。
2.1 运行Linux的最小系统搭建
Linux 操作系统对 SOPC 系统的构建有特殊要求,包括带 MMU 处理器设置、全功能定时器启用、
通信终端设定等等。表 1 总结了基于 Linux 系统所需要添加的 SOPC 组件以及添加方法[3]。
系统需求
模块
实现方法
表 1 Linux 系统特性及对应组件搭建
① 在处理器的“Core Nios II”标签页:
选用“Nios II/f”型处理器;
勾选“Include MMU”选项;
② 在“Caches and Memory Interfaces”标签页:
勾 选 “Include tightly coupled instruction master
port(s)”端口数为 1;
勾选“Include tightly coupled data mater port(s)”,端
口数为 1;
③ 新建一个 On-Chip Memory:
内存类型为 RAM;
勾选“Dual-port access”;
内存大小设置为 1024 字节;
④ 将该内存模块的两个从端口分别与 CPU 的紧耦合指
令主端口以及紧耦合数据主端口相连接(见图 3)。再打开
处理器的“Core Nios II”属性设置界面,将“Fast TLB Miss
Exception Vector”设置为该内存模块。
选用 SOPC 自带组件“Interval Timer”:
定时中断周期设为 10ms;
计数器位数设为 32 比特;
设置为“Full-featured”类型;
中断优先级务必设定为最高,即 0。
Linux 虚拟内存管理
Nios II 处理器
和双口 RAM
Linux 系统时钟管理 定时器
Linux 通信终端
JTAG-UART 或 内核有且只有一个终端设备,因此二者选一个即可,由
- 3 -
北京革新创展科技有限公司 电话:010-82608898 网址:http://www.gexin.com.cn
UART
于串口终端反应速度相对较快,故选择该组件作为本系
Linux RAM 文件系统 SDRAM 控制器
统终端。
Linux 内核在运行时至少需要 8MB 内存空间,由于本系
统 需 要 使 用 图 形 库 进 行 软 件 开 发 , 所 需 内 存 更 多 。
DE2-70 上有两片 32MB 的 16 比特数据位宽 SDRAM,
使用时通过设定合适的 SDRAM Controller 参数将其设
定为 32 比特数据位宽的 64MB 内存。
图 3 Nios II 与 TLB 互连
完成最小系统搭建后,先配置内核并下载运行,确保一切工作正常后再进行进一步的设计。
2.2 显示子系统设计
显示部分以 SSRAM 为缓存,Nios II 处理器通过 Avalon 总线将其作为一片连续内存区域进行读
写,Altera 大学计划 IP 中的 Pixel Buffer 模块通过总线提取 SSRAM 中图形数据,整合成可显示的数
据格式以流式接口传送给 VGA Controller 模块,该模块生成显示所需的行场时序和数据并送入 LTM
显示屏最终获得图像。图 4 展示了显示子系统数据流向。
图 4 显示子系统数据流向示意图
Pixel Buffer IP 拥有一个主端口和一个从端口。从端口用于设置工作模式,主端口从显示缓存
SSRAM 中提取图像数据,送至 VGA Controller 模块[4]。基于软件开发的原因,SSRAM 中单个像素
点以 RGB565 格式即 16 比特存储,Pixel Buffer 将 16 比特数据转换为 24-bit 数据满足 VGA Controller
的需要,其中 R、G、B 分量各为 8-bit。Pixel Buffer 支持分辨率硬件放大,即将源数据对应的分辨
率通过硬件模块将其扩大 2、4、8 倍。在本系统中,为节省内存设定的触摸屏显示分辨率为 400×
240,而 LTM 配置为最大分辨率 800×480,由于 VGA Controller 的分辨率必须与 LTM 一致,因此
需要启用 Pixel Buffer 的硬件放大功能,将源数据量放大 4 倍。图 5 为 Pixel Buffer 模块的配置界面。
- 4 -
北京革新创展科技有限公司 电话:010-82608898 网址:http://www.gexin.com.cn
VGA Controller 模块通过流式接口接收 Pixel Buffer 传输的数据流产生 LTM 所需的时序信号,包
括行、列同步信号等等[4]。该模块直接与 LTM 相接,除此之外还需要给 LTM 提供一个 25MHz 的时
钟源,为产生正确的时序,VGA Controller 需 50MHz 的时钟,是 LTM 的两倍。为保证显示屏显示
图像稳定清晰,Pixel Buffer、VGA Controller 以及 SSRAM 控制模块必须使用同一个时钟且为 LTM
控制时钟的 2 倍,即 50MHz。VGA Controller 的配置界面参数只有两个:开发板类型和视频输出设
备,开发板类型选择 DE2-70,视频输出设备则选择 LTM。
图 5 Pixel Buffer 配置界面
图 6 展示了构建完毕的 SOPC 系统组件列表。值得一提的是,为优化系统频率,提高处理器对
各个慢速外设的访问速度,在 Nios II 处理器和各外设见添加了“Avalon-MM Pipeline Bridge”,使得
综合编译后所的系统的实际运行频率提高了 8.2MHz。
- 5 -
北京革新创展科技有限公司 电话:010-82608898 网址:http://www.gexin.com.cn
图 6 SOPC 系统组件列表
2.3 影像采集和存储方案设计
图 7 系统影像采集存储和显示功能示意图
为使系统支持真人影像采集和存储功能,需设计硬件模块将采集到的图像数据导入 LTM 缓存
SSRAM 同时不影响 SOPC 系统对 SSRAM 的控制。图 7 展示了本系统使用的解决方案:在 SOPC 系
统外,通过 Cam_CFG_CAP 模块配置和采集摄像头数据,经由 SSRAM_WRITE 模块合成指定格式
数据并生成 SSRAM 写时序送入 SSRAM_2PORT 进行仲裁;SSRAM_2PORT 实现二选一的功能,既
接收 SSRAM_WRITE 的数据写入 SSRAM 的指定区域,又允许 Nios II 和 Pixel Buffer 通过 Avalon 总
线 依 靠 SSRAM Controller 访 问 SSRAM 获 取 相 应 数 据 。 下 面 简 要 介 绍 一 下 两 个 核 心 模 块
SSRAM_2PORT 和 SSRAM_WRITE 的实现:
① SSRAM_WRITE
当处理器发出图像采集命令时,且 Dval(摄像头的行有效信号)置高时,该模块开始接收
Cam_CFG_CAP 发送的图像数据,将其重新拼接成 32 比特的 RGB 数据,同时生成对应的 SSRAM
写地址。
由显示子系统的设计可知,SSRAM 中存储的单个像素值为 16 位,而 Cam_CFG_CAP 传递的数
据格式为 R、G、B 三个分量各 12 位,该模块分别提取 RGB 分量的高 5、6、5 位数据,拼接成 16
位数据,由于 SSRAM 的数据位宽为 32 位,因此一次要写入两个像素点,该模块读入两个像素合成
32 位,同时生成对应的 21 位 SSRAM 地址,将其传递给 SSRAM_2PORT。图 8 展示了该模块的顶
层图和主要功能。
- 6 -
北京革新创展科技有限公司 电话:010-82608898 网址:http://www.gexin.com.cn
图 8 SSRAM_WRITE 顶层信号和主要功能示意图
② SSRAM_2PORT
该模块对来自 SOPC 系统的 SSRAM 控制器和 SSRAM_WRITE 的读写请求做出仲裁。CPU 读请
求有效期间,SSRAM_WRITE 模块读取 SSRAM 中的数据发送给 Avalon 总线;控制器的读请求无效
时,SSRAM_WRITE 模块将图像数据写入 SSRAM,此时该模块将忽略控制器的任何写请求。由于
SSRAM 的控制时钟(CLK_SSRAM)与摄像头采集数据的工作时钟(CMOS_PIXCLK)不一致,在该模
块中添加两个 DCFIFO 分别作为实时图像数据及其对应地址的缓冲空间,实现不同时钟域的数据同
步。图 9 展示了该模块的顶层信号和主要功能示意图。
图 9 SSRAM_2PORT 顶层信号和主要功能示意图
- 7 -
北京革新创展科技有限公司 电话:010-82608898 网址:http://www.gexin.com.cn
3 系统软件设计
系统采用 NiosWiki 社区(现为 AlteraWiki)发布的 nios2-linux-20090929.tar 内核开发包作为软
件开发基础。系统硬件设计完毕后,依据由 SOPC 系统组件生成的 C 语言头文件对开发包中内核进
行裁剪配置,针对当前系统应用对开发包的源代码、配置文件进行修改,编写相应驱动驱动程序实
现外设正常运行;在内核完全支持本系统之后,移植图形库进行虚拟试妆系统应用程序开发。这里
着重介绍开发包修改及内核配置和虚拟试妆软件开发。
3.1 开发包修改及内核配置
3.1.1 开发包修改
SOPC 系统构建好后,通过“sopc-create-header-files --single custom_fpga.h”生成自定义硬件对
应的 C 语言头文件,将该文件拷贝到“nios-linux/linux-2.6/arch/nios/include/asm/”路径中。开发包通
过 custom_fpga.h 和 nios.h 两个文件中的宏定义管理 SOPC 组件与 Linux 内核驱动代码对设备的映射,
同时通过 config.c 文件内置了大量设备的驱动支持,这些设备被定义为平台设备,由内核配置生成
的 config.h 文件和之前提到的两个头文件共同控制。图 10 解释了这三个文件之间的关系。
图 10 三个重要文件之间的关系
默认的内核开发包并不能直接使用,需针对本系统进行移植修改,主要内容如下:
内核将 UART 设置为终端时发现上电后不打印任何消息。查看代码发现 custom_fpga.h 中的串口
宏定义和 config.c 中使用的宏定义不同。将 config.c 中关于串口 0 的宏定义 UART0_*改为
UART_0_*即可。
内核启动后发现 SD 卡无法挂载。检查发现/dev/mmcblk* 系列设备的主设备号与注册时不一致,
导致挂载操作失败,解决办法是将"nios2-linuxuClinux-dist/vendor/Altera/nios2/device-table.txt"中
关于 mmcblk*的主设备号修改为与注册时一致,即 179。
内核启动时早期控制台只能使用 JTAG_UART,这给代码调试和之后的脱机工作带来不便,在
"nios2-linux/linux/arch/nios2/kernel/early_printk.c"中添加如下代码即可增加串口为早期控制台:
#elif defined(CONFIG_SERIAL_ALTERA_UART_CONSOLE)
#if UART_BASE > 0x20000000
#error Cannot map UART directly to IO_REGION
#error please disable early console
#endif
- 8 -
北京革新创展科技有限公司 电话:010-82608898 网址:http://www.gexin.com.cn