得益于 Raspberry Pi 等低成本硬件平臺,現(xiàn)在比以往更容易在硬件上對圖像處理算法進行原型驗證。大多數(shù)圖像處理算法需要進行大量計算,在嵌入式平臺上以可接受的幀頻運行它們非常困難。盡管 Raspberry Pi 在運行簡單的圖像處理算法時游刃有余,但大圖像和復(fù)雜算法應(yīng)在 NVIDIAJetson 等功能強大的硬件上運行。
本文將以色度鍵控效果為例,介紹在嵌入式硬件上部署 MATLAB 圖像處理算法的簡單工作流。我們將使用 MATLAB Coder 通過算法生成C代碼,然后使用在硬件上運行的實用程序在 Raspberry Pi 板卡上進行算法原型驗證。最后,我們將算法移植至 NVIDIA Jetson Tx1 平臺以保證實時性能。
色度鍵控算法
色度鍵控廣泛用于電視天氣預(yù)報、電影制作和圖片編輯應(yīng)用程序,它是一種視頻處理技術(shù),首先針對單色背景(如綠色屏幕)拍攝前景對象,然后用不同場景(圖1)替換該背景。
圖1:應(yīng)用色度鍵控之前和之后的示例
色度鍵控算法將圖像中的每個像素與代表單背景色的基準(zhǔn)色進行對比。如果像素顏色與基準(zhǔn)色足夠接近,像素將由之前所選場景圖像的對應(yīng)像素替換。從數(shù)學(xué)上講,色度鍵控算法采用以下公式:
其中代表進行色度鍵控后位置?(j,k)?處的最終像素值,是與原始圖像對應(yīng)的像素值,是代表替換單一背景色的場景的像素值,m(j,k)∈[0,1]?是掩碼值。掩碼數(shù)值?m(j,k)?對于前景像素應(yīng)該為?1,對于背景像素應(yīng)該為?0。0?與?1?之間的掩碼值可提供從背景到前景的平滑過渡。
每個像素的掩碼值通常在 YcbCr 顏色空間而不是普通的 RGB 顏色空間中進行計算。YcbCr 圖像的 Y 分量代表亮度分量,用于確定圖像的明暗度。Cb 和 Cr 分量代表色度分量,用于衡量與基準(zhǔn)色的相似度。由于僅使用圖像的 Cb 和 Cr 分量衡量顏色相似度,該算法在應(yīng)對單一背景色明暗區(qū)域的亮度值差異時十分穩(wěn)健。
為衡量像素色與基準(zhǔn)色的相似性,我們在色度空間中使用歐氏距離平方:
最后,使用以下公式計算圖像中位置(j,k) 的掩碼值:
其中 t1 和 t2 ( t2 > t1)代表要確定的閾值。
MATLAB實現(xiàn)
以下是色度控鍵算法的 MATLAB 實現(xiàn):
在 MATLAB 中,圖像由類型 uint8 的 [N,M, 3] 數(shù)組表示。這表示,在執(zhí)行數(shù)學(xué)操作前,我們需要將圖像數(shù)據(jù)類型轉(zhuǎn)換為 “double”。為避免背景到前景的快速突變,我們對算出的掩模采用高斯過濾器進行濾波。
確定基準(zhǔn)色和閾值
色度鍵控算法需要基準(zhǔn)色和閾值。使用 MATLAB Raspberry Pi 支持包中的相機接口,我們拍攝了實際場景的圖像。隨后,我們可以憑借經(jīng)驗確定背景的適用基準(zhǔn)色和相應(yīng)的閾值。
img = snapshot(cam); 命令繪制 MATLAB 中 Raspberry Pi 相機拍攝的圖像。我們使用 MATLAB 繪制中的 Data Cursor 工具指定背景顏色(圖2)。
圖2:MATLAB 中用于確定背景色值的 Data Cursor 工具
要確定閾值,我們將循環(huán)運行算法并調(diào)整閾值:
當(dāng)運行代碼時,我們會獲得帶有所選背景的圖像(圖3)。
圖3:左:原始圖像;右:運行色度控鍵算法后獲得的圖像
將色度鍵控算法部署到 Raspberry Pi
在部署代碼前,我們需要編寫一段包含有色度鍵控算法的循環(huán)體,循環(huán)體中還包括從相機拍攝圖像,并在 Raspberry Pi 連接的顯示器上顯示:
matlab.raspi.webcam 和 matlab.raspi.SDLVideo Display 是在硬件上運行實用程序的 System objects,它們可簡化部署工作流程中相機的使用和 Raspberry Pi 顯示。要編譯并運行代碼,我們可執(zhí)行以下命令:
runOnHardware 功能會為 Raspberry Pi 硬件創(chuàng)建 MATLAB Coder 配置,為 chromaKeyApp.m 生成代碼并對其部署。為了以合理的幀頻運行算法,圖像大小可縮小到 640x480 或 320x240。
生成GPU代碼
算法在 Raspberry Pi 上運行,但是它不會實現(xiàn)我們需要的實時性能。為了加快算法的速度,我們要使用 GPU Coder 將其部署到 NVIDIA Jetson 平臺。我們需要生成 GPU 代碼以利用算法中的內(nèi)在并行性。首先,我們會編寫 main 函數(shù)進行封裝,以利用 OpenCV 訪問連接到 NVIDIA Jetson 的 USB 相機。此功能將視頻幀從相機送到我們的 chromaKey 算法,隨后在屏幕上顯示輸出內(nèi)容。
生成 GPU 代碼后,我們首先創(chuàng)建 GPU Coder 配置對象、設(shè)置 GPU 參數(shù)以指向 NVIDIA Jetson 硬件平臺,然后加入自定義的 main 函數(shù)。我們不會在 MATLAB 主機上編譯代碼,因為我們將專門為 NVIDIA Jetson 平臺生成代碼。我們將創(chuàng)建腳本來設(shè)置 GPU Coder 配置、輸入示例數(shù)據(jù),并為我們的應(yīng)用生成源代碼。
我們隨后在 MATLAB 中運行腳本為 chromaKey 算法生成 CUDA 代碼。
向 NVIDIA Jetson 部署綠屏算法
要向 NVIDIA Jetson 部署生成的代碼,我們需要使用以下 MATLAB 命令將全部所需文件打包到 codegen 目錄。
接下來,將生成的所有 codegen 文件夾從主機復(fù)制到 NVIDIA Jetson 控制板。在傳輸文件后,我們直接登錄到 NVIDIA Jetson 以構(gòu)建并運行應(yīng)用程序。
登錄到 NVIDIA Jetson 后,我們運行 NVIDIA 提供的 jetson_clocks.sh 腳本以將平臺性能最大化、切換到包含生成的源代碼(之前傳輸)的 codegen 目錄,然后執(zhí)行以下顯示的編譯命令。
在可執(zhí)行程序(chromaKey)Build 后,使用 NVIDIA Jetson 控制臺上的 USB 網(wǎng)絡(luò)攝像頭通過以下命令運行應(yīng)用程序。每秒顯示幀數(shù)將顯示在輸出窗口中。
圖 4 顯示出現(xiàn)綠屏效果前后 NVIDIA Jetson 板卡的 USB 相機的輸出內(nèi)容。
圖4:應(yīng)用綠屏效果前后的示例
Raspberry Pi 和 NVIDIA Jetson 性能對比
NVIDIA Jetson 上 GPU 更加強大的并行處理能力極大地提高了算法的性能。Raspberry Pi 實現(xiàn)了約 1 幀/秒的幀頻,而 NVIDIA Jetson 對于 1280x720 大小的圖像實現(xiàn)了 20 幀/秒以上的幀頻。也就是說,無需對算法進行任何修改或優(yōu)化,我們便獲得了 20 倍以上的加速。通過優(yōu)化 MATLAB 算法提高 GPU 代碼的生成效率,我們可以實現(xiàn)更高的性能。
-
圖像處理
+關(guān)注
關(guān)注
27文章
1296瀏覽量
56822 -
攝像頭
+關(guān)注
關(guān)注
60文章
4854瀏覽量
95989 -
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
7586瀏覽量
89011
發(fā)布評論請先 登錄
相關(guān)推薦
評論