国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

物聯(lián)網(wǎng)項(xiàng)目分享 stm32實(shí)現(xiàn)車牌識(shí)別系統(tǒng) -物聯(lián)網(wǎng) 嵌入式 單片機(jī)

這篇具有很好參考價(jià)值的文章主要介紹了物聯(lián)網(wǎng)項(xiàng)目分享 stm32實(shí)現(xiàn)車牌識(shí)別系統(tǒng) -物聯(lián)網(wǎng) 嵌入式 單片機(jī)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


0 前言

?? 這兩年開始畢業(yè)設(shè)計(jì)和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點(diǎn),往往達(dá)不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長(zhǎng)自己做的項(xiàng)目系統(tǒng)達(dá)不到老師的要求。

為了大家能夠順利以及最少的精力通過畢設(shè),學(xué)長(zhǎng)分享優(yōu)質(zhì)畢業(yè)設(shè)計(jì)項(xiàng)目,今天要分享的是

?? 基于stm32的實(shí)現(xiàn)車牌識(shí)別系統(tǒng)

??學(xué)長(zhǎng)這里給一個(gè)題目綜合評(píng)分(每項(xiàng)滿分5分)

  • 難度系數(shù):4分
  • 工作量:4分
  • 創(chuàng)新點(diǎn):3分

1 簡(jiǎn)介

本系統(tǒng)利用STM32單片機(jī)驅(qū)動(dòng)攝像頭采集圖像,通過模式識(shí)別,匹配車牌的識(shí)別結(jié)果,并在屏幕上顯示。

2 主要器件

  • STM32F103RCT6 主控芯片
  • TFT液晶屏
  • OV7670攝像頭
  • 蜂鳴器
  • LED電路

3 實(shí)現(xiàn)效果

識(shí)別效果物聯(lián)網(wǎng)項(xiàng)目分享 stm32實(shí)現(xiàn)車牌識(shí)別系統(tǒng) -物聯(lián)網(wǎng) 嵌入式 單片機(jī),單片機(jī)
攝像頭模塊
物聯(lián)網(wǎng)項(xiàng)目分享 stm32實(shí)現(xiàn)車牌識(shí)別系統(tǒng) -物聯(lián)網(wǎng) 嵌入式 單片機(jī),單片機(jī)

4 設(shè)計(jì)原理

4.1 軟件總體過程:

(1)OV7670帶FIFO攝像頭圖像采集,采用GPIO模擬攝像頭時(shí)序,通過讀取FIFO輸出值將圖像直接顯示在LCD屏上
(2)LCD屏相當(dāng)于一個(gè)圖像緩存,同時(shí)也做顯示,通過讀取LCD屏上的像素值進(jìn)行圖像處理;
(3)車牌定位處理,車牌定位常用二值化分割,腐蝕膨脹處理,連通域計(jì)算等操作,顯然這些算法在stm32f1上實(shí)現(xiàn)是很困難的,且處理速度太慢,因此,采用RGB轉(zhuǎn)HSV顏色空間變換和閾值選擇進(jìn)行車牌定位,然后將車牌定位區(qū)域進(jìn)行二值化處理,不是藍(lán)色車牌的部分就是字符區(qū)域;
(4)車牌字符分割處理,字符分割先采用行統(tǒng)計(jì)加列統(tǒng)計(jì)的方式,確定每行和每列的有效像素和,進(jìn)一步確定字符區(qū)域;然后進(jìn)行橫向統(tǒng)計(jì)分割,通過每一列的像素和閾值判斷字符的分界線和個(gè)數(shù);
(5)車牌歸一化處理,歸一化處理先將每個(gè)字符提取出來,然后按照像素值進(jìn)行橫向和縱向壓縮,最終處理成模板一樣大小的字符;并在液晶屏上保存字符的數(shù)據(jù);
(6)模板匹配,將歸一化之后的字符,與模板中的字符通過像素值一一比較,確定相似度最高的字符就是目標(biāo)值;

4.2 具體解釋

圖像采集
通過OV7670攝像頭進(jìn)行圖像采集,采集的圖像大小為320*240像素,像素格式為RGB565。每個(gè)像素由兩字節(jié)組成,第一字節(jié)的高五位是Red,第一字節(jié)的低三位和第二字節(jié)的高三位組成Green,第二字節(jié)的低五位是Blue。

二值化
二值化就是讓圖像的像素點(diǎn)矩陣中的每個(gè)像素點(diǎn)的灰度值為0(黑色)或者255(白色),讓整個(gè)圖片呈現(xiàn)出只有黑色和白色的效果。二值化后的圖像中灰度值范圍是0或者255。這時(shí)需要設(shè)定一個(gè)閾值來對(duì)像素點(diǎn)進(jìn)行設(shè)置。

