一种高效的图像数据采集处理方案
2017-07-05曾宪阳杨红莉郁汉琪
曾宪阳, 杨红莉, 郁汉琪
(南京工程学院 a. 工业中心;b. 数理部;c. 数学系,南京 210093)
一种高效的图像数据采集处理方案
曾宪阳a,c, 杨红莉b,c, 郁汉琪a
(南京工程学院 a. 工业中心;b. 数理部;c. 数学系,南京 210093)
分析了摄像头工作原理,设计了单片机系统硬件电路原理图,编写了精简的C语言程序代码。提出在行中断信号到来后,按序采集存储该行各像素点图像数据,去除冗余的循环判断语句,节约了采集时间,提高了图像采集效率。为满足特殊场合需要,还设计了由多场图像拼接成一幅图像的数据采集方案程序,以提高图像分辨率。实验结果表明:该程序不仅可以驱动低速51单片机采集摄像头图像数据,也可以在高速STM32等单片机上运行,以进一步提高现有图像采集速度与效率。
摄像头; 单片机; 图像采集; C语言
0 引 言
机器人小车在使用摄像头进行路面循迹时,为了采集到正确的图像信息[1-3],往往需要单片机与高速PCLK信号同步。然而,由于摄像头工作原理复杂,且51单片机运行速度低而无法满足要求。为解决这一问题,大多数学者采用的方法是通过降低摄像头输出分辨率来减少数据量,或者换用成本更高的高档单片机,这不仅降低了图像成像质量,也提高了系统成本,同时给多数不熟悉高档单片机的学者带来了困难[4-5]。本文分析了摄像头的工作原理,在不改变摄像头默认输出分辨率的前提下,提出一种高效的图像数据采集方案。该方案不仅能满足低速单片机驱动摄像头需要,而且还可移植到高速单片机如STM32上,以进一步提高现有图像采集速度及效率。
1 摄像头工作时序分析
图1为通过SIGLENT示波器显示的OV6620摄像头行场中断时序波形图,其中第1行黄色波形是作者设置的图像采集标志信号,第2行粉红色波形是摄像头发出的行中断请求信号,第3行青绿色波形是摄像头发出的场中断请求信号。结合摄像头原理,OV6620摄像头在NAL制式下,每秒将会输出25帧共50幅图像,每幅图像分辨率为356×292[6-8],共292行,356列。摄像头引脚包括一个场中断信号VSYNC以及一个行中断信号HREF,场中断信号VSYNC表示一副图像的输出起始信号,行中断信号HREF表示每行数据输出的起始信号。行中断信号到来后,其高电平期间为数据输出的有效期间,此时该行356个像素点数据将在PCLK的同步下,按序通过摄像头数据输出口Y0~Y7引脚依次输出,每个像素点数据为8位。HREF低电平期间为无效时间区,此时数据读取无效。为减小图像失真,用户往往需根据PCLK同步信号来读取各像素点数据[9-13]。
图1 通过示波器观察的OV6620摄像头行场中断输出时序图
2 数据采集系统设计
2.1 系统整体方案
PCLK同步信号主要是防止图像失真。低速单片机由于速度低无法同步PCLK信号,就无法读取该行所有的356个像素点。然而图像不失真的本质要求是“保证每行数据坐标完全对齐”,其实只须要求单片机在行中断请求信号到来后,时间间隔均匀的读取Y0~Y7信号,并且在此过程中不被其他中断请求信号中断即可[14]。
根据以上方案,为提高效率,应减少行数并减少每行像素点采集数量,更重要的是必须将行中断设置为高优先级以防止被其他中断请求信号干扰,这样就可得到一个等比例缩放图。
2.2 硬件电路原理图设计
图2为系统硬件电路原理图。为提高单片机数据存储器容量、提高单片机运行速度,选用增强型51单片机STC15F2K60S2[15]作为主控制芯片,其内部包含2.048 KB扩展数据存储器,可用来存放临时图像数据。其程序存储器有60 KB左右,可用来存放较大程序代码,并且内部自带复位电路。并且外部中断可配置为上升或下降沿触发方式,便于与OV6620摄像头中断请求信号匹配。Y0~Y7端口数据用以获取图像灰度数据,场中断请求信号HREF接至单片机外部中断1引脚,并在单片机中设置为下跳沿触发。行中断请求信号VSYNC接至单片机外部中断0引脚,在单片机中断初始化程序中将触发方式设置为上升沿触发方式即可。
图2 系统硬件电路原理图
2.3 系统程序编写
系统程序执行速度对于本系统数据采集效率将起到至关重要的作用,因此程序代码必须高效率。通常汇编语言程序效率较高,但不便于移植。本文将设计一种特殊结构的C语言程序,并且精简代码,以达到与汇编语言相同的执行效率。首先在程序存储器RAM中开启一个二维数组,用来临时存放采集的图像数据。设置行中断为高优先级中断,场中断为低优先级别中断,并且关闭其他中断源。当场中断信号到来后,开始接收一副新的图像数据。设置系统每隔10行采集1行数据,当行中断满足条件时开始采集该行数据。由于采集每行数据执行的指令相同,工程师们通常采用循环判断语句来完成采集任务,但每行数据有效采集时间只有40 μs,循环判断语句将浪费宝贵的时间。为保证采集的高效性,应去除循环判断语句,每个像素点的采集均占用一条独立的语句,按照“读—存储—读—存储”的模式顺序向下执行,读取的数据直接存入到二维数组中。这种程序结构使得程序代码长度增加,但避开了冗余的循环判断,因此程序执行的效率得到大大提高,采集速度也将达到最大值。同时注意到本文所选用的单片机程序存储器容量是足够满足要求的。根据此思路数据采集部分的完整程序代码(1)编写如下:
void Write0() //读第1行数据并保存
{ Array[0][0] = DATA_IO; Delay();
Array[0][1] = DATA_IO;Delay();
…
Array[0][27] = DATA_IO;}
…
void Write24() //读第29行数据并保存
{ Array[24][0] = DATA_IO;Delay();
Array[24][1] = DATA_IO;Delay();
…
Array[24][27] = DATA_IO;}
void ReceData() //数据读取、处理、发送
{ if(ReceData_EN == 1)
{ switch(ArrayRow)
{ case 0:Write0();break;
case 1:Write1();break;
…
case24:Write24();break;}
ReceData_EN = 0;
ArrayRow++; }
if(HREF_Flag==1) //判断一副图像开始标志
{ RowCount++; //指向下一行
if((RowCount>20)&&(RowCount%10)==0)
{ ReceData_EN=1; }
if(RowCount>=226)//图像接收完毕判断
{ RowCount = 0; //复位各计数器
ReceData_EN = 0;
HREF_Flag = 0;
ArrayRow = 0;
EX0=0; //关闭行中断
ArrayBinary(); //二值化处理
SendSeriPort();//发送给显示终端
EX0=1;//使能中断准备接收下一副图像
} }}
其中,行中断子程序流程图如图3所示。
图3 行中断子程序流程图
3 实验及分析
3.1 实验验证
以机器人小车循迹黑线为例,小车通过摄像头实时采集地面信息发送给51单片机,在keil C51编译环境下编译以上程序后下载到单片机。单片机通过采集数据、二值化处理,再通过串口将数据传递给PC上位机观察,得到的图像如图4所示。
(a) 上位机PC显示的图像
(b) 51单片机采集到的二值化图像
图4 51单片机通过摄像头采集到的路面图像与电脑显示的图像对比
图4展示了每行采集时间约为40 μs时的二值化图像。图4(a)为上位机视频采集卡采集到的视频图像。图4(b)显示了采集图像的二值化处理结果,0区域代表黑线部分,1区域代表白色地面,与图4(a)对比没有发现图像出现变形情况,而且很好地再现了一场黑白图像。该实验不仅证明了本文摄像头算法的可行性,也解决了51单片机采集图像数据的难题。
由于考虑到所选单片机运行速度及内部扩展RAM大小限制,因此以上单片机程序是将图像数据控制在25行,每行28个点,使得图像数据大小不超过内部扩展RAM容量。但是在一些特殊场合,如果对图像分辨率要求较高,可将分辨率设置为80行,每行采集100个像素点,此时单片机数据存储器容量不足以存放整幅图像,因此程序算法应做改进。将一副图像拆分成相等的4幅小图像,每幅图像为20行×100个像素点,场中断到来后,首先采集0~19行第1幅小图像,采集完后关闭行、场中断,经二值化处理后通过串口发送给上位机。然后再打开行、场中断,开始采集20~39行第2幅小图像,重复以上步骤,直到第4幅图像采集发送完毕,通过串口发送给上位机图像采集结束标志信号,此时一幅高分辨率的图像采集发送完毕。该程序算法提高了图像分辨率,但是适当降低了数据采集速度,因为一幅图像采集传输至少占用4场图像的时间,可以满足特殊场合下的用户需求。其接收部分程序代码(2)如下:
voidReceData()
{if(ReceData_EN == 1)
{switch(ArrayRow)
{case 0: Write0();break;
case 1: Write1();break;
…
case 79: Write79();break;}
ReceData_EN = 0;
ArrayRow++;}
if(HREF_Flag==1)
{ RowCount++;
if((RowCount>20)&&(RowCount%3)==0)
{ReceData_EN=1; } if((RowCount==77)||(RowCount==137)||(RowCount==197)||(RowCount==247))//判断一小幅图像是否接收完毕
{HREF_Flag = 0;
EX0=0;EX1=0;
ArrayBinary();
SendSeriPort();
EX0=1;EX1=1;}
if(RowCount>=247) //判断一整幅图像是否接收完毕
{RowCount = 0;
ReceData_EN = 0;
ArrayRow = 0;
EX0=1;EX1=1;} }}
3.2 程序算法在高速单片机上的运行情况
图5展示了程序代码(2)在STM32高速单片机上运行的情形,摄像头采集路面循迹黑线,经过二值化处理后通过串口传递给上位机。由于程序代码(2)的高效性,使得STM32单片机可以采集到更多的像素点和行数,也即采集到了更高分辨率的图像,本实验验证了程序的可行性以及高效性。其实验现场如图6所示。
图5 程序运行在STM32高速单片机上的情形
图6 实验现场照片
4 结 论
本文根据低速单片机驱动摄像头存在的困难,对OV6620摄像头工作原理进行了剖析,设计了单片机采集摄像头数据硬件电路,设计了顺序读取各像素点数据然后直接存储的采集方案,去除了冗余的循环判断,提高了数据采集效率。为了提高图像分辨率,将图像拆分成4幅小图像分别采集传输,编写了相应了C语言程序,能很好的在51单片机及STM32单片机上运行,验证了程序的可行性及高效性。
[1] 成 怡,金海林,樊冬雪.四轴飞行器视觉组合导航系统设计与实现[J].计算机测量与控制,2014,22(11):3705-3711.
[2] 张 璐,宋秋红.自动巡线小车的图像采集系统开发与优化[J].计算机工程与设计,2010,31(17):3754-3756.
[3] 高正中,赵丽娜,李世光,等.基于摄像头的智能车控制系统设计[J].自动化与仪表,2015(6):1-4.
[4] 潘 磊,葛中芹,庄建军,等.基于FPGA的HDMI视频流图像处理的系统设计[J].实验室研究与探索,2015,34(10):76-80.
[5] 范哲意,周治国,刘志文.基于FPGA和模型化设计的图像处理实验平台[J].实验室研究与探索,2013,32(4):63-66.
[6] 赵 伟,吴正博,曾志辉.基于Ov6620的图像采集系统的设计[J].自动化与仪器仪表,2012(6):82-83.
[7] OV6620datesheet[EB/OL].pdf.http://html.alldatasheet.com /html-pdf/ 103226/ETC/OV6620/53/1/OV6620.html.
[8] 田志宏,王 莹,王 杰,等.多门控制及图像实时采集系统的设计[J].实验室研究与探索,2014,33(8):37-40.
[9] 李兴泽,王福平. 基于CCD摄像头的小区自动循迹停车系统[J].计算机应用,2013,33(S1):321-323.
[10] 朱凤武,于丰华,韩 雨,等.基于摄像头循迹的智能汽车路径识别研究[J].中国农机化学报,2013,34(5):256-259.
[11] 赵 伟,吴正博,曾志辉.基于Ov6620的图像采集系统的设计[J].自动化与仪器仪表,2012(6):82-83.
[12] 李旭东,廖中浩,孟 娇,等.基于CMOS摄像头的智能车控制系统设计及实现[J].吉林大学学报,2013,31(4):414-418.
[13] 陈庆强,汤龙梅,蔡文培.基于摄像头的智能车路径识别与方向控制算法[J].福建工程学院学报,2015,13(3):229-234.
[14] 罗 旭,廉小亲,王涛.一种多路视频信号分时远距离传输方法的实现[J].电子技术应用,2015,41(3):158-160.
[15] 宏晶科技.STC15F系列单片机手册[DB/OL]. www.stcmcu.com.
An Efficient Scheme for the Image Data Acquisition and Processing
ZENGXianyanga,c,YANGHonglib,c,YUHanqia
(a. Industrial Center;b. Department of Mathematics and Physics,c. Department of Mathematics, Nanjing Institute of Technology, Nanjing 210093,China)
Due to the high speed of camera in outputting image data and the high frequency of PCLK pixel synchronizing signal, the single chip microcomputer has low efficiency in image data acquisition. This article studies the working principle of the camera, designs the hardware circuit diagram of the single chip microcomputer system, and writes simplified C language codes. After the arrival of the row interrupt signal, the collecting and storing of the pixels image data of the row will be done in order. In the processing, there is no loop statement which is redundant at all. This approach saves the time and improves the efficiency in the data acquisition. This paper also designs the acquisition program to improve the image resolution for the following special case, where the image is made from a number of images. The experimental results show that the program can not only drive at low speed camera image data 51 single-chip microcomputer and can also run on such as high-speed STM32 microcontroller, so it can further improve the existing image acquisition speed and efficiency.
camera; single chip microcomputer; image acqucsition; C language
2016-09-15
南京工程学院2014年校级教学改革项目(JG201440);南京工程学院青年基金重点项目(QKJA201404);南京工程学院创新基金重大项目(CKJA201410)
曾宪阳(1979-),男,湖北随州人,博士,实验师,研究方向:电子与通信。Tel.:13951950718;E-mail:zxy@njit.edu.cn
TP 212.9
A
1006-7167(2017)06-0147-04