基于PXA255的自动聚焦及图像采集模块设计
扫描二维码
随时随地手机看文章
摘 要:本文介绍了一种基于Intel公司 PXA255嵌入式处理器的自动聚焦图像采集系统。其中详细介绍了自动聚焦在FPGA中的实现以及图像采集在嵌入式linux系统中的实现,并给出了该系统的硬件结构图。
关键词:自动聚焦;图像采集;V4L视频接口;嵌入式QT;离散余弦变换
引言
目前市场上流行的摄像手机一般都不具备自动聚焦功能,这对于传感器分辨率在30万像素以下的摄像手机来说影响不大,但随着百万像素手机的面世,以及手机录像功能的采用,人们对摄像头的自动聚焦功能越来越关注。本文在Xhyper255开发板的基础上,结合项目开发的需要,在开发板上移植QT/embedded作为嵌入式GUI,并设计了自动聚焦和图像采集子模块,其中自动聚焦部分通过verilog HDL在开发板上的FPGA上实现,图像采集部分利用linux内核提供的video 4 linux接口实现。最后的采集程序界面采用嵌入式QT设计工具designer进行设计。
图1 硬件平台结构图
图2 DCT变换模块
图3 DCT变换流程图
图4 自动聚焦流程图
基于图像处理的自动聚焦系统算法
与传统的自动聚焦算法相比,基于图像处理的自动聚焦算法的实现不需要额外的信号源和相应的接收传感器,这有利于缩小器件的体积以降低成本,并降低器件的功耗。
在这类算法中,分析处理模块直接对获得的视频图像进行处理,以得到相应的判决函数,驱动控制模块则根据得到的聚焦判决函数信息来驱动步进电机,带动镜头前后移动,直到获得聚焦清楚的图像。因此,构造合理的判决函数就成了基于图像处理的自动聚焦算法的关键所在。理想的聚焦判决函数应该具有单峰性、无偏性并能反映离焦的极性,同时应具有较强的抗干扰能力。
在对目前的自动聚焦判决函数做相应的对比后,结合本系统的特点选择2D-DCT变换去除其中的低频成分,其余部分相加作为判决函数。2D-DCT变换的公式如式1所示。
(1)
这里C(0)=1/,C(u)=C(v) (u,v≠0)
自动聚焦系统的实现
开发平台的搭建如图1所示。
采用Xhyper255嵌入式开发板,图像采集子系统采用如下硬件搭建:30万像素CMOS图像传感器OV7620、 MCS51单片机、USB控制器OV511+、 步进电机和变焦镜头。
OV7620的主要特性为:单片数字式彩色图像传感器;1/3光学格式;数字视频输出格式: 1~500倍的自动曝光范围;自动增益和自动白平衡;能进行亮度、对比度、饱和度、伽马校正等多种调节功能。664×492的图像阵列扫描出原始的R、G、B彩色图像信号,经模拟处理电路进行曝光、校正、白平衡调整等处理后根据输出要求可以转换成YUV等多种信号输出形式。OV511+是为CMOS图像传感器设计的专用USB接口控制芯片。
DCT变换的FPGA实现
2D-DCT变换是视频压缩中的常用变换。在压缩过程中,将一幅图像分成许多8×8的小块进行变换。8×8的2D-DCT变换如式(2)所示:
(2)
这里C(0)=1/,C(u)=C(v)=1 (u,v≠0时)。
变换后去除其中的直流成份,其余的部分相加作为聚焦判决函数。函数最大值处即为焦点所处位置。
1. 块准备:给定的大小为640×480的彩色图像矩阵,将其分为三个矩阵,分别为亮度矩阵(Y),每个的大小为8×8,共4800个;剩下的同相矩阵(I)和正交矩阵(Q)分化为两组1200个矩阵,每个大小为8×8,使用下列矩阵将RGB分量映射到Y,I,Q分量上:
Y=0.30R+0.59G+0.11B
I=0.60R-0.28G-0.32B
Q=0.21R-0.52G+0.31B
对每个8×8矩阵Y,I,Q分量计算DCT,要计算2D-DCT,先对矩阵每行进行1D-DCT,然后对结果矩阵按列进行1D-DCT计算。
2. DCT模块设计:DCT系数采用case语句用查找表结构实现,程序源代码不在此详述。
DCT变换的实现过程为:串行数据首先放到输入缓冲(采用环形寄存器来构造),然后进行求积、求和运算,最终以并行数据的形式输出。这些操作要在控制模块下完成,以保证时序的正确。
DCT变换模块的框图如图2所示。8×8DCT变换实际上就是64个像素点的并行运算。对每个象素点所作的运算为:输入数据和DCT系数相乘,而后相加得到最后结果。流程如图3所示。
由公式可知,需要计算8×8=64次,每计算一次后,将i,j,u,v做相应变化,并重新在系数表中找到相应的系数,和新的数据相乘,作下一次运算。
自动聚焦的实现
去除每个8×8矩阵中的低频成分。然后把相应的高频成分相加,所得的和做为自动聚焦的判决函数,传输到CPU。编程实现一路PWM信号输出,控制步进电机的步长和方向。实现自动聚焦。自动聚焦的流程如图4所示。
图像采集的实现
图像采集程序的编写基于linux内核中提供的Video4Linux 接口。Video4Linux是2.2.0版本之后linux内核提供给网络摄像头、视频采集卡、电视卡等设备软件开发的接口标准。这个标准为内核、驱动、应用程序提供一个API进行交流。目前的最新Video4Linux版本为V4L2。
使用双URB轮流通信
对于对时间敏感而对数据的正确性要求不高的图像采集应用,USB总线定义了ISOC传输模式,USB摄像头应当使用这种传输方式。为了尽可能快地得到图像数据,应当在URB中指定USB_ISO_ASAP标志。
urb->transfer_flags=USB_ISO_ASAP;
//尽可能快地发出本URB
Linux系统中任何USB传输都通过URB实现。为提高速度,可以考虑扩大URB的缓冲,也可以建立两个URB,在等待一个URB被回收时,也就是图像正在被传感器采集时,处理、初始化另一个URB,并在回收后立刻将其发出。两个URB交替使用,大大减少了额外时间。
使用内存映射并用双帧缓冲提高效率
Linux系统通过read,write等来实现对硬件的操作,它们通过copy_to_user()、copy_from_user()等函数在内核和用户内存空间中互相拷贝。但是对于视频采集这类需要大量高速传输数据的应用来说,这种方法耗费的硬件资源过大,通过内存映射的方法可以使这一问题得到有效解决。首先使用vmalloc()申请足够大的核态内存,将其作为图像数据缓冲空间,两个URB带回的图像数据在这里暂存;然后使用remap_page_range()函数将其逐页映射到用户空间中。户态的图像采集处理程序使用mmap()函数,直接读写内核图像缓冲内存,大大减少额外开销。另外,为了进一步提高帧速率,本文采用双帧缓冲方式进行图像采集。
结语
本系统只需在DCT算法的实现和图像采集接口实现上根据具体的硬件条件作些修改,就可应用于大多数智能产品的开发(如基于嵌入式linux的智能手机的开发),因此具有较好的市场应用前景。