為游泳選手打造智慧教練
問題
Sarah是市游泳隊的隊員。她利用暑假時間在國家游泳集訓中心給教練幫忙。日前,世界大多數國家都使用錄影的方式來分析游泳選手的訓練情況。諸如澳洲等已開發國家已經啟用了先進的智慧教練系統,自動根據攝影機和穿戴式裝置等即時得出訓練數據和回饋。而中國目前還做不到這一點,需要人工來標記影片。一些關鍵的節點和動作環節還需要一幀幀的慢進比對,是一項耗時耗力的工作。在這上面花了兩三週之後,Sarah感覺確實是一個挑戰。
那麼是否有更好的解決方案呢?
工具
C++語言
C++是一種通用編譯型高階電腦語言,同時提供流程和物件導向的程式設計特性。 C++保留了前身C語言的絕大部分功能,因而提供了與底層硬體直接互動的手段。同時,其也是一門高效的現代程式語言,在桌面程式、伺服器應用、高效能應用和大型遊戲等方面均有用武之地。
OpenCV
OpenCV是一個原本由英特爾俄國研究中心開發的即時電腦圖形學函數庫。目前,OpenCV是最有影響力的跨平台開源影像處理工具,可實現導航、人機互動、手勢辨識、擴增實境、人臉辨識、運動追蹤等先進功能。
Microsoft Visual Studio
Visual Studio是微軟公司的整合開發環境(integrated development environment),用於Windows平台上的軟體開發。目前,Visual Studio主要支援C++,C#,Visual Basic等語言的開發、偵錯和部署。 Visual Studio為個人開發者提供免費的社群版本可供下載。
原理
RGB色彩空間與HSV色彩空間
我們都知道影片是一連串圖片的組合,而圖片是以矩形排列的一系列顏色點的組合,專業術語稱為像素(pixel)。對於計算機而言,所有的資訊都是以數值的形式儲存的,像素也不例外。當然,事實上有至少一打不同的儲存顏色的方案或模型,我們稱之為顏色空間(color space)。
對於一般人而言,最好理解的色彩空間是RGB,也就是紅(Red)綠(Green)藍(Blue)三原色的組合。我們所有電子設備的彩色顯示器也是基於這種原理工作的,透過三原色不同強度的搭配以組合出千變萬化的色彩。但對於電腦圖形學而言,一個更方便的顏色空間是HSV,即色相(Hue)飽和度(Saturation)明度(Value)。色相是色彩的基本屬性,直接對應整個色譜。飽和度是指顏色的純度,數值越大顏色越純,反之則變灰。明度是指色彩的明亮程度。下圖的圓柱直觀展示了HSV顏色空間。
透過一個不太複雜的算數公式,兩個色彩空間可以互相轉換。那我們為什麼在這裡要用到HSV呢?如果掌握一些線性代數知識的話會能很方便的解釋。事實上,RGB到HSV是一個線性空間的旋轉,把本來均勻分佈在三個通道中我們所感興趣的顏色特徵資訊一一抽取出來,以方便我們更好的操控和處理。如果從實踐出發來講,我們需要利用OpenCV提供的滑塊條(trackbar)來減少幹擾並最大化覆蓋識別區域。調整HSV是有很明確的順序的,先調H就能迅速的定下大範圍,然後再接著S和V。但如果是RGB的話,基本上調哪個可能都差不多,這就不太方便了。
侵蝕(erode)與膨脹(dilate)
erode函數必要的參數有三個,分別是輸入圖形、輸出圖形和核心(kernel,這是一個數學概念。通俗講可以理解成畫筆的筆刷大小形狀)。 erode的作用,就是當且僅當輸入圖形的像素周圍能完全覆蓋核心時,才保留該像素,否則則把像素從圖形中抹去。這樣事實上造成的效果就是,如果輸入圖形還沒核大,就會整個被抹掉。如果輸入圖形本身比較大,周圍則要切掉一圈。
dilate其實是erode的反操作,函數所接受的參數核erode相同。 dilate則是只要核心能沾上一點輸入圖形的邊,核心所涵蓋的範圍就都在輸出圖形裡。事實上造成的效果就是,輸入圖形要擴大一圈。
在我們自己的應用裡,使用了一次侵蝕和兩次膨脹。侵蝕是希望把微小的雜訊直接抹去,而膨脹則是希望把水線整體連接起來,減少後續操作的運算複雜度。這些操作在某種程度上也穩定了辨識點,讓它不會因為一些雜訊或抖動而滿畫面亂飛。當然,目前這個還是有很大的優化空間。
尋找輪廓(findContours)
findContours必要的參數有五個,分別是輸入圖形、儲存輪廓的二維數組、輪廓之間的包含/並列關係(hierarchy),專業術語稱為圖像拓撲結構(image topology)、工作模式和近似方法。
當然我們這邊其實用了一個最簡單的方法來尋找分界點——我們只是在過濾掉一部分目標區域以外的元素後,在紅水線所有的輪廓裡面找最左邊的值。這個同樣有非常大的最佳化空間,例如我們該怎麼利用拓樸結構資訊來分別同時辨識出上下兩根水線甚至是多根水線的分界點呢?
範例
上圖展示了專案原始碼實際執行的場景。最上面第一個黑白窗口辨識出了紅色的水線,第二個黑白窗口辨識出了黃色的水線。最下方顯示原始影片的視窗用準星標示了兩條色水線的分界點。
思考
- 目前來說,視訊分析的工作是在個人電腦上進行的。是否可以進一步把相關程式整合到平板乃至智慧型手機應用中,在游泳場館裡一步完成即時的錄影和分析?
- 為了提高影片辨識的精確度。在錄影時我們能進行哪些改進,例如特殊的水線,運動員泳帽的顏色,亦或是對手持錄影設備使用者的一些引導以確保錄製影片的品質?另一方面,目前辨識的演算法能否持續改進,排除可能的干擾元素、抖動和雜訊?
- 我們已經對影片中的元素進行了辨識分析,那麼怎樣較為精確的把影片中的座標體系換算成現實物理世界中的各項運動數據?僅透過影片我們能夠提取哪些數據?在輔以穿戴裝置的基礎上,我們還能取得哪些數據?透過這些數據,我們能進行怎樣的分析?
- 假設我們已經針對每位運動員收集了完整的訓練檔案。透過運動員之間的比較,和某位運動員目前數據與歷史數據的比較,能得到哪些的結論?對訓練有何幫助?