模式识别技术

来源:互联网 发布:用淘宝联盟买多件宝贝 编辑:程序博客网 时间: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         }          }