模式识别技术
来源:互联网 发布:用淘宝联盟买多件宝贝 编辑:程序博客网 时间:2024/05/16 09:52
由于最近参加智能车比赛,其中有谈到道路识别技术,比如黑线识别处理。智能汽车涵盖了控制、模式识别、传感技术、电子、电气、计算机、机械等多个学科的知识,具有很强的综合性和实践性。所以今天做下笔记
查阅了百度百科,下面是模式识别的介绍:
模式识别(Pattern Recognition)是人类的一项基本智能,在日常生活中,人们经常在进行“模式识别”。随着20世纪40年代计算机
的出现以及50年代人工智能的兴起,人们当然也希望能用计算机来代替或扩展人类的部分脑力劳动。(计算机)模式识别在20世纪60年代初迅速发展并成为一门新学科。
模式识别(Pattern Recognition)是指对表征事物或现象的各种形式的(数值的、文字的和逻辑关系的)信息进行处理和分析,以对事物或现象进行描述、辨认、分类和解释的过程,是信息科学和人工智能的重要组成部分。模式识别又常称作模式分类,从处理问题的性质和解决问题的方法等角度,模式识别分为有监督的分类(Supervised Classification)和无监督的分类(Unsupervised Classification)两种。二者的主要差别在于,各实验样本所属的类别是否预先已知。一般说来,有监督的分类往往需要提供大量已知类别的样本,但在实际问题中,这是存在一定困难的,因此研究无监督的分类就变得十分有必要了。
模式还可分成抽象的和具体的两种形式。前者如意识、思想、议论等,属于概念识别研究的范畴,是人工智能的另一研究分支。我们所指的模式识别主要是对语音波形、地震波、心电图、脑电图、图片、照片、文字、符号、生物传感器等对象的具体模式进行辨识和分类。
模式识别研究主要集中在两方面,一是研究生物体(包括人)是如何感知对象的,属于认识科学的范畴,二是在给定的任务下,如何用计算机实现模式识别的理论和方法。前者是生理学家、心理学家、生物学家和神经生理学家的研究内容,后者通过数学家、信息学专家和计算机科学工作者近几十年来的努力,已经取得了系统的研究成果。
应用计算机对一组事件或过程进行辨识和分类,所识别的事件或过程可以是文字、声音、图像等具体对象,也可以是状态、程度等抽象对象。这些对象与数字形式的信息相区别,称为模式信息。
模式识别所分类的类别数目由特定的识别问题决定。有时,开始时无法得知实际的类别数,需要识别系统反复观测被识别对象以后确定。
模式识别与统计学、心理学、语言学、 计算机科学 、生物学、控制论等都有关系。它与 人工智能 、 图像处理 的研究有交叉关系。例如自适应或自组织的模式识别系统包含了人工智能的学习机制;人工智能研究的景物理解、自然语言理解也包含模式识别问题。又如模式识别中的预处理和特征抽取环节应用图像处理的技术;图像处理中的图像分析也应用模式识别的技术。
模式识别可用于文字和语音识别、遥感和医学诊断等方面。
三、下面是我的取黑线算法
/*=====================================================================================
*名 称: 线性CCD的采集处理程序
*功 能:
*入口 参数:
*说 明: 基于飞思卡尔的MC9S12XS128处理器
*范 例:
*编者 时 间: Ye.FuYao 2013-03-31
*======================================================================================*/
#include "Includes.h"
uint8 msg[14] = "Hello! World!";int a,La=5,Lb=120;
uint8 max=200,min=100; //关灯50,开灯100.uint16 Kuan_DU,Z_xin,Z_x_Pian; //左La右Lb位置,跑到宽度Kuan_DU,中心值Z_xin,中心偏移值Z_x_Pianuint8 ka=1,kb=1,fa,fb,pa=1,pb=1;
uint8 table[]={ //数码管数组0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
byte ADV[128]={0,0}; //存放采集数据 #define u8 uint8#define u32 uint32#define TSL_CLK_1 GPIO_Set(PB,PRT,0,1); //PB0写1 //CLK #define TSL_CLK_0 GPIO_Set(PB,PRT,0,0); //PB0写0 #define TSL_SI_1 GPIO_Set(PB,PRT,1,1); //PB1写1 //SI #define TSL_SI_0 GPIO_Set(PB,PRT,1,0); //PB1写0
#define dula_1 GPIO_Set(PB,PRT,2,1); //PB2写1 #define dula_0 GPIO_Set(PB,PRT,2,0); //PB2写0 #define wela_1 GPIO_Set(PB,PRT,3,1); //PB3写1 #define wela_0 GPIO_Set(PB,PRT,3,0); //PB3写0
//短暂的延时void Dly_us(byte us);//较长延时void Dly_ms(int ms){ int ii,jj; if (ms<1) ms=1; for(ii=0;ii<ms;ii++) for(jj=0;jj<2670;jj++); //busclk:32MHz--1ms //for(jj=0;jj<5340;jj++); //busclk:64MHz--1ms }void ji_shu_R(uint16 temp) //右数码管显示函数,最大99{ wela_1; PORTA=0x04; wela_0; dula_1; PORTA=table[temp/10]; Dly_ms(8); dula_0; wela_1; PORTA=0x08; wela_0; dula_1; PORTA=table[temp%10]; Dly_ms(1); dula_0; } void ji_shu_L(uint16 temp) //左数码管显示函数,最大99{ wela_1; PORTA=0x01; wela_0; dula_1; PORTA=table[temp/10]; Dly_ms(8); dula_0; wela_1; PORTA=0x02; wela_0; dula_1; PORTA=table[temp%10]; Dly_ms(1); dula_0;}void ji_shu(uint16 temp) //整体数码管显示函数,最大99{ wela_1; PORTA=0x01; wela_0; dula_1; PORTA=table[temp/1000]; Dly_ms(5); dula_0; wela_1; PORTA=0x02; wela_0; dula_1; PORTA=table[temp%1000/100]; Dly_ms(4); dula_0; wela_1; PORTA=0x04; wela_0; dula_1; PORTA=table[temp%1000%100/10]; Dly_ms(5); dula_0; wela_1; PORTA=0x08; wela_0; dula_1; PORTA=table[temp%1000%100%10]; Dly_ms(5); dula_0; }
//TSL140连接端口初始化 void TSL_Port_Init(void) { GPIO_Init(PB,0,1,0); GPIO_Init(PB,1,1,0);}void SetBusCLK_32M(void){ CLKSEL=0X00; // disengage PLL to system PLLCTL_PLLON=1; // turn on PLL SYNR =0x40 | 0x03; // pllclock=2*osc*(1+SYNR)/(1+REFDV)=64MHz; REFDV=0x80 | 0x01; POSTDIV=0x00; _asm(nop); // BUS CLOCK=32M _asm(nop); while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it; CLKSEL_PLLSEL =1; //engage PLL to system; }
//----------------------------------------------------- void AD_Init(void) { ATD0CTL1=0x00; //7:1-外部触发,65:00-8位精度,4:放电,3210:ch ATD0CTL2=0x40; //禁止外部触发, 中断禁止 ATD0CTL3=0xa0; //右对齐无符号,每次转换4个序列, No FIFO, Freeze模式下继续转 ATD0CTL4=0x01; //765:采样时间为4个AD时钟周期,ATDClock=[BusClock*0.5]/[PRS+1] ATD0CTL5=0x30; //6:0特殊通道禁止,5:1连续转换 ,4:1多通道轮流采样 ATD0DIEN=0x00; //禁止数字输入 }
void RD_TSL(void) { byte i=0,tslp=0; TSL_CLK_1; TSL_SI_0; Dly_us(1); TSL_SI_1; TSL_CLK_0; Dly_us(1); TSL_CLK_1; TSL_SI_0; Dly_us(1); for(i=0;i<64;i++) { TSL_CLK_0; Dly_us(8-i/8+1); while(!ATD0STAT0_SCF); ADV[tslp]=ATD0DR2L; ++tslp; TSL_CLK_1; Dly_us(8-i/8+1); } for(i=0;i<64;i++) { TSL_CLK_0; Dly_us(i/8+1); while(!ATD0STAT0_SCF); ADV[tslp]=ATD0DR2L; ++tslp; TSL_CLK_1; Dly_us(i/8+1); } }void SendHex(unsigned char hex) { unsigned char temp; temp = hex >> 4; if(temp < 10) { SCISend1(0,temp +'0'); } else { SCISend1(0,temp - 10 + 'A'); } temp = hex & 0x0F; if(temp < 10) { SCISend1(0,temp + '0');
} else { SCISend1(0,temp - 10 + 'A'); }}
void SendImageData(unsigned char * ImageData) { unsigned char i; unsigned char crc = 0;
SCISend1(0,'*'); SCISend1(0,'L'); SCISend1(0,'D'); SendHex(0); SendHex(0); SendHex(0); SendHex(0);
for(i=0; i<128; i++) { SendHex(*ImageData++); } SCISend1(0,0); SCISend1(0,'#');}
//黑线采集算法 0 <————— 64 ——————> 128 中间往两边采黑线 。//La,Lb,fa,fb,Kuan_DU,Z_xin,Z_x_Pian; //左La右Lb位置,跑道宽度Kuan_DU,中心值Z_xin,中心偏移值Z_x_Pianvoid Black(u8 *ADV){ fa=1; fb=1; ka=1; kb=1;/* //取黑线阀值 max=ADV[62]; //取中点值,可能是最大值 for(a=63;a>5;a--) //这里一定大于1,不然下面a-1可能是255 { if((ADV[a-1]<ADV[a])&&pa) { min=(ADV[a-1]+max)/2-50; //这里-10是上下值的一半,可能太大了,适当减小10 } } //取值结束,返回min */ for(a=63;a>=0;a--) //左半部分 0<————————————64 { if((ADV[a]<min)&& fa &&(68<Lb)&&pa) //fa=1,刚进入循环,只要(ADV[a]<min)时,马上记住位置La=a,fa=0; { //当右黑线(68<Lb)时,不再进入取值。 La=a; fa=0; //不再进入if语句,等待下一次循环 } } if(5>La) //当左边没有黑线时,小于2,不进上面if语句。 { ka=0;// fa=0; //不再进入if语句,等待下一次循环 }
for(a=64;a<128;a++) //右半部分 64————————————>127 { if((ADV[a]<min)&&fb&&(60>La)&&pb) //刚进入循环,fb=1,只要(ADV[a]<min)时,马上记住位置Lb=a; { //当左黑线(60>Lb)时,不再进入取值. Lb=a; fb=0; //不再进入if语句,等待下一次循环 }
}
if(120<Lb) //当右边没有黑线时, 大于126,不进上面if语句。 { kb=0;// fa=0; //不再进入if语句,等待下一次循环 } //测试用// ji_shu(min);// ji_shu_R(Lb);// ji_shu_L(La);
///* //计算中心偏移量,中心点坐标为64
//正常直线行走 if( (0!=ka) && (0!=kb) ) //没有紧急情况,才这样算 { Kuan_DU=Lb-La; //算出跑到宽度 Z_xin=(Kuan_DU/2)+La; //算出中心值 if(64<Z_xin) { Z_x_Pian=Z_xin-64; //算出中心偏移量 //右数码管显示 ji_shu_R(Z_x_Pian); } else { Z_x_Pian=64-Z_xin; //算出中心偏移量 //左数码管显示 ji_shu_L(Z_x_Pian); } //测试用 // ji_shu(Kuan_DU); // ji_shu(Z_xin); }
//紧急处理
if( (0==ka) && (0!=kb)) //黑线是否到了左区外 ||<—————0—————64{ ka=1; kb=1;
Z_xin=Lb-(Kuan_DU/2); //中心值 if(68>Lb) //当右黑线过中点时(小于64) { Z_xin=18; //具体请况具体分析 } Z_x_Pian=64-Z_xin; //算出中心偏移量 //左数码管显示 ji_shu_L(Z_x_Pian); } //去右线杂波if(68>Lb) //当右黑线过中点时 {
pb=0; //不采Lb了 Z_x_Pian=46; //左数码管显示 ji_shu_L(Z_x_Pian); for(a=64;a<128;a++) //检查右半是否有杂波 { if(ADV[a]<min &&fb) //只要(ADV[a]<min)时,马上记住位置Lb=a; { Lb=a; fb=0; //不再进入if语句,等待下一次循环 } if(63<Lb<66) //当Lb回到64时 { Lb=67; //防止if死循环 pb=1; //打开Lb采集, //这里可能会有一个BUG }
} } if( (0==kb) && (0!=ka)) //黑线是否到了右区外 64—————128—————>||{ ka=1; kb=1;
Z_xin=La+(Kuan_DU/2); //中心值
if(60<La) //当左黑线过中点时(大于64) { Z_xin=110; //具体请况具体分析 } if(64<Z_xin) { Z_x_Pian=Z_xin-64; //算出中心偏移量 //右数码管显示 ji_shu_R(Z_x_Pian); } }//*///去左线杂波if(60<La) //当左黑线过中点时 {
pa=0; //不采La了 Z_x_Pian=46; //右数码管显示 ji_shu_R(Z_x_Pian); for(a=63;a>=0;a--) //检查左半是否有杂波 { if(ADV[a]<min &&fa) //只要(ADV[a]<min)时,马上记住位置Lb=a; { La=a; fa=0; //不再进入if语句,等待下一次循环 } if(61<La<64) //当La回到64时 { La=61; //防止if死循环 pa=1; //打开La采集, //这里可能会有一个BUG }
} }
if( (0==ka) && (0==kb)) //当 左右都没有 黑线 时{ ka=1; kb=1; Z_xin=64; //中心设为64,中点值。 Z_x_Pian=Z_xin-64; //则,偏移量为零 ji_shu_R(Z_x_Pian); ji_shu_L(Z_x_Pian); }
}//算法结束
void main(void) { byte i=0; SetBusCLK_32M(); //总线初始化 DisableInterrupt(); //关闭中断 //MCUInit(FBUS_32M); SCIInit(0); //波特率115200初始化// SCISendN(0,13,msg); //发送"Hello! World!"
TSL_Port_Init();//CCD初始化 AD_Init(); //AD初始化
GPIO_Init(PB,2,1,1); //数码管I/O GPIO_Init(PB,3,1,1); //数码管I/O DDRA=0Xff; //PA为输出
for(;;) { RD_TSL(); //读取线性传感器的数值 SendImageData(ADV) ; //上位机软件 Black(ADV); // 中心偏移量
//测试用// ji_shu(1234);// ji_shu_L(2); //数码管显示函数,最大99// ji_shu_R(1); //数码管显示函数,最大99// SCISend1(0,'#'); //串口测试
// Dly_ms(10); //根据需要延时// if(!(++i%10)) PORTB_PB7=~ PORTB_PB7; //每循环10次,LED反转一次 } }
//不是很精确,保证一定的数量级void Dly_us(byte us){ byte ii; for(ii=0;ii<us;ii++) { #ifdef BUSCLOCK32M _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); #endif
#ifdef BUSCLOCK64M _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); #endif
#ifdef BUSCLOCK80M _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); _asm(nop);_asm(nop);_asm(nop);_asm(nop); #endif } }
- 模式识别技术
- 模式识别技术
- 模式识别技术漫谈(2)
- 模式识别技术漫谈(3)
- 模式识别技术漫谈(5)
- 模式识别技术漫谈
- 模式识别技术漫谈
- 程序和行为模式识别技术
- 模式识别技术漫谈(1)
- 模式识别技术漫谈(4)
- 模式识别技术漫谈(1)
- 数字图像模式识别技术详解【笔记】
- 模式识别
- 模式识别
- 模式识别(
- 模式识别
- 模式识别
- 模式识别
- window7安装虚拟机上网
- 移植之乱谈
- jQuery 2.0 发布,你准备好了吗?
- [JSP]javaBean的class文件存放位置说明
- Ubuntu 使用Git 使用
- 模式识别技术
- clickonce部署软件文件位置分析
- 第四次上机实验
- 正则表达式的应用(转)
- IP XFRM配置示例:利用linux kernel自带的IPSec实现,手动配置IPSec
- 用android LinearLayout和RelativeLayout实现精确布局
- ORA-00911: invalid character问题解决办法
- java序列化
- Structs1基础知识