常用二值化方法:

  1. 取中值:設(shè)置閾值為127,灰度值小于127的為0,大于127的為255。這樣設(shè)置計(jì)算量小,計(jì)算快。缺點(diǎn)也嚴(yán)重:在不同的圖像中,顏色分布差別大,處理效果也不會(huì)很好。程序開始之前設(shè)置R,G,B的閾值,通過閾值判斷將像素設(shè)置為全黑(0x0000)或者全白(0xFFFF).同時(shí)根據(jù)色彩的變化記錄每一行的顏色跳變點(diǎn),由此識(shí)別出車牌區(qū)域。
  2. 取平均值:像素點(diǎn)平均值 = (像素點(diǎn)1灰度值 + 像素點(diǎn)2灰度值 + …… + 像素點(diǎn)n灰度值) / n
  3. 雙峰法:此方法適用于具有明顯雙峰直方圖的圖像,不適合直方圖中雙峰差別很大或雙峰間的谷比較寬廣而平坦的圖像。該方法認(rèn)為圖像由前景和背景組成,在灰度直方圖上,前景和背景會(huì)形成高峰,在雙峰之間的最低谷處就是閾值。

識(shí)別車牌區(qū)域
根據(jù)上一步的二值化,由于車牌區(qū)域跳變點(diǎn)多,由此可以得出車牌區(qū)域。分別記錄車牌區(qū)域的上下高度。然后通過RGB-HSV顏色轉(zhuǎn)換,識(shí)別出車牌區(qū)域的左右邊界。

字符分割
我國(guó)常見車牌以及排列順序大部分都是按照如下設(shè)計(jì)的:漢字、英文字母、點(diǎn)、英文字母、阿拉伯?dāng)?shù)字、阿拉伯?dāng)?shù)字、阿拉伯?dāng)?shù)字、阿拉伯?dāng)?shù)字?;谶@個(gè)規(guī)律,以及圖像采集高度一致,設(shè)計(jì)了如下的分割方法:

  1. 在內(nèi)存中開辟七個(gè)長(zhǎng)為車牌長(zhǎng)的七分之一和寬為車牌寬的區(qū)域
  2. 從車牌圖像長(zhǎng)邊的巾問向下開始掃描車牌圖像,并把掃描到的所有的點(diǎn)灰度值復(fù)制到0區(qū)域的第四個(gè)區(qū)域?qū)?yīng)位置上。然后再?gòu)纳舷蛳聮呙鑴倰呙柽^這一努的左邊或右邊,直到所掃描的這一峰上的所有點(diǎn)的灰度都是0時(shí)為止,并把這一豎認(rèn)為是字符的分離處。
  3. 切割第五到第七個(gè)字符。方法就是,切割完了第四個(gè)字符之后,再依次掃描剩下的空間,直到所掃描的這一豎上的所有點(diǎn)的灰度值不全為0時(shí),認(rèn)為是字符的開始并依次掃描直到所掃描的這一豎上的所有點(diǎn)的灰度值全為0時(shí)認(rèn)為是字符的結(jié)束。
  4. 切割第三到第四個(gè)字符。這兩個(gè)字符的切割方式與第五到第七個(gè)字符一樣。
  5. 切割第一到第二個(gè)字符。當(dāng)?shù)谌齻€(gè)字符切割完之后,我們將遇到一個(gè)點(diǎn),我們也把它看作一個(gè)字符,只不過這個(gè)點(diǎn)掃描之后就不要了。掃描完這個(gè)點(diǎn)之后,我們來切割第二個(gè)字符,它的切割方式與前面一樣。切割完了第二個(gè)字符之后,再向左掃描,直到所掃描的這一豎上的所有點(diǎn)的灰度值不全為0時(shí),認(rèn)為是字符的開始,并依次掃描直到所掃描所有剩下的,并填到相應(yīng)的位置,直到剩下的空間填滿。經(jīng)過粗分割后,可以得到一些單個(gè)字符區(qū)域和多余的空間。下一步我們將把這些多余的空間去掉。這將更有利于下一步字符的識(shí)別。
  6. 去除圖像上多余空間:車牌上的字符經(jīng)過了粗切割所得到的是一些單的字符,但在分配空間時(shí)是按照車牌的寬和長(zhǎng)的七分之一來分配的;所以這個(gè)空間可能大于字符應(yīng)該占的空問。所以,要將多余空間去除。對(duì)于第一個(gè)字符從第一行開始向下掃描,把那些一行中所有的點(diǎn)的灰度值全為0的點(diǎn)去掉,直到掃描到有一行不全為0時(shí)為止。然后再?gòu)牡谝涣虚_始向右掃描把那些一列中所有的點(diǎn)的灰度值全為0的點(diǎn)去掉,直到掃描到有一列不全為0時(shí)為止。接下來從最后一行開始向上掃描,把那些一行中所有的點(diǎn)的灰度值全為0的點(diǎn)去掉,直到掃描到有一行不全為0時(shí)為止。最后從最后一列開始向左掃描把那些一列中所有的點(diǎn)的灰度值全為0的點(diǎn)去掉,直到掃描到有一列不全為0時(shí)為止。重復(fù)上面的步驟完成剩下字符的切割。
  7. 根據(jù)二值化的結(jié)果,以及記錄的跳變點(diǎn)位置,對(duì)字符進(jìn)行分割,同時(shí)記錄字符的左右邊界。

