?????? 由于最近參加智能車比賽,其中有談到道路識別技術,比如黑線識別處理。智能汽車涵蓋了控制、模式識別、傳感技術、電子、電氣、計算機、機械等多個學科的知識,具有很強的綜合性和實踐性。所以今天做下筆記
?
查閱了百度百科,下面是模式識別的介紹:
模式識別(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_Pian
uint8 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 systemPLLCTL_PLLON=1;???// turn on PLLSYNR =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:chATD0CTL2=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_Pian
void 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/OGPIO_Init(PB,3,1,1);?? //數碼管I/ODDRA=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}?????????
}
?
總結
以上是生活随笔為你收集整理的模式识别技术的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。