红外 人体跟踪录像.docx
《红外 人体跟踪录像.docx》由会员分享,可在线阅读,更多相关《红外 人体跟踪录像.docx(20页珍藏版)》请在冰点文库上搜索。
红外人体跟踪录像
基于红外热释电传感器的人体跟踪录像系统
电气信息学院魏旭峰孔凡明陈梦洋
【摘要】利用红外热释电传感器可以捕捉进运动的人体信号,通过放置四路红外热释电传感器,利用AT89S52单片机比较信号数据,进而驱动舵机转动实现运动人体的跟踪,同时单片机控制摄像机的工作,实现运动人体的跟踪录像。
【关键词】红外热释电传感器,单片机,舵机,人体跟踪
0引言
当今社会,视频监控系统在维护社会稳定、打击犯罪等方面扮演着越来越重要的角色,然而现在的视频监控系统还存在着许多不足,例如不能实现监控视角的自动调节,夜晚无法监控,监控视频本身太占资源不能大量存储并且大部分影像资料没有重点等。
本文就以上几方面缺点提出了一套行之有效的方法。
1系统原理
1.1热释电红外传感器工作原理
热释电红外传感器主要是由一种高热电系数的材料,如锆钛酸铅系陶瓷、钽酸锂、硫酸三甘钛等制成尺寸为2*1mm的探测元件。
在每个探测器内装入一个或两个探测元件,并将两个探测元件以反极性串联,以抑制由于自身温度升高而产生的干扰。
由探测元件将探测并接收到的红外辐射转变成微弱的电压信号,经装在探头内的场效应管放大后向外输出。
为了提高探测器的探测灵敏度以增大探测距离,一般在探测器的前方装设一个菲涅尔透镜,该透镜用透明塑料制成,将透镜的上、下两部分各分成若干等份,制成一种具有特殊光学系统的透镜,它和放大电路相配合,可将信号放大70分贝以上,这样就可以测出10~20米范围内人的行动。
菲涅尔透镜利用透镜的特殊光学原理,在探测器前方产生一个交替变化的“盲区”和“高灵敏区”,以提高它的探测接收灵敏度。
当有人从透镜前走过时,人体发出的红外线就不断地交替从“盲区”进入“高灵敏区”,这样就使接收到的红外信号以忽强忽弱的脉冲形式输入,从而强其能量幅度。
人体辐射的红外线中心波长为9~10--um,而探测元件的波长灵敏度在0.2~20--um范围内几乎稳定不变。
在传感器顶端开设了一个装有滤光镜片的窗口,这个滤光片可通过光的波长范围为7~10--um,正好适合于人体红外辐射的探测,而对其它波长的红外线由滤光片予以吸收,这样便形成了一种专门用作探测人体辐射的红外线传感器。
1.2舵机控制原理
舵机是一种位置伺服驱动器,适用于需要转角变化并可以保持的控制系统。
在机器人控制系统中,舵机控制效果是影响机器人动作性能的重要因素,舵机可以在微型机电系统和航模中作为基本的执行机构。
舵机的控制信号实际上是一个脉冲宽度调制信号(PWM信号),该信号可由FPGA器件、模拟电路或单片机产生。
采用FPGA成本较高,用模拟电路来实现则电路较复杂,不便于实现多路输出。
目前采用单片机实现舵机控制的方法比较普遍。
舵机有三根引线:
电源线、地线、信号线。
电源线和地线用于提供舵机内部直流电动机和控制线路所需的4~6V电源。
信号线的输入是一个周期为20ms的PWM信号。
当PWM信号的脉冲宽度改变时,舵机转轴的角度发生改变,角度变化与脉冲宽度的变化成正比。
舵机控制原理如图2所示。
它是一个典型的位置随动闭环系统,由于舵机响应存在机械滞后和电延迟,该系统整体可以看作一个纯滞后环节和一个积分环节的串联。
PWM控制信号引入控制电路板驱动直流电动机,减速齿轮组由直流电动机传动,其输出端带动一个线性的比例电位器做位置检测,该电位器把齿轮组转角转换为一比例电压反馈给控制线路板,控制线路板将其与输入的PWM控制信号比较,产生纠正信号,并驱动直流电动机正向或反向转动,使齿轮组的输出位置与期望值相符,纠正信号最终趋于零,从而达到使舵机精确定位(位置伺服)的目的。
舵机控制原理图
1.3红外光电管工作原理
1.4AT89S52单片机简介
单片机是整个系统的核心,本系统采用AT89S52,它是一种低功耗、高性能、CMOS8位微控制器,具有8k字节在系统可编程FLASH存储器,使用Atmel公司高密度非易失性存储器技术制造,与工业80C51指令和引脚完全兼容。
片上FLASH允许程序存储器在系统可编程。
亦使用常规编程器,在单芯片上拥有8位CPU和在系统可编程存储器,使得AT89S52能为众多嵌入式控制应用系统提供灵活、有效的解决方案。
AT89S52除了具备80C51单片机标准功能外,还可降至0Hz静态逻辑操作,支持两种软件,可选择节电模式。
空闲状态下,CPU停止工作,允许RAM、定时器/计数器、串口中断继续工作。
掉电保护方式下,RAM中内容被保存,振荡被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
2系统设计
2.1系统硬件设计
2.1.1电源设计
电源由7805芯片将12V的电压稳压在5V,为单片机、传感器、舵机供电。
电路图如下:
2.1.2传感器电路设计
热释电红外开关电路原理图
图中BISS0001的运算放大器OP1作为热释电红外传感器的前置放大。
由C3耦合给运算放大器OP2进行第二级放大。
再经由电压比较器COP1和COP2构成的双向鉴幅器处理后,检出有效触发信号去启动延迟时间定时器。
输出信号经晶体管T1、驱动继电器去接通负载。
R3为光敏电阻,用来检测环境照度。
当作为照明控制时,若环境较明亮,R3的电阻值会降低,使9脚输入为低电平而封锁触发信号,节省照明用电。
若应用于其他方面,则可用遮光物将其罩住而不受环境影响。
SW1是工作方式选择开关,当SW1与1端连通时,红外开关处于可重复触发工作方式;当SW1与2端连通时,红外开关则处于不可重复触发工作方式。
2.1.3传感器摆放位置设计
四个传感器来确定180度的监视范围,因此每个传感器的监视视角应该为45°,因此,其摆放角度如下图所示:
2.1.4舵机电路设计
舵机电路的设计相对来说比较简单,只需接上电源后,通过单片机的一个I/O口产生频率为50Hz的PWM波控制,通过调节PWM的占空比来实现舵机的转向,高电平时间与转向角之间的对应关系如下图所示:
本系统用P2^4口产生PWM波控制舵机转向。
2.1.5单片机——电脑串口设计
电脑与单片机的标准电平不一致,因此,要想实现单片机与电脑的串行通信就必须转换电平。
MAX232芯片是美信公司专门为电脑的RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。
该系统中就采用该芯片实现单片机与电脑的串行通信。
电路图如下:
2.2系统软件设计
2.2.1总体程序设计方案
整个电路分为传感器检测、舵机控制、视频录像设置以及电脑串口控制四大块。
首先,传感器将捕捉到的信号经过反向传给控制端,单片机系统对传感器返回的信号值进行检测,并以此为根据控制舵机的转向以及摄像头的开闭。
默认情形下,如果传感器长时间(默认是3分钟)未检测到有人,那么摄像头自动对中,并且每个10分钟录像3分钟,以此循环,可达到节省硬盘资源的并且监控不过分间断目的。
当串口发出命令后,则摄像头的一切工作状态交由串口控制,同样,三分钟无操作后,摄像头继续由传感器返回值控制。
2.2.2程序设计
程序的流程图如下:
c语言程序如下:
/**********************************************************************
名称:
红外人体跟踪程序
功能:
通过热释电红外传感器的信号判断人体位于哪一区域,然后控制舵机转向
相应位置,实现非连续跟踪,连续录像;
四个传感器分别为P2^0~P2^3,判断区域位置角分别为22.5、67.5、112.5
157.5度。
**********************************************************************/
#include
#defineucharunsignedchar
#defineuintunsignedint
voidmode_scan();//传感器状态检测函数声明
voidMove(uchard_ang,p_ang);//舵机转动函数声明
sbitPWM=P2^4;//舵机控制脚
sbitCamera=P2^5;//相机控制脚
bitscanflag=0;
bitCam_work_flag=0;
bitUart_con=0;//串口控制标志位,置1则由串口控制摄像头的工作
ucharANG=15;//舵机角度初始值
ucharANG_table[]={8,9,10,11,12,13,14,15,16,17,18,19,20,21,22};
//舵机角度串值
uintcount0=0;//定时器0的累加变量
ucharcount1=0;//定时器1的累加变量
ucharcount_s=0;//传感器检测周期累加变量
ucharcount_u=0;//串口控制定时累加变量
uintsecond=0;//秒
ucharmin=0;//分
uchartime_set=5;//相机工作以及工作间隔时间
ucharstate;//传感器状态值变量
ucharLstate;//传感器上次状态值变量
voidTimer_Init()//定时器初始化
{
TMOD=0x12;//定时器0工作在方式2,定时器1工作在方式1
TH0=256-100;
TL0=256-100;//12MHz晶振,0.1ms
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;//12MHz晶振,10ms
SCON=0x50;//串口通信初始化
TCLK=1;
RCLK=1;//定时器2产生通信波特率
TH2=0xff;
TL2=0xdc;//波特率9600
RCAP2H=0xff;
RCAP2L=0xdc;//16位重装值
ET2=1;//定时器2使能
TR2=1;//定时器2触发
ES=1;//串行中断开
ET0=1;//定时器0使能
ET1=1;//定时器1使能
EA=1;//总中断开
}
/****************相机开关触发函数***************/
voidON_off()
{
uchari=50,j=100;
Camera=0;
while(--i)
while(--j);
Camera=1;
}
/**************传感器状态检测函数**************/
voidmode_scan()
{
state=~(P2&0x0f);//状态值提取
if(state!
=Lstate)//检测不同状态值
{
switch(state)
{
case0xf1:
//22.5°
{
Move(8,ANG);
time_set=3;
min=0;
second=0;
count1=0;//定时清零
count_s=0;
if(!
Cam_work_flag)//检测相机是否处于工作状态
{
ON_off();
Cam_work_flag=1;
}
break;
}
case0xf3:
//45°
{
Move(10,ANG);
time_set=3;
min=0;
second=0;
count1=0;//定时清零
count_s=0;
if(!
Cam_work_flag)//检测相机是否处于工作状态
{
ON_off();
Cam_work_flag=1;
}
break;
}
case0xf7:
case0xf5:
case0xf2:
//67.5°
{
Move(13,ANG);
time_set=3;
min=0;
second=0;
count1=0;
count_s=0;
if(!
Cam_work_flag)
{
ON_off();
Cam_work_flag=1;
}
break;
}
case0xff:
case0xf6:
//90°
{
Move(15,ANG);
time_set=3;
min=0;
second=0;
count1=0;
count_s=0;
if(!
Cam_work_flag)
{
ON_off();
Cam_work_flag=1;
}
break;
}
case0xf4:
case0xfa:
case0xfe:
//112.5°
{
Move(18,ANG);
time_set=3;
min=0;
second=0;
count1=0;
count_s=0;
if(!
Cam_work_flag)
{
ON_off();
Cam_work_flag=1;
}
break;
}
case0xfc:
{
Move(20,ANG);
time_set=3;
min=0;
second=0;
count1=0;//定时清零
count_s=0;
if(!
Cam_work_flag)//检测相机是否处于工作状态
{
ON_off();
Cam_work_flag=1;
}
break;
}
case0xf8:
//157.5°
{
Move(22,ANG);
time_set=3;
min=0;
second=0;
count1=0;
count_s=0;
if(!
Cam_work_flag)
{
ON_off();
Cam_work_flag=1;
}
break;
}
default:
;
}
}
Lstate=state;//记录当前状态值,供下次检测后比较用
scanflag=0;//检测标志置0
}
/********************时间转换函数******************/
voidTime()
{
if(count1==10)//count1==100
{
second++;
count1=0;
if(second==60)//1分钟
{
second=0;
min++;
if(Uart_con)
{
count_u++;
if(count_u==3)
{
count_u=0;
Uart_con=0;
}
}
if(min==time_set)//判断是否定时已到
{
Cam_work_flag=!
Cam_work_flag;//相机工作状态置反
switch(time_set)
{
case3:
//如果3分钟到
{
time_set=5;//接下来是5分钟的关闭状态
ON_off();//关摄像头
Move(15,ANG);
break;
}
case5:
//如果是5分钟到
{
time_set=3;//接下来是3分钟的摄像
ON_off();//开摄像头
break;
}
}
min=0;//分钟置零
}
}
}
if(count_s==30)//检测间隔
{
scanflag=1;//检测标志置位
count_s=0;//计数置零
}
}
/*******************延时函数********************/
voiddelay()
{
uchari=0,j=0;
for(i=0;i<50;i++)
for(j=0;j<200;j++);
}
/*******************主函数***********************/
voidmain()
{
Timer_Init();//定时器初始化
TR0=1;//开定时器0
TR1=1;//开定时器1
while
(1)
{
if(!
Uart_con)//判断串口控制位是否置位
{
if(scanflag)//判断是否在检测周期
{
mode_scan();//传感器状态检测
}
}
Time();//时间、定时转换
}
}
/*******************定时器0中断函数*****************/
/****************产生方波,控制舵机转角*************/
voidTimer0()interrupt1
{
count0++;
if(count0<=ANG)
{
PWM=1;
}
else
{
PWM=0;
}
if(count0==200)
count0=0;//方波周期是20ms
}
/*******************定时器0中断函数*****************/
/***********************累加计时********************/
voidTimer1()interrupt3
{
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;//重装赋初值
count1++;
count_s++;
}
/*******************舵机平滑转动函数******************/
voidMove(uchard_ang,p_ang)
{
uchari;
if(d_ang>p_ang)
{
for(i=1;i<=d_ang-p_ang;i++)
{
ANG=ANG_table[p_ang-8+i];
delay();
}
}
else
{
for(i=1;i<=p_ang-d_ang;i++)
{
ANG=ANG_table[p_ang-8-i];
delay();
}
}
}
/******************串口控制程序*******************/
/************接收命令等级划分0-e级**************/
voidUART()interrupt4
{
uchartemp;
if(RI)
{
temp=SBUF;
ANG=ANG_table[temp];//舵机角度指令数据
Uart_con=1;//串口控制位置位
min=0;
second=0;
count1=0;//定时器1计数置零
count_u=0;//串口控制时间清零
RI=0;//接收中断标志位清零
}
}
3系统测试
经实际测试,该系统能够很好的实现对运动人体的跟踪以及摄像功能,在串口控制模式下也能正常工作,达到了预定的目标。
4结束语
本文介绍了应用热释电红外传感器,AT89S52单片机,舵机等实现了对运动人体的跟踪以及录像,为合理的监控以及节省资源提高实际监控的可用性提供了一套行之有效的方法。
其优点正如所述:
1,对运动的人体进行跟踪,得到更有效的监控录像;
2,减少不必要的监控录像存储,节约存储成本,延长可存储监控视频时间;
3,成本低,效果好,利于推广。
另外,该系统本身还有很大的改进空间,例如:
更加灵敏的跟踪,体积可以更小,实现多目标的跟踪以及运动预测等方面,这里只提一下。
可见该系统有巨大潜力。
参考文献
【1】盛青松,冯志芬《89C51单片机控制的红外自动跟踪装置》高校理科研究
【2】颜峰《红外线摄像监控技术》仪器仪表用户2007(3)
【3】方庆山,林春芳《一种基于AT89C2051的多路舵机控制方案设计》微特电机2009(7)
【4】范建伟《微型红外热释电传感器及其应用.传感器世界2001(7)
【5】唐姗姗,曹立军《工程中的串口通信设计[J]》信息通信,2009,(05)