字符匹配
對(duì)分割出來的字符進(jìn)行歸一化處理,這里用到圖片的擴(kuò)大算法,擴(kuò)大之后逐一的去進(jìn)行字符匹配。字符模板事前通過字模軟件轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)保存在數(shù)組中。最后根據(jù)匹配結(jié)果相似度最大的做為輸出結(jié)果。
歸一化圖像就是要把原來各不相同的字符統(tǒng)一到同一尺寸。因?yàn)閽呙柽M(jìn)來的圖像中字符大小存在較大的差異,而相對(duì)來說,統(tǒng)一尺寸的字符識(shí)別的標(biāo)準(zhǔn)性更強(qiáng),準(zhǔn)確率自然也更高。具體算法如下:先得到原來字符的高度和寬度,與系統(tǒng)已存字模的數(shù)據(jù)作比較,得出要變換的系數(shù),然后根據(jù)得到的系數(shù)按照插值的方法映射到原圖像中。

5 部分核心代碼

#define COLOR_RGB565_TO_R8(pixel) \
({ \
__typeof__ (pixel) __pixel = (pixel); \
__pixel = (__pixel >> 8) & 0xF8; \
__pixel | (__pixel >> 5); \
})

#define COLOR_RGB565_TO_G8(pixel) \
({ \
 __typeof__ (pixel) __pixel = (pixel); \
    __pixel = (__pixel >> 3) & 0xFC; \
    __pixel | (__pixel >> 6); \
})
#define COLOR_RGB565_TO_B8(pixel) \
({ \
   __typeof__ (pixel) __pixel = (pixel); \
   __pixel = (__pixel << 3) & 0xF8; \
   __pixel | (__pixel >> 5); \
 })	
int8_t imlib_rgb565_to_l(uint16_t pixel)
{   
float r_lin = xyz_table[COLOR_RGB565_TO_R8(pixel)];    
	float g_lin = 	xyz_table[COLOR_RGB565_TO_G8(pixel)];   
	float b_lin = xyz_table[COLOR_RGB565_TO_B8(pixel)];
	float y = ((r_lin * 0.2126f) + (g_lin * 0.7152f) + (b_lin * 0.0722f)) * (1.0f / 100.000f);
	y = (y>0.008856f) ? fast_cbrtf(y) : ((y * 7.787037f) + 0.137931f);	    
	return fast_floorf(116 * y) - 16;
}
	
int8_t imlib_rgb565_to_a(uint16_t pixel)
{  
	 float r_lin = xyz_table[COLOR_RGB565_TO_R8(pixel)];   
	 float g_lin =  xyz_table[COLOR_RGB565_TO_G8(pixel)];  
	 float b_lin =  xyz_table[COLOR_RGB565_TO_B8(pixel)];
	 float x = ((r_lin * 0.4124f) + (g_lin * 0.3576f) + (b_lin * 0.1805f)) * (1.0f / 095.047f);    float y = ((r_lin * 0.2126f) + (g_lin * 0.7152f) + (b_lin * 0.0722f)) * (1.0f / 100.000f);
	 x = (x>0.008856f) ? fast_cbrtf(x) : ((x * 7.787037f) + 0.137931f);    y = (y>0.008856f) ? fast_cbrtf(y) : ((y * 7.787037f) + 0.137931f);		
	 return fast_floorf(500 * (x-y));
}

