基于FPGA的手勢語音轉(zhuǎn)換器
摘要:
一直以來,聾啞人與健康人之間的交流就十分的困難,特別是沒有學習過手語的人。我們的這個項目旨在打破這個障礙,讓沒學過手語的人也能聽見聾啞人的心聲。我們的手語語音轉(zhuǎn)換器目的就是就是通過它提供一種有效的途徑將聾啞人的手勢識別出來,并轉(zhuǎn)換成我們普通人所習慣的語音信息,從而實現(xiàn)聾啞人與我們的有效溝通。目前手語識別可以分為基于視覺的識別系統(tǒng)和基于數(shù)據(jù)手套的識別系統(tǒng)?;谝曈X的手勢識別系統(tǒng)采用常見的視頻采集設備作為手勢感知輸入設備,價格便宜、便于安裝。鑒于基于視覺的手勢識別方法交互自然便利,適于普及應用,且更能反映機器模擬人類視覺的功能,我們這次的識別方法為基于視覺的手勢識別。
1 緒論
1.1 項目背景與分析
一直以來,聾啞人與健康人之間的交流就十分的困難,特別是沒有學習過手語的人。我們的這個項目旨在打破這個障礙,讓沒學過手語的人也能聽見聾啞人的心聲。我們的手語語音轉(zhuǎn)換器目的就是就是通過它提供一種有效的途徑將聾啞人的手勢識別出來,并轉(zhuǎn)換成我們普通人所習慣的語音信息,從而實現(xiàn)聾啞人與我們的有效溝通。
目前手語識別可以分為基于視覺的識別系統(tǒng)和基于數(shù)據(jù)手套的識別系統(tǒng)。前者需要使用者戴上數(shù)據(jù)手套,這就給使用者造成一定的不便,基于視覺的手勢識別系統(tǒng)采用常見的視頻采集設備作為手勢感知輸入設備,價格便宜、便于安裝,提供了更加自然、直接的人機交互方式。在以后的發(fā)展中,手勢識別是有著很大的前景,在人機交互中起著不可忽視的作用。
我們這次的識別方法為基于視覺的手勢識別。手勢識別分為動態(tài)手勢識別和靜態(tài)手勢識別,動態(tài)手勢定義為手運動的軌跡,而靜態(tài)手勢強調(diào)通過手型傳遞一定的意義。本文研究靜態(tài)手勢識別。靜態(tài)手勢識別通常是基于視覺的2D手勢識別,設計一個手勢語音的轉(zhuǎn)換器可以說給聾啞人帶來了福音,解決了聾啞人與健康人的交流困難。
本文所設計的手勢語音識別器大大提高了殘疾人與正常人進行交流溝通的方便性。系統(tǒng)的開發(fā)與利用將可以促進手勢識別技術的發(fā)展,具有很強的實用性和廣闊的應用前景。
手勢識別還可以應用到很多其他的機器視覺領域,實現(xiàn)人機之間的更好的交互,在越來越注重用戶體驗的今天,手勢識別的定會在今后的交互中大放異彩。
1.2 目前相關技術的研究及應用狀況
當今社會中中傳統(tǒng)的人機交互方式已經(jīng)不能滿足人們對現(xiàn)代生活方式的追求。傳統(tǒng)的一些交互方式在舒適性,易用性,趣味性,個性化等方面已經(jīng)越來越凸顯出不足之處。自然語言是人類交流的主要手段,通過語言同計算機交談無疑是廣大計算機用戶夢寐以求的愿望新型直觀自然的交互方式如動作交互,語音交互越來越成為生活中必要的方式,但是由于由于其技術復雜度高、環(huán)境干擾因素較大、數(shù)據(jù)處理量大、成本高,研發(fā)速度和研發(fā)水平等受到嚴重的制約,但是, 現(xiàn)代化發(fā)展的今天,人們又迫切需要更加舒適更加自然的交互方式,現(xiàn)在的交互方式逐漸不能滿足人們的要求。
目前,國內(nèi)外相關技術研究大多還處于理論研究階段,很多技術都不成熟,手勢識別技術卻很少有比較成熟的產(chǎn)品出現(xiàn),基本上處于理論研究階段,即便有,也只是對一些簡單的動作通過加速度等傳感器來實現(xiàn),相對比較簡單。但還沒有能將手勢通過圖像識別出來的相關產(chǎn)品,我們的手勢語音識別器就是在手勢動作識別的基礎上實現(xiàn)的,將該技術應用在解決聾啞人的語言交流問題,我們在這里對其進行了嘗試。
2 系統(tǒng)功能描述及設計
2.1 功能概述
上圖是手勢語音轉(zhuǎn)換器的系統(tǒng)結構框架圖,在手勢識別的時候需要做到準確性,實時性的要求。我們的設計利用圖像傳感器在外界環(huán)境中的手勢圖像進行實時采集,通過我們的系統(tǒng)平臺對圖像進行一系列的處理之后,轉(zhuǎn)換為對應的語義,再利用語音合成芯片變?yōu)槲淖终Z音輸出。將手勢轉(zhuǎn)換為對應的語音意義輸出。其功能框架結構圖如下:
2.2 具體方案選擇
2.2.1 圖像采集模塊
兩個方案 1.直接利用USB攝像頭進行圖像采集2.利用模擬攝像頭,經(jīng)過AD芯片轉(zhuǎn)換
方案一
優(yōu)點:直接利用電腦的USB攝像頭,雖然是CMOS攝像頭,但是攝像頭已經(jīng)內(nèi)置DSP芯片,無需再對模擬數(shù)據(jù)進行AD轉(zhuǎn)換,FPGA芯片可以直接利用,并且USB接口標準已經(jīng)非常普及,所以此方案將會使用很普遍并且非常普及。我們也配備了USB攝像頭。
缺點:USB協(xié)議非常復雜,不得不熟悉USB協(xié)議,但是USB協(xié)議學習要很長的時間,另外要增設USB的主從芯片(USB-HOST,比如SL811HS)。這也將會使我們的項目進展更加緩慢。
方案二
優(yōu)點:采用美國OmniVision公司開發(fā)的CMOS彩色/黑白圖像傳感器芯片OV7620,此芯片的功能比較強大,外圍元件的連接也很少,可以勝任。
缺點:需要自己連接硬件電路,采購CCD或CMOS模擬攝像頭,并且FPGA內(nèi)部必須設計驅(qū)動OV7620的電路邏輯。且轉(zhuǎn)換過來的數(shù)據(jù)量可能比較大,而且需要FPGA里大量的BRAM作為數(shù)據(jù)緩存。
最終,我們選擇了方案二作為我們圖像采集的最終方案。
2.2.2 圖像采集識別處理
圖像采集處理單元主要包括圖像的實時采集,平滑處理、圖像區(qū)域分割、圖像膚色提取、圖像矩特征提取和匹配等幾個部分。其目的是通過實時的圖像采集,得到手勢的圖像信息,再進行處理得到相應的語義含義。
采集來的圖像數(shù)據(jù)量大,采集來之后我們應對圖像進行預處理,去除圖像中的背景噪聲,然后提取其特征,現(xiàn)在的特征提取方法有基于圖像紋理的特征提取,基于圖像形狀的特征提取。對于采集得到的圖像,其包含了大量的數(shù)據(jù),而且采集來的圖像的背景的復雜性以及含有噪聲,我們要將圖像進行預處理,包括對圖像進行平滑,圖像增強等一些預處理來消除噪聲,背景等對后續(xù)處理的干擾。預處理的目的是改善圖像數(shù)據(jù),抑制不需要的變形或者增強某些對于后續(xù)處理來說比較重要的圖像特征。
2.2.3 語音合成模塊
一.利用語音合成芯片
芯片選擇是OSYNO6188嵌入式中文語音合成芯片,通過異步串口接收待合成的文本,可直接通過PWM輸出方式驅(qū)動揚聲器,亦可外接單支三極管驅(qū)動揚聲器,即可實現(xiàn)文本到聲音(TTS)的轉(zhuǎn)換。支持國家標準GB_2312 所有漢字。
一.自行設計語音合成系統(tǒng)
自行設計的語音系統(tǒng)首先要考慮方案的難易程度問題,目前技術上面采用時域和頻域的方法進行語音合成??紤]到方案實現(xiàn)的問題以及現(xiàn)有器件情況,考慮采用較簡單的波形編輯法,將較短的數(shù)字音頻段(即合成基元)拼接并進行段音平滑后生成連續(xù)語流的方法。這種方法占用的存儲空間大,但計算量小、計算速度快,而且合成語音自然度較高,顯然比較適合于芯片性能較弱的嵌入式系統(tǒng)方面的應用。
語音合成將采用串口與上位機進行連接。欲發(fā)音漢字的國標碼(GB碼)由串口送入MCU,MCU將其映射為Flash存儲器地址表中對應項的地址,然后根據(jù)此地址取得對應項中的命令字,由MCU根據(jù)該命令字讀取該漢字發(fā)音對應的語音數(shù)據(jù),連續(xù)讀出語音數(shù)據(jù)并以游程碼解碼算法解碼后,按照語音采樣時的固定速率通過D/A轉(zhuǎn)換和功率放大播放。本文中語音采樣速率為11025B/s。為滿足應用需求,本文首先構建易于快速解碼的語音庫,根據(jù)特定Flash存儲器的存儲格式,以快速多查找表尋址及命令字預先存儲的方式組織并存儲在Flash存儲器中,以滿足語音播放的實時要求。同樣,MCU的代碼也要優(yōu)先考慮速度而犧牲諸如模塊化、可讀性方面的要求。最后,出于實用性考慮,系統(tǒng)中需加入足夠的輸入緩沖區(qū)支持,以滿足一次輸入多個流字或整句的要求。
一.利用語音合成芯片
優(yōu)點:利用現(xiàn)有的材料,可以加快整個課題的進度語音合成芯片已經(jīng)成型,系統(tǒng)運行的質(zhì)量和效果比自行設計的芯片效果要好系統(tǒng)的可靠性更高
缺點:芯片會增加整個系統(tǒng)的成本利用芯片無法充分利用FPGA的片上資源
二.自行設計語音合成芯片
優(yōu)點:自主設計語音合成部分,增加了整個系統(tǒng)的技術含量和含金量,充分開發(fā)了Xilinx開發(fā)板的片上資源,降低了整個系統(tǒng)的成本
缺點:開發(fā)的難度加大,開發(fā)的周期加長,自主開發(fā)的系統(tǒng)沒有現(xiàn)有的語音合成芯片功能強大以及穩(wěn)定
綜合考慮:我決定在方案的初期使用語音合成芯片,因為這樣會加快系統(tǒng)的開發(fā)進程,讓我們有更多的時間和精力放在手勢識別和處理方面。
在方案的后期考慮自行開發(fā)語音合成芯片,利用FPGA的片上資源。
在這里我們分為兩部分:前段文本分析部分和后端語音合成部分。
3、系統(tǒng)硬件設計
3.1 基于FPGA的片上系統(tǒng)設計
本文實現(xiàn)了一個基于FPGA的片上系統(tǒng),該片上系統(tǒng)能夠完成術中圖像的實時采集、識別匹配和其他外設的控制。該系統(tǒng)用XILINX公司EDK(Embedded Development Kit)軟件開發(fā),是一個基于Microblaze的嵌入式系統(tǒng)。系統(tǒng)該體系架構如上圖所示。
MicroBlaze軟核是一種針對Xilinx FPGA器件而優(yōu)化的功能強大的32位微處理器,適用于所有現(xiàn)產(chǎn)的FPGA器件MicroBlaze軟內(nèi)核和其它外設IP核一起,可以完成可編程系統(tǒng)芯片(SOPC)的設計MicroBlaze軟內(nèi)核采用RISC(reduced instruction system computer)架構和哈佛(Harvard)結構的32位指令和數(shù)據(jù)總線,內(nèi)部有32個通用寄存器R0~R31和2個特殊寄存器程序指針(PC)和處理器狀態(tài)寄存器(MSR)MicroBlaze還具有指令和數(shù)據(jù)緩存,所有的指令長度都是32位,有3個操作數(shù)和兩種尋址模式,指令功能劃分有邏輯運算,算術運算,分支,存儲器讀/寫和特殊指令等,指令執(zhí)行的流水線是并行流水線,它分為3級流水線:取指,譯碼和執(zhí)行。 Microblaze軟核,片上本地存儲器,標準總線互連以及基于片上外設總線(OPB)的外圍設備構成了MicroBlaze嵌入式系統(tǒng)。
3.2 視頻采集模塊設計
3.2.1 視頻采集芯片
本項目使用的視頻解碼器是圖像傳感器采用美國OmniVision公司開發(fā)的CMOS彩色圖像傳感器芯片OV7620,該芯片將CMOS傳感器技術與數(shù)字接口組合,是高性能的數(shù)字圖像傳感器,可提供彩色/黑白多種格式的輸出;內(nèi)置10位雙通道A/D轉(zhuǎn)換器,輸出8位/16位圖像數(shù)據(jù);具有自動增益和自動白平衡控制,能進行亮度、對比度、飽和度等多種調(diào)節(jié)功能??赏ㄟ^SCCB進行內(nèi)部寄存器編程配置。只需要外接一個27MHz的晶振,就可輸出數(shù)字視頻流的同時還提供像素時鐘PCLK、行參考信號HREF、垂直同步信號VSYNC,便于外部電路讀取圖像,并可編程設置HREF、VSYNC在圖像局部開窗,輸出窗口圖像。它支持連續(xù)和隔行兩種掃描方式,VGA與QVGA兩種圖像格式;最高像素為664492,幀速率為30fp8;數(shù)據(jù)格式包括YUV、YCrCb、RGB三種,能夠滿足一般圖像采集系統(tǒng)的要求。OV7620內(nèi)部可編程功能寄存器的設置有上電模式和SCCB編程模式。本系統(tǒng)采用SCCB編程模式,連續(xù)掃描,16位YUV數(shù)據(jù)輸出。
在這里我們要用到SCL和SDA對圖像傳感器進行配置,傳感器有16位的數(shù)據(jù)輸出還提供像素時鐘PCLK、行參考信號HREF、垂直同步信號VSYNC。
VSYNC是垂直場同步信號,其下降沿表示一幀圖像的開始;HREF是水平同步信號,其上升沿表示一行圖像數(shù)據(jù)的開始;PCLK表示輸出數(shù)據(jù)同步信號
3.2.2 SCCB總線對OV7620的配置
OV7620的控制采用SCCB(SeriaI Camera ControlBus)協(xié)議。SCCB是簡化的I2C協(xié)議,SIO-l是串行時鐘輸入線,SIO-O是串行雙向數(shù)據(jù)線,分別相當于I2C協(xié)議的SCL和SDA。SCCB的總線時序與I2C基本相同,它的響應信號ACK被稱為一個傳輸單元的第9位,分為Don’t care和NA。Don’t care位由從機產(chǎn)生;NA位由主機產(chǎn)生,由于SCCB不支持多字節(jié)的讀寫,NA位必須為高電平。另外,SCCB沒有重復起始的概念,因此在SCCB的讀周期中,當主機發(fā)送完片內(nèi)寄存器地址后,必須發(fā)送總線停止條件。不然在發(fā)送讀命令時,從機將不能產(chǎn)生Don’t care響應信號。由于I2C和SCCB的一些細微差別,所以采用GPIO模擬SCCB總線的方式。SCL所連接的引腳始終設為輸出方式,而SDA所連接的引腳在數(shù)據(jù)傳輸過程中,通過設置IODIR的值,動態(tài)改變引腳的輸入/輸出方式。SCCB的寫周期直接使用I2C總線協(xié)議的寫周期時序;而SC-CB的讀周期,則增加一個總線停止條件。OV7620功能寄存器的地址為0x00~0x7C(其中,不少是保留寄存器)。通過設置相應的寄存器,可以使OV7620工作于不同的模式。
SCCB的寄存器是EEPROM,由于是OV6620/OV7620的片內(nèi)EEPROM,穩(wěn)定性不高。雖然理論上SCCB寫入一次,終生受用,但是數(shù)據(jù)容易丟失,因此,SCCB程序的寫入應在讀圖像之前每次寫入,并把IICENALBE拉高使能,使SCCB寄存器起作用。
下面列出了一些常用的OV7620寄存器:
在對OV7620進行配置的時候,主設備必須做以下操作:
①產(chǎn)生開始/停止信號
②在 SCL上施加串行時鐘
③將7位從設備地址,讀寫位和8位子地址串行放到 SDA 上
讀的一方必須在確認位時間里拉低 SDA,返回一個確認位作為對寫設備所寫數(shù)據(jù)的確認。
在寫周期里,OV7620 返回確認位,在讀周期里,主設備返回確認位,除非讀的數(shù)據(jù)是最后一個字節(jié)。如果讀的數(shù)據(jù)是最后一個字節(jié),主設備并不返回確認位,通知從設備讀周期可以終止。每一字節(jié)內(nèi),最高位總是先傳輸。讀/寫控制位是第一字節(jié)的最低位。標準 IIC 通信僅需兩個管腳:SCL 和 SDA。 SDA 設置成開漏雙向端口。SCL 為高時,SDA 上從高到低的轉(zhuǎn)換表示開始。SCL 為高時,SDA 上從低到高的轉(zhuǎn)換表示結束。只有主設備可以產(chǎn)生開始/結束信號。
除了以上兩種情況外,協(xié)議要求 SDA 在時鐘 SCL位高電平器件保持穩(wěn)定。只有當 SCL為低時每一位才允許改變狀態(tài)
OV7620 的 SCCB接口支持多字節(jié)讀寫操作。主設備必須在寫周期而不是讀周期內(nèi)提供子地址。因此,OV6620/7620 讀周期的子地址是前一個寫周期的子地址。在多字節(jié)讀寫周期中,在第一個數(shù)據(jù)字節(jié)完成后,子地址自動遞增,使得連續(xù)位置的存取可以在一個總線周期內(nèi)完成。多字節(jié)周期改變了原來的子地址。因此,如果在一個多字節(jié)周期后有一個讀周期,就必須插入一個單字節(jié)寫周期來提供新的子地址。
SCCB的具體實現(xiàn):
OV7620支持單個從設備.,當一只有唯一個從設備時,6620 ID須置為0XC0 (寫)和0XC1 (讀)。7620 ID是0X42(寫)和 0X43(讀)。 在寫周期中,IIC 總線上的第一個字節(jié)是選擇單個片內(nèi)寄存器的子地址,第三個字節(jié)是讀寫該寄存器的數(shù)據(jù)。寫一個未定義的子地址將被忽略。在讀周期中,IIC 總線上的第一個字節(jié)是讀寫該寄存器的數(shù)據(jù),子地址用前面的。讀一個未定義的子地址,返回數(shù)據(jù)不定。
3.2.3 OV7620采集圖像的流程
我們的采集是連續(xù)采集模式,用到了三個同步信號:像素時鐘PCLK、行參考信號HREF、垂直同步信號VSYNC,在這三個信號中,由于我們采用的是GPIO來作為圖像數(shù)據(jù)的采集端口,而經(jīng)過我們的測試,GPIO端口的時鐘頻率在5MHz,而在我們的ov7620的三個同步信號里面,PCLK的周期最短,當ov7620采用27MHz的系統(tǒng)時鐘頻率的時候,默認的PCLK的周期為74ns,而我們的microblaze的中斷響應時間遠大于這個周期,在圖像數(shù)據(jù)的匹配的時候,我們只能通過改變Ov7620的寄存器的值來降低ov7620的PCLK頻率。通過設置時鐘頻率控制寄存器,可將PCLK的周期設為200ns。
3.2 語音合成模塊
3.2.1語音合成芯片OSYNO6188
利用語音合成芯片OSYNO6188嵌入式中文語音合成芯片,通過異步串口接收待合成的文本,可直接通過PWM輸出方式驅(qū)動揚聲器,即可實現(xiàn)文本到聲音(TTS)的轉(zhuǎn)換。支持國家標準GB_2312 所有漢字。
該模塊OSYNO 6188 提供一組全雙工的異步串行通訊(UART)接口,實現(xiàn)與系統(tǒng)板相連接,進行數(shù)據(jù)的傳輸。OSYNO 6188利用TxD和 RxD 以及 GND 實現(xiàn)串口通信。其中GND 作為信號地。
其端口特性如下:1、 初始波特率:1200 bps ,起始位: 1 , 數(shù)據(jù)位:8 ,校驗位:無,停止位:1 ,流控制:無。
信息終端以信息幀格式向 TTS 芯片發(fā)送命令碼,對 TTS芯片進行系統(tǒng)設置。TTS芯片根據(jù)命令碼及參數(shù)進行相應操作,并向信息終端返回命令操作結果。規(guī)定每個信息幀最多 56 個字節(jié),第一個字節(jié)為開始字節(jié) 0x01,第二三四個字節(jié)為參數(shù)描述字節(jié),后面最多跟著 50個數(shù)據(jù)字節(jié),以 0x04為結束字節(jié),最后一個字節(jié)為發(fā)送異或校驗字節(jié)。
3.2.2語音合成芯片的數(shù)據(jù)包形式:
每次都是以數(shù)據(jù)包的形式進行傳送,其形式如下:
實際輸出范例:
漢字語義:這是我們的手勢語音轉(zhuǎn)換器;
輸出數(shù)據(jù)包:0x1 0x80 0x87 0xE1 0xD5 0xE2 0xCA 0xC7 0xCE 0xD2 0xC3 0xC7 0xB5 0xC4 0xCA 0xD6 0xCA 0xC6 0xD3 0xEF 0xD2 0xF4 0xD7 0xAA 0xBB 0xBB 0xC6 0xF7 0xA3 0x8D 0xA3 0x8A 0x4 0xF1
漢字語義:該手勢意思是A
輸出數(shù)據(jù)包:0x1 0x80 0x87 0xE1 0xB8 0xC3 0xCA 0xD6 0xCA 0xC6 0xD2 0xE2 0xCB 0xBC 0xCA 0xC7 0xA3 0xC1 0xA3 0x8D 0xA3 0x8A 0x4 0xA7
漢字語義:沒有找到該手勢的意思
輸出數(shù)據(jù)包:0x1 0x80 0x87 0xE1 0xC3 0xBB 0xD3 0xD0 0xD5 0xD2 0xB5 0xBD 0xB8 0xC3 0xCA 0xD6 0xCA 0xC6 0xB5 0xC4 0xD2 0xE2 0xCB 0xBC 0xA3 0x8D 0xA3 0x8A 0x4 0xCD
4、軟件設計
4.1 圖像的預處理
在攝像頭傳入的信號受環(huán)境的影響,后期的轉(zhuǎn)換,總要造成圖像的某些降質(zhì)。必須考慮對圖像進行改善處理。對于手勢識別系統(tǒng),我們主要用到一些圖像增強技術。
圖像增強技術通常有兩類方法:空間域法和頻率域法。
空間域法主要是空間域中對圖像像素灰度值直接進行運算處理。
頻率域法只要是將圖像變換到其他域中,對圖像變換值進行一些操作后,再變換會原來的空間域。通常采用傅立葉變換對圖像操作。
在本系統(tǒng)設計中,軟件采用了圖像的平滑,基本已經(jīng)夠用。而圖像的變換域處理方法沒有采用,主要是軟件在時間域處理的效果已經(jīng)夠用了。
圖像的銳化處理沒有采用,因為在實現(xiàn)中發(fā)現(xiàn)效果不是很好,并且引入了噪聲。
4.2.1 圖像的平滑處理
本系統(tǒng)的平滑用到了模板操作平滑,將原圖中的一個像素的灰度值和它周圍鄰近的八個像素的灰度值相加,然后求得平均值(除以9),取平均值作為新圖中的灰度值。
平滑模板可以濾掉一定的噪聲,但是也有一定程度的模糊。這里,我們采用了不同的矩陣模板來消除不同情況下的噪聲。其中用到的模板有:
經(jīng)過平滑處理后的圖像接著送圖像分割處理,從而分割出人體區(qū)域和背景圖像區(qū)域。
4.2.1 圖像的背景減法
圖像背景減法在圖像的分割的前期工作起到了一定的作用。
(1)初始化背景 沒有前景目標進入環(huán)境之前,首先對背景連續(xù)采集n幅圖像,通過這n幅圖像,可以建立一個初始背景的統(tǒng)計模型,背景中的每個點i,定義
為該點的顏色期望,為顏色值分布的方差,有如下的公式:
其中為i點在t幅圖像中的顏色值。這樣,所有的點
構成了初始背景模型。
(2)前景區(qū)域的提取 初始背景建立以后,對于每一幅新采集的當前土地,就可以進行前景區(qū)域的提取了。設當前圖像中點i的顏色值為,可以通過以下公式將圖像二值化:
其中,所有標志為1的點構成前景區(qū)域,為0的點構成背景區(qū)域,k為自行設置的常數(shù)。K值的選取對分割效果具有直接的影響,當k過小時,提取了手部區(qū)域的同時還提取了部分的背景區(qū)域;當k過大時,會使提取的手部區(qū)域不完整。通過大量的實驗,選取k=4時可以取得較好的分割結果。
(3)背景模型更新 隨著時間的推移,背景中不可避免的會發(fā)生一些變化。如果一直使用最初的背景模型,長時間后就會發(fā)生較大的誤差。為了解決這個問題,采用了背景模型更新的方法。設平均值和方差分別為時刻t點i的顏色期望和方差, 為時刻t采集到的圖像中點t的顏色值,則t+1時刻,有:
其中α為學習率,可根據(jù)實際情況進行調(diào)解。這樣,背景模型在每一時刻不斷的得到更新,以便和實際情況盡可能保持一致。
實現(xiàn)如下:
n張圖片中一副背景圖片:
圖1-1 背景圖片
前景圖片混合背景圖片:
圖1-2 前景圖片混合背景圖片
背景圖像減法處理之后的結果
圖1-3 背景減法處理后得到的圖像
觀察處理結果可以得到,手部的圖片大致地保存下來,背景圖片絕大部分被剪掉了。
背景減法的缺點是,如果背景和前景顏色接近,前景圖片的數(shù)據(jù)會丟失,如上圖,手部圖像里面有黑色條紋,這是背景圖片部分像素值和前景(及手勢圖像像素)接近,而被減掉了。另外,經(jīng)背景減法處理后的圖像,邊緣部分會出現(xiàn)鋸齒,于是要繼續(xù)進行形態(tài)學濾波、空洞填充和中值濾波處理的到最終的分割結果。
背景圖像減法需要和圖像膚色提取一起使用,相輔相成才能得到比較好的處理結果。
4.2 圖像的膚色提取
圖像處理中區(qū)別人體與外界的一個很大的特征就是膚色,通過這一特征可以將圖像分割成眾多分立的小塊。經(jīng)過這一個操作后圖像面積大大減少,提高了處理效率的同時又減少了大量外界環(huán)境的干擾,是圖像處理中的很重要的一環(huán)。
人體的皮膚膚色受很多種因素的干擾,這手部圖像的提取帶來了很多的困難。例如不同人種的膚色就有不同差異,不同的人也有細微的差異,就算是同一人不同身體不同部位膚色也有些差異。膚色同樣受到外界環(huán)境的影響,這其中最主要的就是光照。經(jīng)過分析發(fā)現(xiàn),光照因素分為光照強度,是否直射和光照顏色這幾個部分,其中后兩者是可以人為控制的(手的正面比較光滑,在光直接照射時出現(xiàn)反射,導致攝像頭捕獲的數(shù)據(jù)是純白色,而大多數(shù)干擾也是白色),而光照強度擇優(yōu)光照距離的遠近,是否遮擋以及周圍環(huán)境反射情況決定。如果在室內(nèi),按目前的光照環(huán)境(光照環(huán)境分為自然光環(huán)境和人工光環(huán)境,目前照明主要采用日光燈,可以忽略光照顏色的影響,照明比較充分時,距離也可以忽略),可以只考慮遮擋帶來的膚色變化,而遮擋實質(zhì)也就是亮度的變化,如果有某個顏色狀態(tài)不受亮度影響或與亮度是簡單的線性關系(也就是零階對應關系或一階對應關系,高于一階則對干擾過于敏感,規(guī)律性不強)。
2.1 顏色空間的選擇
膚色提取常用的顏色空間除RGB外還有YUV、HSV等,在光照變化時,膚色在RGB顏色空間中的值都有較大的改變,有一定的線性度,但很容易受干擾(膚色產(chǎn)生較小的變化時,其值變化過于劇烈),不能直接用來做膚色提取,如果在YUV空間中,則Y值劇烈變化,線性度較差,而U、V則出現(xiàn)非線性變化,也不便于作為膚色提取的顏色空間,而通過對HSV空間中的分析也不太理想,主要是在這些之中S、V雖然波動相對較小,但規(guī)律性不強,H幾乎捕捉不到其規(guī)律性,且其轉(zhuǎn)化過程也過于繁瑣,相比之下RGB略為占優(yōu)。
圖2-4 RGB隨亮度的增加的變化示意圖
2.2 膚色的特征值
在觀察HSV顏色空間中的H值轉(zhuǎn)化時發(fā)現(xiàn)R、G、B相互之間差值的波動范圍較小,而且觀察R-G與G-B比H值更加有效,因為它們在亮度改變時只有微小的波動,例如在對某一個人進行測試時R-G僅在15-35之間波動,G-B則在18-33波動,且波動并不是由光照直接導致,其證據(jù)就是在光照比較強烈的情況下和光照很弱的情況下,其波動的范圍并沒有因此而改變,監(jiān)獄對這個特性的研究,我們提出了一種不同于以往的膚色提取的方法,下面的公式就是將膚色提取并轉(zhuǎn)化為灰度圖像的一個經(jīng)驗方程。
上式中:C表示表征膚色的量(膚色標量),數(shù)值越小越接近膚色;R、G、B為RGB顏色空間的三種顏色的值;i,j表示橫向和縱向的坐標值。下面的修正公式各參數(shù)的含義與此處一樣。
2.3 干擾抑制
由于膚色亮度范圍也并不是越大越好,在過亮和過暗的情況下會引入很多不必要的干擾,需要依據(jù)亮度的范圍對這些干擾進行抑制。為了簡化計算,在已有的基礎上可以僅用G來代表亮度(C較大時修正值的比重很小,可以忽略,C較小時R,G,B相互間的差在一個很小的范圍內(nèi),G與亮度的線形相關度較好,且兩個差值都與G有關),膚色的亮度范圍大致在10-170,抑制項選用|90-G|時效果最好,經(jīng)過多次實驗,最終將這一系數(shù)確定在了2,這樣的補償可以使閾值在一個范圍內(nèi)調(diào)整,對過亮和過暗的顏色進行抑制作用,最終得到的膚色經(jīng)驗公式為:
圖2-5動態(tài)閾值示意圖
2.4 表征膚色的二值化圖像
由于公式中涉及到了二次項,而修正項為一次項,這使得灰度值與G-B,G-B在三維空間中表現(xiàn)為一個類似拋物面的曲面,這樣,膚色轉(zhuǎn)變到非膚色時,C的值變化將會很迅速(閾值為1000時,R-G或G-B變化1,閾值將變化45-65),如果要將灰度圖像轉(zhuǎn)化為二值化圖像,閾值的范圍將比較自由,經(jīng)過分析發(fā)現(xiàn),不考慮修正項時,閾值取在200-900間的值時,圖像的改變并不大。從抑制干擾的角度出發(fā),以及對后面的面積處理算法的綜合考慮,我們將閾值定在1000。
我們在后期的處理中主要用二值化后的圖像進行形態(tài)學的處理,而灰度圖像則由于其數(shù)據(jù)信息量較大,用于后期的特征提取的修正。
二值化圖像的取得方法是閾值的處理,其中閾值有表征膚色的RGB值求出,當算得量在閾值內(nèi)時,取為1(顏色值為255),當算得量超過閾值時,取為0(顏色值為0)。
4.3 區(qū)域分割處理
膚色提取的確將圖像處理成了一塊塊的分立區(qū)域,但系統(tǒng)并不知道這些區(qū)域的位置、大小等信息,在進行后續(xù)的處理前必須將這些區(qū)域分割出來。
4.3.1 垂直投影與分割
圖像經(jīng)過膚色提取之后形成一個個分立的膚色區(qū)域,當然也存在一些干擾,接下來的工作就是將這些區(qū)域進行分割,保證最終進行識別時每個單元都只有一塊簡單膚色區(qū)域,而且要求算法具有優(yōu)良的抗干擾性。
圖像中,能夠通過膚色提取篩選的主要是人的面部,手以及手臂。從人體結構與一些平時的動作考慮,如果在水平方向上投影,則會經(jīng)常出現(xiàn)手與手的重疊或手與臉的重疊(這里不分割手與手臂的區(qū)域),而在垂直方向則相對不太容易形成重疊?;趯Υ说乃伎迹覀冎贿M行了垂直方向的投影,用來分割垂直的區(qū)間。
垂直投影只需在膚色處理時同步將所有值向下累加即可:
上式中:T表示投影值;C表示膚色標量;i,j分別表示橫向和縱向坐標。
分析這些投影曲線,將其中投影值較大且連續(xù)分布的區(qū)域分割出來,在圖像上,就將圖像分割成了垂直的長條狀的區(qū)間,而這些長條區(qū)間還是有可能是由多個重疊的投影疊加而成,所以必須進行進一步處理。
4.3.2 水平積分與分割
垂直投影并沒有將各個區(qū)域分割開,但卻為水平投影提供了可行性。如果對每個區(qū)間都再進行一次投影,工作量比較大,其實有很多簡單的修改方式:在作垂直投影時,順帶做一次水平從左到右積分,那么垂直的長條圖像右側(cè)積分值減去左側(cè)的積分值就可以得到投影值,減少循環(huán)次數(shù)。在獲取水平投影后,在重復剛才的分割就可以粗略的找到膚色區(qū)域存在的區(qū)間。
4.3.3 分割后的整理
在實現(xiàn)后上述分割后發(fā)現(xiàn),即使區(qū)間劃分的閾值取得再適當也會出現(xiàn)將一個大的連續(xù)的區(qū)域被分割成多個小區(qū)域的情況,如果直接將相距比較近的區(qū)域進行合成,則由會出現(xiàn)有些較近的區(qū)域無法分割開的情況,而且小面積的干擾也有可能被和并成一個大區(qū)間,引入不必要的麻煩,針對這種情況,我們將與大區(qū)間相鄰的小區(qū)間合并,而一定范圍內(nèi)無區(qū)間或只有小區(qū)間則將其舍棄,這樣,大區(qū)間分離的一些小區(qū)間可以被合并,而聚在一起的干擾則由于沒有一個大區(qū)間作為核心而被舍棄,在解決了區(qū)域分裂的情況的同時又實現(xiàn)了一些抗干擾的功能。
4.3.4 面積篩選算法的采用
在二值化圖像經(jīng)過水平和垂直方向上的積分篩選之后,總會有些膚色接近的區(qū)域遺留,但是,這些區(qū)域大小不是很大,于是,我們這里采用了面積篩選的算法。
在圖像對水平和垂直方向進行投影的同時,計算水平和投影方向閾值連續(xù)部分的長度,得到矩形區(qū)域的面積。
在這些面積中,將矩形面積過小的區(qū)域予以刪除,得到如下的效果。
圖3-1應用面積刪選算法處理圖片
分析結果可以看到,因為手部矩形區(qū)域面積比較大,所以,手部矩形區(qū)域之外的接近膚色干擾小區(qū)塊被去除掉了。當然,矩形面積算法也有瑕疵的地方,手指上端的圖像被切掉了一小部分,而且手部矩形區(qū)域依然有干擾點的存在。
但是,綜合整體效果,可以看出,手部的形態(tài)特征得到了保存,因此矩形區(qū)域面積篩選算法可行。在后面的圖像矩特征的提取已經(jīng)夠用。
4.4 圖像矩特征提取及分配
即使知道了手勢存在的區(qū)域,面積狀況,可如此巨量的數(shù)據(jù)對于識別來說還是過于龐大了,面對這一問題,最常見的方法就是只提取輪廓,因為圖像本身是一塊封閉的區(qū)域,那么輪廓和區(qū)域圖像可以相互轉(zhuǎn)換,也就是說:在這種情況下,輪廓和區(qū)域圖像擁有同樣的信息量。而輪廓數(shù)據(jù)少的多,而且具有很多一維的特性,可以很方便地轉(zhuǎn)成一維數(shù)據(jù)來進行分析,這比直接分析區(qū)域的二維特征更加簡單和直觀。
在提取輪廓特征后進行幾何矩的計算,則形態(tài)學特征轉(zhuǎn)換成一維數(shù)據(jù)。
4.4.1 圖形矩定義簡單說明
將一幅圖像看成一個二維密度分布f(x,y),函數(shù)值f(x,y)表示點(x,y)處圖像像素的亮度值。
圖像f(x,y)的(p+q)階幾何矩的定義為:
其中f(x,y)是圖形函數(shù)
是圖像亮度函數(shù)f(x,y)定義的像素空間區(qū)域
是變換核
稱為p+q級幾何矩。
4.4.2 使用幾何矩進行圖像的形狀描述
圖像不同階的幾何矩表示了圖像亮度分布的不同空間特征。因而一個幾何矩集可以成為一幅圖像整體形狀的描述子。下面說明其中一些幾何矩的物理意義。
零階幾何矩代表一副圖像的總高度。對于剪影圖像,
是目標區(qū)域的集合面積。
一階幾何矩,
是圖像關于x軸和y軸的亮度矩。其亮度的“矩心”
為
對于一副剪影圖像,點給出了圖像區(qū)域的幾何中心。通常,能方便計算出將參照系原點移至圖像亮度矩心的幾何矩,稱為中心矩。這一變化使矩的計算獨立于圖像的參照系。
中心矩:一幅圖像相對于亮度矩心所計算出來的幾何矩成為中心矩。它表示為:
這一矩相當于將坐標原點移至和
處,并計算得到了對于圖像位移不變的中心矩
。
4.4.3 幾何矩不變量
圖像平面變換中具有不變形的幾何矩函數(shù)被應用與目標鑒別和模式識別等領域中,圖像的形狀特征通過一系列的計算能得到一組幾何矩特征不變量的集合,能夠用來識別可以的不同大小和不同方向上的具有相同特征的某一類圖像。
根據(jù)Hu氏理論,通過各種不同級別幾何矩的數(shù)學組合,可以得到七個特征量。這七個特征量具有當圖像f(x,y)移動、轉(zhuǎn)動與比例大小改變時保持其數(shù)值不變的特性。因此稱它們?yōu)椴蛔兙靥卣髁俊_@七個分量分別是:
其中:是歸一化的中心矩:
不變矩特征量的平移、移動與比例大小改變而其數(shù)值不變的性質(zhì)以及其它這里就不證明了。
正是由于幾何矩具有這樣的不隨位置、方向、大小的變化而變化的良好性質(zhì),所以才將這一方法引用到手勢識別(手勢圖像的位置、方向、大小極易發(fā)生變化)這一系統(tǒng)中來。
4.4.4 本系統(tǒng)的特征空間
考慮到實現(xiàn)的效果和計算復雜度,決定使用前四個不變矩特征量,并利用這四個矩的集合組合形成特征向量,由于這每一分量都具有旋轉(zhuǎn)、平移、比例等不變性,故由其組合而成的矢量也具有相應的不變性。這樣可以初步形成特征空間,取七個特征向量的前四個組合成特征空間。
4.4.5 圖像矩特征的匹配
一副圖像或一組圖像集的特征向量或特征矩陣必須與先驗存儲的一類特征向量或特征矩陣進行比較和匹配,以便建立給定圖像和標準圖像之間的一致性關系,用于模式識別、目標鑒別和圖像分類中。
對于一種矩特征向量的前n個元素可組成一個有限特征向量。所以,我們用下式來表示第k個圖像所對應的一個特征向量:
我們的樣本圖像取了四個特征量組合成矩特征向量。
下面的工作即是計算矩特征匹配算法的選擇。
計算方法有:
加權歐幾里德距離法,相關系數(shù)法,對數(shù)距離法。
本系統(tǒng)主要用到加權歐幾里德距離法。
向量的加權歐幾里德距離法定義如下:
這里表示對分量
的加權系數(shù),這樣做可以在動態(tài)范圍內(nèi)平衡各變量。使得函數(shù)D取最小值的k所對應的圖像被選作匹配圖像。
4.5 實現(xiàn)結果及分析
系統(tǒng)在Windows XP 的VC6.0環(huán)境下工作,再移植到Virtux-5開發(fā)板上。故這里只做VC6.0處理的說明。
圖5-1 系統(tǒng)流程圖說明
4.5.1 手勢圖像幾何矩的提取
下面列出幾何矩計算的部分源碼:
finger_charactor DIBBARYCENTERMOMENT(unsigned char *imgBufIn,int imgWidth,int imgHeight)
{
int lineByte=(imgWidth+3)/4*4;
int PixelValue;// 圖象象素值
float nBarycentrMoment;//圖像重心矩
float m00,m10,m01;//0次矩m00,x方向的一次矩m10,和y方向的一次矩m10
int BarycenterX,BarycenterY;//重心x y坐標
int i,j;
float temp;
finger_charactor temp_charactor;
m00=0;m01=0;m10=0;nBarycentrMoment=0;
int m02,m20,m11,m03,m30,m21,m12;
float u20,u11,u21,u30,u02,u12,u03;
float t1,t2,t3,t4,t5,t6,t7,t8,t9;
m02=0;m20=0;m11=0;
m03=0;m12=0;m21=0;
m30=0;u20=0;u11=0;
u21=0;u30=0;u02=0;
u12=0;u03=0;t1=0;
t2=0;t3=0;t4=0;
t5=0;t6=0;t7=0;
t8=0;t9=0;
//求0次矩m,x方向的一次矩m01和y方向的一次矩m10
for(j=0;jimgHeight;j++)
{
for(i=0;iimgWidth;i++)
{
PixelValue=*(imgBufIn+i*lineByte+j)/255;
m00=m00+PixelValue;
temp=i*PixelValue;//有問題的地方
m01=m01+temp;
temp=j*PixelValue;
m10=m10+temp;
}
}
BarycenterX=(int)(m01/m00+0.5);
BarycenterY=(int)(m10/m00+0.5);
printf(%d,%dn,BarycenterX,BarycenterY);
*(imgBufIn+BarycenterX*lineByte+BarycenterY)=0;
*(imgBufIn+(BarycenterX+1)*lineByte+BarycenterY)=0;
*(imgBufIn+BarycenterX*lineByte+BarycenterY+1)=0;
*(imgBufIn+(BarycenterX+1)*lineByte+BarycenterY+1)=0;
int ii,jj;
ii=0;jj=0;
for(j=0;jimgHeight;j++)
{
for(i=0;iimgWidth;i++)
{
PixelValue=*(imgBufIn+i*lineByte+j)/255;
m00=m00+PixelValue;
temp=i*PixelValue;//有問題的地方
m01=m01+temp;
temp=j*PixelValue;
m10=m10+temp;
m02=m02+(i-BarycenterX)*(i-BarycenterX)*PixelValue;
m20=m20+(j-BarycenterY)*(j-BarycenterY)*PixelValue;
m11=m11+(i-BarycenterX)*(j-BarycenterY)*PixelValue;
m30=m30+(j-BarycenterY)*(j-BarycenterY)*(j-BarycenterY)*PixelValue;
m03=m03+(i-BarycenterX)*(i-BarycenterX)*(i-BarycenterX)*PixelValue;
m21=m21+(j-BarycenterY)*(j-BarycenterY)*(i-BarycenterX)*PixelValue;
m12=m12+(i-BarycenterX)*(i-BarycenterX)*(j-BarycenterY)*PixelValue;
}
}
u20=m20/(m00*m00);u02=m02/(m00*m00);
u11=m11/(m00*m00);u21=m21/(pow(m00,2.5));
u12=m12/(pow(m00,2.5));u30=m30/(pow(m00,2.5));u03=m03/(pow(m00,2.5));
t1=m02/(m00*m00)+m20/(m00*m00);
t2=((m20-m02)/(m00*m00))*((m20-m02)/(m00*m00))+4*(m11/(m00*m00))*(m11/(m00*m00));
t3=m20*m02/(m00*m00*m00*m00)-(m11/(m00*m00))*(m11/(m00*m00));
t4=u02+u20;
t5=(u20-u02)*(u20-u02)+4*pow(u11,2);
t6=(u30-3*u12)*(u30-3*u12)+pow((3*u21-u03),2);
t7=(u30+u12)*(u30+u12)+(u03+u21)*(u03+u21);
printf(圖像的幾何矩為(%f,%f,%f,%f),t4,t5,t6,t7);
temp_charactor.t1=t4;
temp_charactor.t2=t5;
temp_charactor.t3=t6;
temp_charactor.t4=t7;
return temp_charactor;
}
4.5.2 手勢圖像的匹配
在特征匹配過程中,我們選擇的是改進的歐式距離。
利用歐幾里德距離,我們可以這樣定義輸入的手勢圖像與手勢庫中的任一手勢圖像之間的距離:。
分別計算庫中各手勢圖像與輸入圖像的距離最小的那副圖像即為與輸入手勢匹配的手勢。
其源碼如下:
void match(finger_charactor temp)
{
int i;
/* temp.t1=temp.t1*100;
temp.t2=temp.t2*100000;
temp.t3=temp.t3*1000000;
temp.t4=temp.t4*100000;*/
float distance[NUMBER];
float lib[NUMBER][4]={
{0.978988,0.033434,0.041461,0.463083},//1
{0.738859,0.200313,0.008426,0.096310},//2
{0.695933,0.140033,0.004225,0.120884},//3
{0.585566,0.082715,0.014987,0.063054},//4
{0.650015,0.069188,0.013489,0.019868},//5
{0.812733,0.103417,0.054060,0.005729},//a
{1.042509,0.290926,0.031394,0.214864},//b
{0.932284,0.033224,0.030549,0.236714},//c
{0.571468,0.042114,0.011919,0.011260},//d
{1.186403,0.272240,0.330265,0.576809},//e
{0.060099,0.001802,0.000009,0.000001},//f
{0.045080,0.000206,0.000004,0.000001},//g
{0.057199,0.000116,0.000021,0.000025},//h
{0.046879,0.000133,0.000014,0.000003},//i
{0.050615,0.000029,0.000029,0.000005},//j
{0.054486,0.000735,0.000006,0.000001},//k
{0.059298,0.001286,0.000066,0.000056},//l
{0.043326,0.000131,0.000004,0.000000},//m
{0.046381,0.000206,0.000023,0.000002},//n
{0.051253,0.000032,0.000061,0.000008},//o
{0.051904,0.000511,0.000055,0.000013},//p
{0.052215,0.000403,0.000011,0.000004},//q
{0.059072,0.001608,0.000030,0.000013},//r
{0.043743,0.000254,0.000011,0.000000},//s
{0.044977,0.000256,0.000012,0.000001},//t
{0.056229,0.001272,0.000030,0.000013},//u
{0.074957,0.001632,0.000190,0.000040},//v
{0.046419,0.000015,0.000032,0.000002},//w
{0.050211,0.000031,0.000018,0.000001},//x
{0.051339,0.000011,0.000041,0.000003},//y
{0.059218,0.000423,0.000142,0.000003}//z
};
char gesture[NUMBER][2]={1,2,3,4,5,a,b,c,d,e,
f,g,h,i,j,k,l,m,n,o,
p,q,r,s,t,u,v,w,x,y,z
};
for(i=0;iNUMBER;i++)
{
distance[i]=fabs(temp.t1-lib[i][0])+fabs(temp.t2-lib[i][1])+fabs(temp.t3-lib[i][2])+fabs(temp.t4-lib[i][3]);
}
printf(n);
printf(match distances are:);
printf(n);
for(i=0;iNUMBER;i++)
{
printf(%fn,distance[i]);
}
float best_distance=distance[0];
int best_flag=0;
for(i=1;iNUMBER;i++)
{
if(best_distance>distance[i])
{
best_distance=distance[i];
best_flag=i;
}
}
printf(The best distance is %f,best_distance);
printf(n);
printf(The gesture is %s,gesture[best_flag]);
printf(n);
}
4.5.3 手勢庫樣本的建立
樣本庫的建立,我們采用了國際手語中的26個英文字母作樣本,每個手勢取三個圖片,求得特征矩,從而建立樣本庫。其工作流程如下:
4.5.4 實際運行情況
這是將采集到的圖像進行分割處理之后得到的圖像:
c1.bmp(意思為C) b2(意思為b)
在PC終端運行情況如下。
經(jīng)過各個手勢的測試之后,手勢的識別率只有60%,不是很高,主要是手勢庫建立還沒有完善,需要很多次的數(shù)據(jù)和測試,統(tǒng)計完成。
評論