基于 FPGA 的膚色檢測(cè)設(shè)計(jì)與實(shí)現(xiàn)
引 言
在先進(jìn)信息技術(shù)的不斷迭代更新下,膚色檢測(cè)已成為與人相關(guān)的絕大多數(shù)機(jī)器視覺(jué) [1-2] 感官應(yīng)用的基石,例如手勢(shì)識(shí)別及控制、人的臉部檢測(cè)及定位和一些不合法規(guī)的圖片或視頻的過(guò)濾等。膚色檢測(cè)不僅可應(yīng)用于人體臉部及手部動(dòng)作的識(shí)別體系,且在安全保密系統(tǒng)及醫(yī)療 [3] 方面也尤為重要。隨著攝像頭的大眾化,掀起了對(duì)視頻圖像膚色分割 [4] 的研究熱潮。利用 FPGA 的邏輯粘合性、實(shí)時(shí)控制性和對(duì)高速信號(hào)的采集及處理 [5],結(jié)合 OV5640 作為視頻圖像采集設(shè)備采集視頻信息送至 FPGA 做膚色檢測(cè)處理,隨后通過(guò) VGA 顯示輸出結(jié)果。
1 膚色檢測(cè)設(shè)計(jì)
在雙色差或色調(diào)飽和度平面上,不同地域的人膚色變化不大,具備一致性和穩(wěn)定性,膚色存在差異的原因在于灰階值而非色度 [6]。因此將灰階值剝離出來(lái),只在 CbCr 平面檢測(cè)像素點(diǎn)。
1.1 Matlab統(tǒng)計(jì)閾值
Matlab 對(duì)膚色進(jìn)行建模,利用 imhist 函數(shù)分別對(duì)黑人和黃種人的部分膚色圖像Cb 和 Cr 值進(jìn)行直方圖統(tǒng)計(jì),找出其集中落點(diǎn)區(qū)域,并將此區(qū)域標(biāo)記為膚色區(qū)域。圖 1 所示為不同膚色原圖像,圖 2 為對(duì)應(yīng)膚色 Cb,Cr 值直方圖。
圖 1 不同膚色原圖
圖 2 對(duì)應(yīng)膚色 Cb,Cr 值直方圖
由圖 2、圖 3 可以看出不同人種膚色的 Cb 和 Cr 值都集中在 Cb=[100,126],Cr=[132,165] 區(qū)域,因此將落在此區(qū)域的像素點(diǎn)認(rèn)作人體的膚色。
1.2 膚色檢測(cè)原理
通常的色度彩色信號(hào)以 RGB 形式儲(chǔ)存,因此要先將彩色視頻信息從 RGB 信號(hào)轉(zhuǎn)換成 YCbCr 信號(hào),再對(duì)其進(jìn)行膚色分割、膚色建模 [7]。YCbCr 是一種分別從灰階值和色度兩方面對(duì)圖像信號(hào)進(jìn)行編碼的色彩空間,其中灰階值、明亮度用 Y 表示,色調(diào)與飽和度用 CbCr 表示 [8-10],其通過(guò)輸入RGB 彩色信號(hào)生成,將 RGB 信號(hào)的特定部分依據(jù)一定的關(guān)系進(jìn)行疊加 [11],公式如下 :
轉(zhuǎn)換過(guò)程中有浮點(diǎn)小數(shù)的存在,由于 FPGA 很難完成浮點(diǎn)運(yùn)算,因此將浮點(diǎn)小數(shù)轉(zhuǎn)換成定點(diǎn)小數(shù),利用 8 bit 來(lái)表示小數(shù)部分,將小數(shù)擴(kuò)大 28 倍,計(jì)算完成后,再右移 8 位即可, 操作如下 :
為了提高硬件運(yùn)行性能,降低組合邏輯的復(fù)雜程度,采用流水線處理,將一個(gè)復(fù)雜的運(yùn)算分布到 4 個(gè)時(shí)鐘周期完成轉(zhuǎn)換。
轉(zhuǎn)換完成后,根據(jù) Matlab 統(tǒng)計(jì)的結(jié)果,對(duì) Cb 和 Cr 分量設(shè)置閾值,人體的膚色從背景里分離出來(lái)。如果輸入信號(hào)Cb 和 Cr 分量在閾值之間,將輸出設(shè)置為全 1,即把膚色標(biāo)記為白色 ;反之則將輸出設(shè)置為全 0,即把非膚色標(biāo)記為黑色。閾值設(shè)置如下 :
100 ≤ Cb ≤ 126
132 ≤ Cr ≤ 165
2 設(shè)計(jì)仿真
2.1 Matlab仿真
隨機(jī)找了兩張不同膚色的圖片,用 Matlab 仿真膚色檢測(cè)方案,證明該方案的可行性,結(jié)果如圖 3 所示。可見(jiàn),即便膚色、背景大相徑庭,依然能夠?qū)⑷梭w的膚色成功剝離出來(lái), 總體效果較好,說(shuō)明該方案可行。
2.2 QuartusⅡ仿真
繼 Matlab 仿真之后,將其轉(zhuǎn)換成 Verilog 語(yǔ)言在 QuartusⅡ平臺(tái)上進(jìn)一步驗(yàn)證。
膚色檢測(cè)的 RTL 圖如圖 4 所示。rgb_to_ycbcr 模塊完成了 RGB565 到 YCbCr 的轉(zhuǎn)換并且將膚色區(qū)域用白色標(biāo)記出來(lái)。攝像頭通過(guò) cmos_write_req_gen 模塊寫入請(qǐng)求并生成讀寫地址索引 ;lut_ov5640_rgb565_1024_768 模塊進(jìn)行配置查找表 ;video_timing_data 模塊進(jìn)行生成幀讀取數(shù)據(jù)請(qǐng)求 ;frame_read_write 模塊進(jìn)行視頻幀數(shù)據(jù)讀寫控制 ;coms_8_16bit 模塊將 OV5640 輸出的 8 bit 數(shù)據(jù)拼接成 16 bit RGB565 數(shù)據(jù),完成一個(gè)圖像的傳輸 ;各模塊所需時(shí)鐘信號(hào)均通過(guò) PLL 模塊倍頻或分頻得到。
3 硬件驗(yàn)證
系統(tǒng)選用 Altera 公司的CycloneIV 系列EP4CE10F17FC8 芯片,500 萬(wàn)像素的 OV5640 攝像頭組塊顯示 1 024×768 分辨率的視頻畫面,通過(guò) DVP 接口與 FPGA 連接,先將視頻數(shù)據(jù)暫存到外部存儲(chǔ)器,再?gòu)耐獠看鎯?chǔ)器將信息讀取出來(lái), 送到 VGA 顯示模塊完成圖像的實(shí)時(shí)傳輸。其中 OV5640 通過(guò)硬件 FPGA 的 I2C 接口來(lái)完成寄存器的配置,將攝像頭的輸出分辨率和顯示器的分辨率設(shè)置一致,并在 0x4300 寄存器里將 OV5640 配置成 RGB565 輸出格式。外部存儲(chǔ)器選用同步動(dòng)態(tài)隨機(jī)存儲(chǔ)器,其存取數(shù)據(jù)的速度比 FLASH 高,內(nèi)部結(jié)構(gòu)采用同步接口和完全流水線 [12-13],數(shù)據(jù)的傳輸速率較高,設(shè)計(jì)的運(yùn)行速率大幅提高。
由于光線分布不均及攝像頭像素等因素,導(dǎo)致圖像出現(xiàn)像素點(diǎn)化且伴有光斑,離攝像頭越近,膚色剝離效果越好, 圖 5 為膚色檢測(cè)驗(yàn)證結(jié)果。
圖 5 膚色檢測(cè)驗(yàn)證結(jié)果
4 結(jié) 語(yǔ)
使用 Matlab 對(duì)不同膚色仿真得到膚色在色調(diào)和飽和度上的閾值,利用 FPGA 的并行性,在使用少量資源的前提下實(shí)現(xiàn)膚色檢測(cè),將人體膚色從復(fù)雜背景中抽離出來(lái),其結(jié)構(gòu)相對(duì)來(lái)說(shuō)比較簡(jiǎn)單且實(shí)時(shí)控制性強(qiáng),實(shí)驗(yàn)效果較好,同時(shí)還能將其封裝成專用 IP 核 [14],便于其他系統(tǒng)使用,為后續(xù)建立與人體膚色相關(guān)的體系或過(guò)濾不雅觀圖片、視頻提供基礎(chǔ)。