int8_t imlib_rgb565_to_b(uint16_t pixel)
{   
	float r_lin = xyz_table[COLOR_RGB565_TO_R8(pixel)];   
	float g_lin = xyz_table[COLOR_RGB565_TO_G8(pixel)];   
	float b_lin = xyz_table[COLOR_RGB565_TO_B8(pixel)];				
	float y = ((r_lin * 0.2126f) + (g_lin * 0.7152f) + (b_lin * 0.0722f)) * (1.0f / 100.000f);    float z = ((r_lin * 0.0193f) + (g_lin * 0.1192f) + (b_lin * 0.9505f)) * (1.0f / 108.883f);				
	y = (y>0.008856f) ? fast_cbrtf(y) : ((y * 7.787037f) + 0.137931f);    z = (z>0.008856f) ? fast_cbrtf(z) : ((z * 7.787037f) + 0.137931f);				
	return fast_floorf(200 * (y-z));
}

	unsigned short xrIntFloat_16=(Src_width<<8)/Dst_width+1;   //擴(kuò)大倍數(shù)    
	unsigned short yrIntFloat_16=(Src_height<<8)/Dst_height+1;    
	 
	unsigned char* pDstLine=Dst_y8;  
	unsigned short srcy_16=0;    
	  
        for (y=0;y<Dst_height;++y)   
       {        
             unsigned char* pSrcLine=((unsigned char*)((unsigned char*)Src_y8+Src_width*(srcy_16>>8)));    
             unsigned short srcx_16=0;     
             for (x=0;x<Dst_width;++x)      
              {          
		pDstLine[x]=pSrcLine[srcx_16>>8];         
		srcx_16+=xrIntFloat_16;       
              }      
               srcy_16+=yrIntFloat_16;    
               pDstLine+=Dst_width;   
      } 
}

模板匹配算法

/**
* @function 歐幾里得距離計(jì)算,用于圖片相似度計(jì)算
* @param[in] src1和src2,必須是相同大小灰度圖片
* @param[out] 歐幾里得距離
* @retval ERROR -1 錯(cuò)誤
*/
float Euclidean_Distance(unsigned char *Src1,unsigned char *Src2,int length,float Euclideandis)
{
	if(Src1==NULL||Src2==NULL)
	{
		return -1;
	}
	int sum=0;
	int i=0;
	for(i=0;i<length;i++)
	{
		sum+=(int)pow((*Src1-*Src2),2);
		Src1++;
		Src2++;
	}
	
	Euclideandis=(float)sqrt(sum);
	return Euclideandis;
}


/**
* @function 余弦相似度計(jì)算,用于圖片相似度計(jì)算
* @param[in] src1和src2,必須是相同大小灰度圖片
* @param[out] 余弦相似度
* @retval 0 相似度小于0
* @retval ERROR -1 錯(cuò)誤
* @retval CosineSimilar
*/
float Cosine_Similarity(unsigned char *Src1,unsigned char *Src2,int length,float CosineSimilar)
{
	if(Src1==NULL||Src2==NULL)
	{
		return -1;
	}
	int sum=0,sum1=0,sum2=0;
	float temp0=0,temp1=0;
	int i=0;
	for(i=0;i<length;i++)
	{
	
		sum+=(int)(*Src1)*(*Src2);
		sum1+=(int)pow((*Src1),2);
		sum2+=(int)pow((*Src2),2);
		Src1++;
		Src2++;
	}
	if(sum<=0)
	{
		return 0;
	}
	temp0=(float)(sqrt(sum1));
	temp1=(float)(sqrt(sum2));
	CosineSimilar=(float)((sum/temp0)/temp1);

	return CosineSimilar;
}


/**
* @function 皮爾遜相似度計(jì)算,用于圖片相似度計(jì)算
* @param[in] src1和src2,必須是相同大小灰度圖片
* @param[out] 皮爾遜相似度
* @retval ERROR -1 錯(cuò)誤
* @par 2021年5月28日 zhengmf
*/
float Pearson_Correlation(unsigned char *Src1,unsigned char *Src2,int length,float PearsonSimilar)
{
	if(Src1==NULL||Src2==NULL)
	{
		return -1;
	}
	unsigned char aver1=0,aver2=0;
	int sum=0,sum1=0,sum2=0;
	float temp0=0,temp1=0;
	int i=0;
	for(i=0;i<length;i++)
	{
		sum1+=*Src1;
		sum2+=*Src2;
		Src1++;
		Src2++;
	}
	aver1=(unsigned char)(sum1/length);
	aver2=(unsigned char)(sum2/length);
	sum1=0;
	sum2=0;
	
	for(i=0;i<length;i++)
	{
		sum+=(int)(*Src1-aver1)*(*Src2-aver2);
		sum1+=(int)pow((*Src1-aver1),2);
		sum2+=(int)pow((*Src2-aver2),2);
		Src1++;
		Src2++;
	}
	if(sum<=0)
	{
		return 0;
	}
	temp0=(float)(sqrt(sum1));
	temp1=(float)(sqrt(sum2));
	PearsonSimilar=(float)((sum/temp0)/temp1);		
	return PearsonSimilar;
}


6 最后

?? 項(xiàng)目分享與指導(dǎo):https://gitee.com/sinonfin/sharing文章來源地址http://www.zghlxwxcb.cn/news/detail-831522.html

到了這里,關(guān)于物聯(lián)網(wǎng)項(xiàng)目分享 stm32實(shí)現(xiàn)車牌識(shí)別系統(tǒng) -物聯(lián)網(wǎng) 嵌入式 單片機(jī)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包