基于MATLAB的战术手势识别功能的设计与实现
基于MATLAB的戰(zhàn)術手勢識別功能的設計與實現
摘 要
手勢識別技術是人們生活中常見的一類圖像處理技術,也是目前比較火熱的研究領域之一,手勢識別可以用于人們生活中各種場景,比如利用手勢進行電視信息交互,只需要通過手勢就能實現對電視機的控制;在很多的VR游戲中,利用手勢可以完成各種各樣的游戲動作。總之手勢識別技術在圖像處理高速發(fā)展的情況下,變得越來越成熟,識別率以及識別速度也逐步提高,相信在不久的將來,手勢識別技術一定會發(fā)揮更大的作用。
為便于官兵在訓練中加強對手語的記憶掌握,根據不同的戰(zhàn)術背景不同的手語需要,本文通過對手勢識別算法的研究,開發(fā)出了基于MATLAB的戰(zhàn)術手勢識別功能。針對手勢識別的實現,本文中首先研究了圖像的預處理技術,通過對采集的戰(zhàn)術手勢圖像的預處理,為后續(xù)的戰(zhàn)術手勢圖像處理打下基礎。接著研究手勢圖像的分割算法,本文中主要針對手勢圖像的連通域進行分析,從而將手勢圖像從背景中分割出來。而后將分割出的戰(zhàn)術手勢圖像進行特征提取,采用手勢圖像的Hu不變矩以及空間幾何特征作為圖像的特征。最后利用BP神經網絡訓練圖像特征,得到最終識別結果。算法高效且準確,同時開發(fā)了基于MATLAB的GUI界面,用戶交互良好,界面美觀,具有一定的實用價值。
關鍵詞:MATLAB;圖像處理;手勢識別;GUI
目 錄
摘 要 I
ABSTRACT III
目 錄 V
圖 目 錄 IX
表 目 錄 XI
第一章 緒 論 1
1.1 選題背景與研究意義 1
1.2 國內外研究現狀 2
1.3 本文研究內容 3
1.4 本文研究組織結構 4
第二章 相關概念和技術 5
2.1 MATLAB語言相關概念 5
2.2 圖像處理相關原理 6
2.2.1 圖像處理基本概念 6
2.2.2 圖像識別基本方法 7
2.3 圖像處理基本方法 8
2.3.1 圖像顏色空間轉換 8
2.3.2 圖像二值化法 8
2.3.3 圖像的形態(tài)學操作 9
2.4 圖像分割基本方法 10
2.4.1 常用的圖像分割法 10
2.4.2 基于二值化圖像的連通域分析 11
2.5 手勢圖像識別相關原理 12
2.5.1 手勢識別基本概念 12
2.6 人工神經網絡基本原理 13
2.6.1 基于BP神經網絡的圖像識別 15
2.7 圖形用戶界面GUI相關原理 16
2.8 本章小結 16
第三章 基本框架與功能設計 17
3.1 需求分析 17
3.2 可行性分析 18
3.2.1 技術可行性 18
3.2.2 經濟可行性 18
3.2.3 操作可行性 18
3.3 戰(zhàn)術手勢識別功能基本框架與功能設計 19
3.3.1 戰(zhàn)術手勢識別框架設計 19
3.3.2 戰(zhàn)術手勢識別功能設計 22
3.4 GUI用戶使用界面基本框架與功能設計 22
3.4.1 GUI用戶使用界面框架設計 22
3.4.2 GUI用戶使用界面功能設計 24
3.5 本章小結 25
第四章 圖像處理和手勢識別的實現 27
4.1 戰(zhàn)術手語的編成和設計 27
4.2 手勢圖像預處理 30
4.2.1 手勢圖像顏色空間轉換 30
4.2.2 圖像二值化 31
4.2.3 形態(tài)學操作 32
4.2 圖像分割 32
4.2.1 基于連通域的手勢圖像分割 33
4.3 圖像特征提取 34
4.3.1 幾何不變矩-Hu矩 35
4.3.2 空間幾何特征 36
4.4 BP神經網絡訓練 36
4.5 本章小結 38
第五章 GUI用戶使用界面的實現 39
5.1 GUI設計相關參數和函數 39
5.2 創(chuàng)建GUI圖形用戶界面 43
5.2.1 GUI圖形用戶界面創(chuàng)建 44
5.3 設計和實現戰(zhàn)術手勢識別用戶使用界面 48
5.3.1 用戶識別界面的構建 48
5.4 本章小結 56
第六章 戰(zhàn)術手勢識別功能的測試與分析 59
6.1 系統的測試與分析 59
6.2 戰(zhàn)術手勢識別功能測試 59
6.2.1 戰(zhàn)術手勢識別功能測試(一) 59
6.2.2 戰(zhàn)術手勢識別功能測試(二) 67
6.3 測試結果分析 76
6.4 本章小結 76
第七章 總結與展望 79
7.1 總結 79
7.2 展望 79
致 謝 81
附 錄 83
附錄一 功能完整設計與實現代碼 83
附錄二 手勢圖像訓練代碼 88
附錄三 手勢圖像處理代碼 90
參考文獻 95
個人簡歷和在學期間的研究成果 97
圖 目 錄
圖2-1 連通域示意圖 11
圖2-2 生物神經元結構 13
圖2-3 神經元模型結構 14
圖2-4 單層的神經網絡圖 15
圖3-1 戰(zhàn)術手勢識別總體框架 19
圖3-2 戰(zhàn)術手勢識別簡化后框架 20
圖3-3 MATLAB神經網絡 21
圖3-4 MATLAB神經網絡(翻譯后) 21
圖3-4 MATLAB神經網絡框圖 22
圖3-5 GUI用戶使用界面框架 23
圖4-1 HSV處理后的手勢圖像 30
圖4-2 二值化后手勢圖像 31
圖4-3 形態(tài)學操作后的手勢圖像 32
圖4-4 連通域示意圖 33
圖4-5 手勢分割圖像 34
圖4-6 圖像的幾何特征 36
圖4-8 神經網絡訓練結果 37
圖5-1 新建GUIDE文件選擇界面 44
圖5-2 GUI主窗口 45
圖5-3 GUI基礎設計流程 45
圖5-4 GUI基礎設計屬性 46
圖5-5 GUI基礎設計代碼1 46
圖5-6 GUI基礎設計代碼2 47
圖5-7 處理結果圖 47
圖5-8 初步搭建用戶使用界面 49
圖5-9 初步搭建用戶使用界面展示 49
圖5-10 戰(zhàn)術手勢識別系統用戶使用界面 50
圖5-11 進入讀取視頻按鈕回調函數 51
圖5-12 打開圖片回調函數 51
圖5-13 選擇視頻文件對話框 52
圖5-14 讀取手勢視頻后結果 54
圖5-15 錄入視頻識別成功 54
圖6-1 第一組測試視頻 60
圖6-2 第二組測試結果 60
圖6-3 第三組測試結果 61
圖6-4 第四組測試結果 61
圖6-5 第五組測試結果(mp4) 62
圖6-6 第五組測試結果(avi) 62
圖6-7 第五組視頻屬性對比 63
圖6-8 第五組分割后圖像屬性對比 64
圖6-9 第六組測試結果 65
圖6-10 斷點運行后結果 66
圖6-11 第二次訓練結果 66
圖6-12 第六組修正后訓練結果 67
圖6-13 排列組合結果 67
圖6-14 100組測試視頻 68
圖6-15 100組測試音頻(截取部分) 68
圖6-16 有效測試數組(97組)測試時間分布圖 74
表 目 錄
表4-1 戰(zhàn)術手語表 27
表4-2 戰(zhàn)術手語編成表 29
表5-1 GUI函數屬性表 40
表6-1 第一組數組測試結果(1-20) 69
表6-2 第二組數組測試結果(21-40) 70
表6-3 第三組數組測試結果(41-60) 71
表6-4 第四組數組測試結果(61-80) 72
表6-5 第五組數組測試結果(81-100) 73
第一章 緒 論
1.1 選題背景與研究意義
武警部隊作為國家重要武裝力量,履行著國家賦予的神圣使命,在執(zhí)行解救人質、捕殲暴恐分子等任務時,確保良好的通信聯絡是分隊行動中通信保障的重點。低劣的通信質量在實戰(zhàn)中將導致分隊無法及時得到上級行動命令、失去對戰(zhàn)場情況的把控,指揮部無法及時了解作戰(zhàn)情況,造成整個行動指揮的失控,最終導致丟失戰(zhàn)場控制權,進而完全喪失戰(zhàn)斗力。
隨著現代技術的發(fā)展,各種無線、有線通信聯絡方式飛速發(fā)展,有效保障了分隊行動中的良好通信聯絡。但是,戰(zhàn)場環(huán)境的多變導致依靠無線電波等技術的通信聯絡具有較高的不確定性,其受地形、天氣等要素的影響較多,同時也易遭到敵方勢力的電子對抗打擊從而降低甚至破壞我方通信聯絡效能。故此,作為分隊行動中的戰(zhàn)術手勢通信不可或缺。
戰(zhàn)術手勢識別主要是以戰(zhàn)術手勢幾何特征檢驗為前提,是通過探究對應的手勢圖像幾何形狀輪廓,結合相關特性來判斷戰(zhàn)術手勢所蘊含的意義。就好比人在對另外一個戰(zhàn)術手勢進行識別的時候,往往需要訪問自己大腦里面的記憶庫,對相應的特征進行比對之后,如果與相關記憶庫識別比對成功,就能夠識別出戰(zhàn)術手勢的含義,如果該對象的特征無法被匹配,那么說明無法識別。
在民用領域中,識別人手部動作并給予相應反饋的手勢識別研究,應用前景及潛藏的經濟價值不可估量。如果能將該技術運用在軍事方面,可以有效的提升部隊現代化水平,提高部隊對于信息的反應和處理能力,進而進一步提升單兵作戰(zhàn)能力,減少物資和人員的消耗,全面提升戰(zhàn)斗力。對于武警部隊而言,分隊戰(zhàn)術手勢識別技術可以廣泛的被應用在反恐作戰(zhàn)、防衛(wèi)作戰(zhàn)、處突維穩(wěn)、日常執(zhí)勤、看押看守等各個方面,分隊戰(zhàn)術手勢識別的研究處于模式識別、圖像處理、機器學習和計算機語言等多學科領域交叉地帶,綜合性很強。戰(zhàn)術手勢研究典型的應用領域有:智能控制、運動分析、虛擬現實等。通過戰(zhàn)術手勢識別技術的發(fā)展,可以實現人機通過手勢變換進行交互,通過手勢直接無線控制PC等電子產品;在文體活動中,手勢識別也大放異彩,通過運動分析及手勢分析可以極大地提高運動與舞蹈訓練水平;手勢分析同樣可以幫助視頻會議達到更好的效果,降低人物動畫制作成本,或者幫助世界上不同區(qū)域的人利用互聯網組成一個線上工作團隊。
圍繞武警部隊在各類戰(zhàn)斗、任務中的戰(zhàn)術手勢的重要性,每一名戰(zhàn)斗在一線官兵都應該對戰(zhàn)斗中所使用的戰(zhàn)術手語非常熟悉,以真正達到傳遞信息、通信聯絡的作用。而常用的、熟悉的戰(zhàn)術手語已經不具備較好的保密性和安全性,所以每一場戰(zhàn)斗或者任務都應該將新編戰(zhàn)術手語作為一項重要的準備工作來完成。那么設計規(guī)定好戰(zhàn)術手語后,提高官兵的記憶效率,確保戰(zhàn)斗或者執(zhí)行任務過程中戰(zhàn)術手語的有效正確運用便至關重要。選題即圍繞戰(zhàn)術手勢的識別功能,以MATLAB為基礎展開研究和設計。為便于官兵在訓練中加強對手語的記憶掌握,根據不同的戰(zhàn)術背景不同的手語需要,針對特戰(zhàn)小隊在實際任務中可以運用到的手語聯絡方式進行設計研究,通過自擬暗語進行訓練測試,完成了基于MATLAB的戰(zhàn)術手語的識別功能的設計與實現。
1.2 國內外研究現狀
手勢識別的研究起步于20世紀末,由于計算機技術的發(fā)展,特別是近年來虛擬現實技術的發(fā)展,手勢識別的研究也到達一個新的高度。熵分析法是韓國的李金石、李振恩等人通過從背景復雜的視頻數據中分割出人的手勢形狀,然后計算手型的質心到輪廓邊界的距離從而識別手勢的方法,該方法具有較好的識別率,在對6個實驗樣本的測試中,結果顯示其正確識別率近乎百分百。印度人米娜克氏在基于視覺手勢識別的基礎上進一步研究,提出一種基于結構特征的手勢識別算法。該算法包括去除背景、方向檢測。手指檢測以及手指的數量進行檢測,最終確定手勢。于成龍等采用基于視覺的組合特征進行手勢識別,通過手掌的大小長度、質心、長寬比等人手的屬性值結合使用,使得識別率得到極大提升。
對于手勢識別的研究不僅僅限于大學或者是研究院等機構,眾多的大型公司機構也紛紛加入到手勢識別研究以及應用的行列。在多倫多2014年舉行的“計算機人機互動大會”上,微軟向世界展示了一款運動傳感鍵盤,該鍵盤實現了對用戶懸空手勢進行的識別。該款鍵盤被命名為Type-Hover-Swipe鍵盤,它集成了64個傳感器,每個傳感器位于鍵盤的格子中間。當用戶將手指懸停在鍵盤上方時,鍵盤會根據用戶手指的運動進行識別,這樣就可以實現用戶以一種舒服的姿勢進行手勢操作。而Xbox則是微軟比較成熟的商業(yè)化手勢甚至是身體的識別。作為芯片生產巨頭,Intel公司也積極參與到手勢識別的大軍中來。其中開源的圖像處理OpenCV類庫以及Realsense設備都是他們在此領域的研究成果。
國內高校及研究院對于手勢識別也有著許多成就,哈爾濱工業(yè)大學的吳江琴、高文等人通過ANN與HMM的混合方法的手語訓練識別方法,增加了識別方法的分類特征,同時使得模型的估計參數大幅減少,提高了效率。在實際運用中,使用ANN-HMM混合方法的中國手語識別系統中,孤立詞語的識別率為90%,簡單語句的識別率為92%。另外,天津大學的研究人員通過對操作者的體態(tài)動作圖像信息進行處理使其能夠控制機器人的運動、答復等狀態(tài)。清華大學的研究人員將識別率較高的手勢類型(例如數字手語)作為人機交互的信號,并將其應用于電腦游戲中,取得了成功。
1.3 本文研究內容
為提升提高官兵的記憶效率,確保戰(zhàn)斗或者執(zhí)行任務過程中戰(zhàn)術手語的有效正確運用,最終使武警作戰(zhàn)分隊在執(zhí)行任務過程中達到相互協同、信息交流及作戰(zhàn)分隊與指揮部的實時信息交互,確保各種條件下的精確穩(wěn)定的信息傳遞,提高指揮部對作戰(zhàn)的整體把握,保證任務圓滿完成,針對武警作戰(zhàn)分隊在實際執(zhí)行任務中的手勢口令進行交流,立足于高保密性,高反饋性以及高實用性,研究設計和實現了基于MATLAB的作戰(zhàn)手語戰(zhàn)術手勢識別功能,以實現手語向文字、語音結果的轉化。本文著重介紹了MATLAB圖像處理和手勢識別的相關原理,設計的研究和實現,GUI用戶使用界面的設計和實現,測試實驗結果和結果分析四個方面。
(1)深入研究了MATLAB圖像處理和手勢識別的相關原理,介紹了計算機圖像的基本概念以及MATLAB在圖像處理方面的基本原理,闡述了MATLAB圖像處理的幾種基本方法,為設計的研究和實現提供了理論基礎。
(2)設計實現了基于MATLAB的戰(zhàn)術手勢圖像的處理和識別,并對本文中測試的十個手勢圖像及其結合語句賦予意義,通過圖像處理基本方法對獲取的手勢圖像進行處理,而后對結果進行匹配識別并進行語音播放,基本實現了預期設計目的。
(3)針對用戶使用實際需求,利用MATLAB的GUI相關功能,設計實現了用戶使用界面,對整個設計進行整理組合,達到了精簡、便于使用的目的。
(4)進行了戰(zhàn)術手勢口令識別的相關測試。對圖像以及設計使用環(huán)境進行了詳細介紹,對設計整體進行測試,對設計的不足以及改進空間進行了深入分析。
1.4 本文研究組織結構
本文重點在MATLAB環(huán)境下研究和設計實現圖像的處理和手勢識別、并結合MATLAB本身具備的功能設計實現了用戶使用平臺。在研究過程中,著重實現用戶可以進行自編暗語并進行識別測試,并且便于操作使用的戰(zhàn)術手勢識別功能,對識別結果進行文字以及語音形式的轉化。
第一章,介紹了論文中運用到的主要技術的研究背景和本文研究設計的意義,通過閱讀大量文獻進行歸納總結,并對本文預期目的和將要進行的工作做簡要介紹。
第二章,主要研究了需要用到的相關概念和技術,MATLAB語言相關概念、圖像處理相關概念方法、手勢識別相關概念方法和GUI相關原理等知識。
第三章,首先從功能需求介紹了基于MATLAB的戰(zhàn)術手勢識別功能的設計目標,給出了戰(zhàn)術手勢識別功能的的基本框架設計,并對圖像處理和手勢識別基本流程,GUI用戶界面的構建目標進行了介紹。
第四章,在對系統的功能需求、框架、流程等進行研究后,在本章對作戰(zhàn)手勢進行簡易化并設計出以數字型手語為基準的戰(zhàn)術手勢,并對其圖像處理以及手勢識別的實現進行詳細介紹。
第五章,在對GUI用戶使用界面的預期效果進行研究后,在本章對GUI設計的方法、流程等基礎知識進行分析研究,并對最終完成GUI用戶使用界面的設計與實現進行介紹。
第六章戰(zhàn)術手勢識別功能的測試分析。對本文設計與實現的戰(zhàn)術手勢識別功能進行了測試,對測試結果進行分析,對設計的不足以及有待改進的地方進行進一步闡述。
第七章,總結論文在寫作和功能的設計實現方面完成的主要工作,針對論文的寫作和功能的設計實現方面出現的問題進行列舉,給出改進意見,并對設計進行展望。
在文章的最后將本論文中所用到、借鑒的參考文獻進行了羅列。
第二章 相關概念和技術
本章主要對實現基于MATLAB的戰(zhàn)術手勢識別功能所使用的編程平臺、基本原理、基本方法等進行介紹。此功能設計以MATLAB為平臺,應用了圖像處理、神經網絡手勢識別,同時為了滿足用戶的實際使用需要,以GUI為基礎搭建了用戶使用界面。為了使讀者更容易理解本設計的實現過程和原理,本章將會對上述提到的相關軟件和技術進行介紹。
2.1 MATLAB語言相關概念
2.2 圖像處理相關原理
通過對MATLAB語言基本概念的了解,下面將結合本文設計所使用圖像處理、手勢識別以及GUI用戶使用界面的相關概念進行介紹。
2.2.1 圖像處理基本概念
2.3 圖像處理基本方法
2.4 圖像分割基本方法
2.5 手勢圖像識別相關原理
通過對圖像處理的研究分析,在采取手勢圖像特征提取的基礎上,結合設計的需要以BP神經網絡作為手勢圖像識別的方法,本節(jié)即對手勢識別基本概念和基于BP神經網絡的圖像識別進行詳細介紹。
2.5.1 手勢識別基本概念
手勢識別(Gesture Recognition)指通過跟蹤人類手勢、識別并其轉換為語義上有意義的命令的過程。手勢圖像識別的總體目標是通過計算機對獲取的手的位置、姿勢或形態(tài)等信息進行處理識別,并得出語義的解釋或執(zhí)行相應的操作。手勢圖像識別技術性并不是很強,其難點和重點主要是對大量數據信息的訓練和處理。
手勢的完成是一個動態(tài)的過程,這個過程包括了手指彎曲引起的手的形狀和手在空間中的位置和方位的變化兩個方面,在實際識別過程中,根據手勢的時間特征,可以將手勢分為靜態(tài)手勢和動態(tài)手勢兩種。相對而言,對于靜態(tài)手勢的識別,可以將其視為靜態(tài)圖像,將時間特征設定為統一值,對手勢的空間特征進行研究,而動態(tài)手勢則需要將時間和空間兩個要素同時參考,以隨時間變化的空間特征為屬性對手勢進行描述。靜態(tài)手勢的研究,可以利用手的關節(jié)、指間等特征值進行表示,而動態(tài)手勢的研究則需要取一段時間內手的各種空間特征的測量序列值進行表示。同時,由于人手具有的自由度較多,運動較為復雜,導致相同的手勢動作在不同的人操作時會呈現不同的運動,從而導致特征值的差別。
為了檢測手的姿勢或形態(tài),可以使用通用分類器或模板匹配器進行識別。當對視頻進行手勢識別時,由于視頻中手勢含有軌跡,使其被賦予時間特征,那么就需要相應的技術諸如隱藏馬爾可夫模型(HMM)等進行該特征的處理,從而使得動態(tài)的手勢識別最終轉化為靜態(tài)的手勢識別。
目前,作為比較流行的手勢識別技術有模板匹配法、特征提取和BP神經網絡算法。模板匹配法:作為最接近人本身對事物的識別的方法,模型匹配法是將傳感器輸入的原始數據與預先存儲的模板進行匹配,通過測量兩者之間的相似度來完成識別,相應的,模型匹配法需要大量的基礎數據作為匹配對象來確保識別率,所以受到噪聲、光照等復雜環(huán)境影響較大,并且識別速度慢。但是,模板匹配法具有簡單、易掌握,普及程度高的優(yōu)點。特征提取:指通過對輸入數據的特征進行提取,并分析轉化形成具有實際含義的特征屬性,從而形成訓練數據庫,在對手勢圖像進行識別時,以訓練數據庫的特征為基礎進行識別。特征提取方法縮小了基礎數據的需求量,但依舊容易受到噪聲、光照等復雜環(huán)境的影響,識別速度較慢。BP神經網絡是一種前向傳播的多層網絡,BP神經網絡算法是一種按誤差逆?zhèn)鞑ニ惴ㄓ柧毜亩鄬忧梆伨W絡。它的學習規(guī)則是使用最速下降法,通過反向傳播來調整網絡的權值和閾值,使得網絡的誤差平方和最小。
本文中結合運用了特征提取法和BP神經網絡算法進行戰(zhàn)術手勢圖像的識別,基本實現了較高的識別率同時識別速度較快。
2.6 人工神經網絡基本原理
針對人工神經網絡有一個經典的定義:“神經網絡是由具有適應性的簡單單元組成的廣泛并行互連網絡,它的組織能夠模擬生物神經系統對真實世界物體所做出的交互反應”
神經元模型是模擬生物神經元結構而被設計出來的。典型的神經元結構如下圖所示:
圖2-2 生物神經元結構
神經元大致可以分為樹突、突觸、細胞體和軸突。樹突為神經元的輸入通道,其功能是將其它神經元的動作電位傳遞至細胞體。其它神經元的動作電位借由位于樹突分支上的多個突觸傳遞至樹突上。神經細胞可以視為有兩種狀態(tài)的機器,激活時為“是”,不激活時為“否”。神經細胞的狀態(tài)取決于從其他神經細胞接收到的信號量,以及突觸的性質(抑制或加強)。當信號量超過某個閾值時,細胞體就會被激活,產生電脈沖。電脈沖沿著軸突并通過突觸傳遞到其它神經元。
同理,我們的神經元模型就是為了模擬上述過程,典型的神經元模型如圖2-3所示。
圖2-3 神經元模型結構
這個模型中,每個神經元都接受來自其它神經元的輸入信號,每個信號都通過一個帶有權重的連接傳遞,神經元把這些信號加起來得到一個總輸入值,然后將總輸入值與神經元的閾值進行對比(模擬閾值電位),然后通過一個“激活函數”處理得到最終的輸出(模擬細胞的激活),這個輸出又會作為之后神經元的輸入一層一層傳遞下去。
為了更好的理解人工神經網絡是如何作用的,這里以最小二乘法線性回歸問題進行類比,在求解數據擬合直線的時候,我們是采用某種方法讓預測值和實際值的“偏差”盡可能小。同理,BP神經網絡也做了類似的事情,即通過讓“偏差”盡可能小,使得神經網絡模型盡可能好地擬合數據集。
2.6.1 基于BP神經網絡的圖像識別
BP網絡是一種前向型的神經網絡,參數前向傳遞,而誤差則是反向傳遞,神經網絡通常由三層組成,輸入層,隱含層和輸出層,其基本思想就是輸入層輸入需要訓練的圖像特征,經過隱層節(jié)點的訓練得到輸出層的結果,計算輸出層結果與預期期望值的差值,如果差值在誤差范圍內,則訓練結束,如果差值不在誤差范圍內,則反向傳遞誤差,繼續(xù)訓練,訓練過程中不斷地調整隱層節(jié)點的權值和閾值,直到輸出層的結果達到預想的期望值。單層的神經網絡圖如下:
圖2-4 單層的神經網絡圖
圖中的P是輸入列變量,b是相應偏移,a是網絡輸出,f是激活函數,W是網絡權值。當輸出結果a與期望值不相符的時候,誤差沿著隱藏層進行反向傳播,并將誤差按照權重進行分配,使得每一個隱藏層都承擔一定的誤差,通過調整參數,權值優(yōu)化,達到輸出誤差最小的目的。
神經網絡圖像識別技術是一種比較新型的圖像識別技術,是將神經網絡算法與傳統的圖像識別方法相融合,實現了更高效率的識別的圖像識別方法。神經網絡指人類通過對人體和動物的神經網絡進行研究后,模仿其神經網絡的構造和功能,人工生成的神經網絡。在神經網絡圖像識別技術中,最經典的神經網絡圖像識別模型是遺傳算法與BP神經網絡算法相融合,應用面非常廣。
BP網絡是一種前向型的神經網絡,參數前向傳遞,而誤差則是反向傳遞,神經網絡通常由三層組成,輸入層,隱含層和輸出層,其基本思想就是輸入層輸入需要訓練的圖像特征,經過隱層節(jié)點的訓練得到輸出層的結果,計算輸出層結果與預期期望值的差值,如果差值在誤差范圍內,則訓練結束,如果差值不在誤差范圍內,則反向傳遞誤差,繼續(xù)訓練,訓練過程中不斷地調整隱層節(jié)點的權值和閾值,直到輸出層的結果達到預想的期望值。
2.7 圖形用戶界面GUI相關原理
圖像處理平臺是為了實現將多個單獨的圖像處理算法集成在一個平臺中,方便用戶進行操作和使用,在MATLAB中通常使用GUI來實現圖像處理平臺的搭建。圖形用戶界面(graphical user interfaces,GUI)是MATLAB軟件中的一個重要模塊,具有窗口、圖標、菜單和文本說明等多個圖形對象,由菜單控件、按鈕控件、坐標軸控件、滾動條控件、面板控件等對象控件構成,是采用圖形方式顯示的用戶操作界面。GUI的設計可以實現圖像處理過程的交互和可視化,提高了圖像處理算法的綜合效率,具有開發(fā)周期短、操作方便、界面友好的特點,有利于更方便快捷地控制仿真程序。搭建MATLAB GUI進行圖像處理,可以充分發(fā)揮MATLAB在圖形可視化方面的優(yōu)勢,為用戶使用提供便利。
通過MATLAB GUI進行戰(zhàn)術手勢識別功能用戶使用界面的設計,提供了較好的功能展現形式,使得編程工作量降低,開發(fā)效率提高。在GUI中進行圖形用戶界面設計的基本步驟如下:
(1)確定設計需求,根據需求目標和任務需要,繪制和設計基本框圖;
(2)確定設計中需要的各個控件的布局并完成控件位置的設置;
(3)設置各個控件的屬性,尤其設置唯一標識值Tag屬性以實現對控件的控制;
(4)進入各個控件的回調函數,編寫實現回調函數相關功能的代碼;
(5)運行guide進行測試,并修改程序。
2.8 本章小結
本章首先介紹了MATLAB語言的相關概念,之后對MATLAB的圖像處理和手勢識別的基本概念和方法進行了闡述。并根據本文實際需要,針對基于神經網絡的手勢圖像識別進行進一步闡述。這些概念和基礎為實現基于MATLAB的戰(zhàn)術手勢識別功能的設計與實現提供了良好的基礎。
第三章 基本框架與功能設計
本章主要完成了對基于MATLAB的戰(zhàn)術手勢識別功能的需求分析以及基本框架的設計。通過對整個功能實現的流程的分析,結合MATLAB本身性能和優(yōu)勢,,對功能實現應該具備的性能展開需求分析,闡述關鍵技術、操難度作以及可行性,而后依據需求分析對對系統的細分功能模塊進行設計并搭建基本框架,為后期功能設計與實現打下基礎。
3.1 需求分析
基于MATLAB的戰(zhàn)術手勢識別功能的設計實現能很好的提高基層官兵在訓練中對手語學習的記憶和掌握。根據不同的戰(zhàn)術背景不同的手語需要,結合特戰(zhàn)小隊在實際任務中可以運用到的手語聯絡方式進行設計研究,從而建立的手語庫能夠更好的涵蓋實戰(zhàn)的各個方面,提高訓練的全面性。同時,為訓練成果的檢驗提供了一種更為智能化的方式。
根據基層現狀可知,官兵日常訓練任務較重,時間安排較滿,官兵日常需要背記的條令條例等固化知識較多,思維活躍受到了較大限制,使得官兵在對多變、復雜的手語進行訓練記憶時,往往沒有較好的效果。故此如何提高訓練的質量和效益成為一個關鍵性問題。而在記憶學中,圖像放映式記憶效果顯著,通過類似播放電影的方式對手語記憶進行訓練,能極大的提高訓練的效果,同時,其富有的生動性、形象性能夠激發(fā)官兵學習熱情,促使學習過程中精力更為集中,進一步的提高訓練的質量。
基于這些問題,建立一個戰(zhàn)術手勢識別功能平臺是相當有必要的。通過利用MATLAB的各種功能組合設計出一個具備手勢識別功能和具有用戶使用界面的一個平臺,應用于官兵在訓練中對手語的記憶,能很好的提高訓練的效果和質量,大大降低訓練的時間,從而減輕基層官兵的壓力。同時也為管理者對所屬人員訓練情況進行考核提高了平臺和條件。
3.3 戰(zhàn)術手勢識別功能基本框架與功能設計
基于MATLAB的戰(zhàn)術手勢識別功能需要具備圖像處理和手勢識別兩大模塊的功能,預期實現的功能包括手勢視頻的讀取分割、手勢圖像的處理識別以及GUI的用戶使用界面這三個部分。
3.3.1 戰(zhàn)術手勢識別框架設計
在對MATLAB的基本操作、原理進行深入學習后,立足于MATLAB高效便捷的特點,使用MATLAB神經網絡庫以及GUI用戶界面做支撐,研究設計了基于MATLAB的圖像處理和手勢識別功能,該設計總體可以分為手勢視頻分解、手勢圖像處理與識別、GUI用戶使用界面三個部分,其總體框架如圖3-1所示。
圖3-1 戰(zhàn)術手勢識別總體框架
在圖3-1中,將基于MATLAB的戰(zhàn)術手勢識別功能的實現的完整流程進行展示,通過框圖的設計,將整個設計劃分為手勢視頻分解、手勢圖像處理與識別、GUI用戶使用界面三個部分的內容,在本小節(jié)將針對手勢視頻分解、手勢圖像處理與識別進行詳細介紹。
(1)手勢視頻分解
戰(zhàn)術手勢的識別的設計與實現圍繞貼近實戰(zhàn)、便于直觀的輸入和輸出,在手勢圖像處理識別的基礎上,增加了手勢視頻分解的功能,用于將實際運用的連貫的手勢動作輸入后得到對應的事先規(guī)定好的文字結果,從而最終達到戰(zhàn)術手勢識別的基本功能。
(2)手勢圖像處理與識別
MATLAB的圖像處理與識別是戰(zhàn)術手勢識別的設計與實現的主要部分,根據設計目標和功能需求,研究了MATLAB灰度圖像處理、圖像的二值化處理、高斯濾波處理等等圖像處理方法,通過綜合分析和實際測試運用,最終確定以圖像分割和特征提取作為本文的基本圖像處理方法。
神經網絡識別方法是一種比較新型的圖像識別技術,是在傳統的圖像識別方法和基礎上融合神經網絡算法的一種圖像識別方法。當錄入圖像時,利用MATLAB的定位模塊提取手勢的信息,并對處理后手勢圖片進行訓練,測試時根據錄入圖片的手指的彎曲、伸直等等信息進行識別,并顯示最終的結果。
通過調用MATLAB的神經網絡,可以最大限度的簡化識別流程,從而初步達到預期效果如圖3-2所示。
圖3-2 戰(zhàn)術手勢識別簡化后框架
在圖3-2的戰(zhàn)術手勢識別簡化后框架中,將整個基于MATLAB的戰(zhàn)術手勢識別功能的手勢圖像處理識別過程劃分為四個部分,第一列為圖像的導入,也就是視頻圖像經過分割處理后的三個手勢圖像,將他們分別進行第二列中的處理和識別過程。第二列中,對于手勢圖像的處理識別過程進行了深層解析,將其劃分為圖像處理、特征提取、神經網絡三個部分,并且,三個部分有著嚴格的先后順序,一環(huán)扣一環(huán)最終實現手勢圖像的處理和識別過程。第三列是每單個手勢圖像分別經過處理識別之后產生的結果,在MATLAB的運算過程中,每個圖像的識別結果以一個對應的數字的形式存在,以便于進行下一步的運算,并且,在實際設計實現過程中,對單個圖像的數字結果進行了忽略,著重以三個數字為一組的語句作為結果呈現,并最終在GUI用戶使用界面上,以一個整體的文字、語音結果對用戶進行展示。
MATLAB中所調用的BP神經網絡庫的基本屬性和相關內容如圖3-3所示:
圖3-3 MATLAB神經網絡
下圖為通過軟件進行翻譯后的圖片:
圖3-4 MATLAB神經網絡(翻譯后)
通過對圖3-3、3-4可以知道,MATLAB神經網絡庫的相關內容和基本屬性,在MATLAB中,神經網絡是利用兩層前饋神經網絡來求解輸入和輸出的問題。它的基本原理是通過神經擬合來幫助選擇數據、創(chuàng)建和訓練網絡,并使用均方誤差和回歸分析來評估性能。
它的基本構圖如下:
圖3-4 MATLAB神經網絡框圖
3.3.2 戰(zhàn)術手勢識別功能設計
針對戰(zhàn)術手語的多變性、短時效性,根據不同地域、類型部隊的實際運用習慣,采用神經網絡算法實現的手勢識別,能夠實現自編手勢的便捷錄入和新結果的便捷輸出,達到簡便實用、高效的預期效果。
以上即為整個設計過程中手勢視頻分解、手勢圖像處理與識別的介紹,下面將對整個設計的第三個部分GUI用戶使用界面基本框架與功能的設計進行介紹。
3.4 GUI用戶使用界面基本框架與功能設計
GUI用戶界面的搭建能夠使設計更加貼近用戶的使用和操作,通過在GUI界面中設計各個功能控件,來達到對整個功能設計的整合和提升。
3.4.1 GUI用戶使用界面框架設計
GUI用戶使用界面包括視頻錄入并播放模塊、分解手勢圖像展示模塊、識別結果文字呈現模塊、識別結果音頻呈現模塊以及重置模塊。在兼顧GUI用戶使用界面的美觀和各個模塊的功能實現兩個方面的情況下,初步排版并設計了GUI的用戶使用界面如圖3-5所示。
圖3-5 GUI用戶使用界面框架
在GUI用戶使用界面框架設計中,Axes作為一個展示控件,在GUI界面中為軸,能夠根據設計的需要或者導入的文件不同展示對應的圖表、線性圖、圖像、視頻等,在使用方面較為簡便,能夠清楚得將對象呈現給用戶。經過對市面上各大軟件的界面進行分析研究,結合人們對用戶使用界面的喜好,采取如圖3-5所示的設計理念。以較大面積的Axes軸作為視頻文件的展示區(qū)(圖中為Axes1),使得整個視頻在播放的時候,更為清晰、引人注目,該效果能有效加強人的印象。再以較小面積的Axes軸作為視頻文件分割后產生的三個手勢圖像的展示區(qū)(圖中為Axes2、Axes3、Axes4),考慮到本文功能實現的目的為提高提升提高官兵的記憶效率,確保戰(zhàn)斗或者執(zhí)行任務過程中戰(zhàn)術手語的有效正確運用,故此將手勢視頻分割后形成的三個分圖像進行展示,以此來加強記憶,同時便于發(fā)現錯誤的環(huán)節(jié)從而進行針對性整改。
同樣的,根據人視覺美學的需要,結合人們對用戶使用界面的喜好,在GUI用戶使用界面框架設計中,將用戶進行點擊、操作的按鈕設計為圓形。但在實際設計過程中發(fā)現,GUI本身設定中的按鈕形狀為矩形,通過研究發(fā)現,將GUI按鈕形狀調整為圓形的過程具有一定難度,并且需要較大的工作量和繁瑣的邏輯考慮,所以,在考慮實用性以及實際情況后,在實際設計中,按鈕形狀按照GUI本身設定不予更改。
在結果呈現模塊上,根據實際情況,通過最基礎的文本框樣式進行文字結果的呈現,同時,在文字結果呈現后,其結果對應的音頻自動進行播放,通過這種方式實現手勢識別結果的視覺、聽覺沖擊,有效加強官兵使用過程中的記憶,同時,考慮到界面的整潔和操作的便利性,針對音頻的播放采取自動播放的模式。
3.4.2 GUI用戶使用界面功能設計
根據戰(zhàn)術手勢識別的功能需要,在建立美觀簡潔的GUI用戶界面的基礎上,實現戰(zhàn)術手勢視頻的錄入、自動分割功能,并對識別結果進行文字呈現和語音呈現。同時,設計重置按鈕,使得用戶在一輪使用后能夠將程序歸位。結合整體GUI用戶使用界面的功能設計,將其分為視頻錄入并播放模塊、分解手勢圖像展示模塊、識別結果文字呈現模塊、識別結果音頻呈現模塊以及重置模塊。
(1)視頻錄入并播放模塊
視頻和圖像的呈現模塊,主要功能為手勢視頻的錄入并進行播放,主要設計條件為GUI界面中控件的設置,通過對GUI中軸(Axes)的設計以及按鈕控件callback的回調函數編寫,從而實現整個手勢視頻的讀取、錄入、播放。
同時,在視頻錄入并播放模塊中,通過MATLAB的運行和計算,對錄入的手勢視頻進行處理,將每一段手勢視頻劃分為幀數,每隔一定幀數進行一次圖像保存,獲取完成后將所有圖像分為三段,再在每一段中取中位數,最終獲得手勢視頻分割后得到的手勢圖像并在分解手勢圖像展示模塊中進行呈現。
(2)分解手勢圖像展示模塊
基于MATLAB的戰(zhàn)術手勢識別功能的設計目的為提高提升提高官兵的記憶效率,確保戰(zhàn)斗或者執(zhí)行任務過程中戰(zhàn)術手語的有效正確運用。基于這個考慮,將手勢視頻分割后形成的三個分圖像進行展示,以此來加強記憶,同時便于發(fā)現錯誤的環(huán)節(jié)從而進行針對性整改。
分解手勢圖像展示模塊的主要設計條件與視頻錄入并播放模塊相同,通過對GUI中軸(Axes)的設計,對手勢視頻分割后產生的三個圖像自動進行獲取并按順序展示在對應的Axes軸中。不同的是,在分解手勢圖像展示模塊中需要完成對三個手勢圖像的處理和識別過程,在獲取相應的手勢圖像后,MATLAB按照既定的算法和方法,對獲取的三個手勢圖像進行處理和識別,通過圖像的處理和BP神經網絡的識別,得到基本的數組識別結果,再與編成的戰(zhàn)術手語庫進行匹配,最終得到整個手勢視頻的識別結果,并將結果于識別結果文字呈現模塊中呈現。
(3)識別結果文字呈現模塊
識別結果文字呈現模塊,主要功能為手勢視頻處理識別結果的文字結果呈現。在GUI設計界面中,將手勢視頻經處理識別后產生的數組結果與定義好的文字結果進行匹配,而后將對應的文字結果于設置好的文本展示位置進行呈現。該功能主要設計條件為數組的一一對應和匹配,通過對MATLAB代碼中,各個組合進行定義并賦予意義,最終實現手勢視頻識別結果的匹配。
(4)識別結果音頻呈現模塊
識別結果音頻呈現模塊,主要功能為通過識別結果文字呈現模塊得到手勢視頻對應的文字結果后,依據文字結果匹配對應的音頻文件并自動播放。
(5)重置模塊
重置模塊的主要功能為清空當前設計頁碼的所有數據,復原整個手勢識別用戶使用界面,用戶即可按照同樣的順序讀取新的視頻進行新一輪的處理和識別過程。
3.5 本章小結
本章首先描述了本文設計的基于MATLAB的戰(zhàn)術手勢識別功能需要達到的目標和實現的功能,詳細介紹了該設計的總體框架和總體功能,最后給出了該設計的功能模塊設計,并對所有功能模塊的設計流程進行了圖文闡述。
第四章 圖像處理和手勢識別的實現
手勢識別是基于圖像處理實現,本章節(jié)主要介紹相關的手勢圖像處理識別算法,主要包括圖像的預處理部分,圖像分割部分以及手勢識別部分。圖像預處理是算法的前置環(huán)節(jié),能夠為后續(xù)圖像算法提供高質量圖像,圖像分割是將對象從背景中分離出來,便于后續(xù)手勢圖像識別。對于手勢圖像識別采用BP神經網絡的方式,提取手勢圖像特征,利用HU-不變矩特性,輸入神經網絡進行訓練,達到識別的效果。
4.1 戰(zhàn)術手語的編成和設計
根據人手五指的分指和彎曲度特征,同時借鑒我們日常生活中慣用的手指語言表示方法,在現有數字手語1、2、3、4、5、6、7、8、9、0的基礎上,針對各個手勢的動作進行重新賦值,并根據實戰(zhàn)中常用的、必要的指揮類口令,賦予每個手勢特定的定義,從而得到一組自編戰(zhàn)術手語,具體見表4-1:
表4-1 戰(zhàn)術手語表
| 手勢圖片 | 對應數字結果 | 對應文字結果 |
| 1 | 前方 | |
| 2 | 發(fā)現 | |
| 3 | 散開 | |
| 4 | 搜索 | |
| 5 | 趴下 | |
| 6 | 兩側進攻 | |
| 7 | 弱火力點 | |
| 8 | 強火力點 | |
| 9 | 敵人已消滅 | |
| 10 | 集合 |
以武警部隊特戰(zhàn)中隊為例,在針對暴恐分子的捕殲戰(zhàn)斗中,每個戰(zhàn)斗小組根據任務劃分的不同,通常處于不同的執(zhí)行區(qū)域,并且,由于各組接受任務的明確性,在實際作戰(zhàn)中,即便各組之間位置臨近,往往也需要運用手語進行下一步行動的聯絡和指揮,在實際作戰(zhàn)中,往往采用三個以上的連貫手勢動作組成的手語來表達一個行動命令,尤其體現在明確進攻戰(zhàn)法、躲避敵人攻擊等高度緊張情況下。根據以上情況,結合表4-1中編成的單個戰(zhàn)術手語表,以每三個手勢為一個組合進行編成,并對構成的三個手勢對應的意思進行組合,從而得到了對應的文字結果,如下表所示:
表4-2 戰(zhàn)術手語編成表
| 手勢圖片 | 對應數字結果 | 對應文字結果 |
| 1 2 3 | 前方發(fā)現敵人,所有人散開 | |
| 1 7 6 | 前方敵人弱火力點,進行兩側進攻 | |
| 2 8 5 | 發(fā)現敵人重火力點,迅速趴下 | |
| 9 1 4 | 敵人已消滅,前方展開搜索 | |
| 4 2 8 | 報告!搜索發(fā)現強火力點 | |
| 1 8 9 | 報告!前方強火力點已消滅 |
為便于研究測試,按照中文中主語、謂語、賓語、動詞的組合要求和基本模式,本文將表4-1中編成的十個單獨的戰(zhàn)術手勢,以每三個手勢為一個組合編成了六組戰(zhàn)術手語,并根據每組手語的單個手勢意思賦予其實際意義。在實際使用過程中,根據表4-1中編成的單個戰(zhàn)術手語或者重新建立一個新的單個戰(zhàn)術手語表,而后再按照新的規(guī)則以三個一組、四個一組等等模式進行組合并賦予意義,都可以形成新的戰(zhàn)術手語組合。通過這樣的戰(zhàn)術手語建立形式,能夠極大程度的提高作戰(zhàn)中手語聯絡的安全性以及迷惑性,從而有效為作戰(zhàn)聯絡服務。
4.2 手勢圖像預處理
手勢識別屬于數字圖像處理過程,在數字圖像處理過程中,大部分的圖像都來源于現場攝像機拍攝采集,由于攝像機性能的千差萬別以及現場環(huán)境的不同,得到的圖像往往都不是最高質量的圖像,大多數圖像都存在噪聲,光照等環(huán)境因素的干擾。所以通常都需要進行圖像的預處理過程,去除圖像中主體目標之外的干擾因素,降低圖像的像素大小,減小圖像的數據量,從而很大程度上簡化系統預算過程,優(yōu)化處理速度,提升圖像處理的準確性。
4.2.1 手勢圖像顏色空間轉換
圖像的表示方法有很多種方式,目前常見的圖像色彩表示模式有RGB模式,CMKY模式,HSV圖像模式,位圖,灰度圖等模式,不同的場景所采用的圖像表示模式不盡相同。HSV表示圖像的色調,飽和度,明度,基于人類對于顏色的感知情況而建立的模型,是十分重要的一種顏色表示模型。本設計中采用HSV顏色模型進行顏色空間轉換處理。通過HSV處理后的手勢圖像如下所示:
圖4-1 HSV處理后的手勢圖像
Matlab中將RGB圖像轉換成HSV圖像是通過rgb2hsv函數完成,由圖像可以看出,RGB模型雖然是常用的圖像表示模型,但是RGB模型反應的是物體真實存在的狀態(tài),也方便計算機處理,但是對于人來說并不是很直觀,HSV模型則很直觀的反應出圖像的顏色,飽和度以及亮度信息。經過HSV轉換的圖像,背景部分和手掌部分區(qū)分明顯,只需要在下一步中設置好合適的圖像分割閾值,就能將手勢圖像從背景中區(qū)分開來。
4.2.2 圖像二值化
本文針對手勢圖像背景較為單一的情況,在HSV空間選擇固定的閾值進行圖像二值化,二值化結果如下:
圖4-2 二值化后手勢圖像
經過多次調節(jié)參數后,選擇了合適的閾值(0.09<hsv<015)進行二值化,二值化后的圖像手掌部分為白色,值為1,背景部分為黑色,用0表示,二值化后的圖像手勢部分和背景部分過渡十分明顯,從1到0或者是從0到1的部分都是手勢的邊緣,而全部都是0的圖像部分就是圖像的背景,全部為1的部分就是手勢部分。這一點可以作為后續(xù)的手勢圖像分割的依據。
4.2.3 形態(tài)學操作
圖像二值化后,手勢圖像與背景圖像區(qū)分較為明顯,背景部分為黑色,手勢部分為白色,但是由于閾值選擇問題以及圖像主題與背景連接較為緊密,導致部分圖像存在孔洞以及圖像邊緣不夠平滑,采取形態(tài)學操作能夠填充圖像的孔洞以及平滑手勢邊緣,去除邊緣毛刺。
經過形態(tài)學操作的手勢圖像處理結果如下,通過結果可以看出,原來手勢圖像的孔洞部分得到了很好的填充。
圖4-3 形態(tài)學操作后的手勢圖像
經過形態(tài)學操作后的圖像,整體手勢圖像變得完整,原二值化圖像中,手指甲部分由于閾值不一樣的原因,部分指甲部分分割不全,導致存在孔洞的現象,經過形態(tài)學操作,填充了圖像的孔洞,平滑了圖像邊緣,為后續(xù)的圖像分割以及特征提取提供了高質量的圖像。
4.2 圖像分割
圖像分割也是圖像處理任務中常用的一種方法,該方法主要目的是將采集的圖像進行前景和背景的分離,分割出的前景部分也就是手勢部分用于后續(xù)的特征提取過程。圖像分割的方法也有很多,近年來隨著圖像處理以及深度學習的快速發(fā)展,很多熱門學科諸如神經網絡,深度學習等都被用作圖像分割處理,大大提高了圖像分割的準確率。
4.2.1 基于連通域的手勢圖像分割
在進行圖像預處理后,原本復雜的圖像變得簡單,也濾除了很多的其他干擾因素,此時需要進行圖像分割操作,將手勢圖像從原始圖像中分割出來,便于后續(xù)的特征提取操作。
從二值化的圖像可以看出,手勢圖像與背景界線較為明顯,且手勢圖像內部沒有孔洞,圖像較為純凈,因此本系統采用基于連通域的圖像分割法分割手勢區(qū)域。
連通域的分析是基于二值圖像的,即提取二值圖像中的連通區(qū)域,對每個獨立連通域的分析,就能進一步得到該區(qū)域的面積,質心,輪廓等參數。在圖像處理中,最小的圖像處理單位是圖像像素,即構成圖像的每個獨立區(qū)域,不同的像素按照位置關系可以分為4鄰接和8鄰接,4鄰接是指單個像素的上下左右四個位置,8鄰接除了這4個位置之外,還有包含對角線的位置。如下圖所示,圖像左邊為4鄰接點,右邊為8鄰接點。
圖4-4 連通域示意圖
像素A與像素B如果位置處于鄰接點,則該像素所屬區(qū)域之間連通,遍歷圖像,就能得到很多的連通區(qū)域,由于之前的二值化圖像得到的圖像較為純凈,所以選擇連通域中的最大值,就能得到手勢分割圖像,分割圖像如下:
圖4-5 手勢分割圖像
由圖像可以看出,手勢部分是一個整體,這得益于上一步的圖像形態(tài)學操作過程,使得手勢圖像中間沒有斷開或者斷裂的部分,如果存在斷裂部分的話,則圖像分割時會將手勢圖像分割成為多個部分,完整的手勢圖像,整個手勢部分都是一個連通域,手勢中的每個像素不論是八連通區(qū)域還是四連通區(qū)域,都能找到其他的手勢部分,對圖像進行遍歷,判斷連通域,就能夠從背景中將手勢圖像分割出來。
4.3 圖像特征提取
圖像特征提取是描述圖像區(qū)域的有效方法,不同的圖像包含著不同的特征,常見的特征有顏色特征,紋理特征,幾何特征等等,這些特征又能進一步細分,有的圖像特征描述的是圖像的整體特征,有的描述的圖像局部特征,要根據不同的圖像處理任務選擇合適的圖像特征。本文采用幾何不變矩-Hu矩以及空間幾何特征作為手勢圖像的特征。
4.3.1 幾何不變矩-Hu矩
矩的應用十分廣泛,矩的概率來自物理學,主要用于表現物體空間分布,譬如力矩,扭矩等,后來逐漸被用于其他學科,比如在統計學中,一階矩表示期望,二階矩表示方差等等。圖像處理中,可以將圖像看作是二維矩陣,矩則表示概率分布。幾何不變矩-Hu矩是常用的圖像特征之一,是非線性特征組合而成的,具有旋轉平移伸縮不變性。
假設圖像用f(x,y)表示,則p+q階原點矩和中心矩可分別用如下公式表示:
p+q階原點矩表達式如式4-1所示:
(4-1)
中心矩表達式如式4-2所示:
(4-2)
以上兩個矩并不能很準確的表示圖像的特征,所以在此基礎上,可以構造出7個矩的不變量用于圖像的特征描述。
具體公式如下:
(4-3)
(4-4)
(4-5)
(4-6)
(4-7)
(4-8)
(4-9)
通過以上公式構造出7個矩的不變量,從而對圖像的幾何特征進行初步的描述。在完成圖像識別的過程中,空間幾何特征也是較為直觀的一種方式,下面就空間集合特征進行詳細描述。
4.3.2 空間幾何特征
空間幾何特征是描述圖像特征的方式之一,也是較為直觀的一種方式。常見的幾何特征有圖像的面積,圖像的周長,圖像的輪廓,圖像的中心等等。本文選取手勢圖像的矩形度,圓形度,偏心率作為圖像的幾何特征。
圖4-6 圖像的幾何特征
如圖所示,手勢圖像的面積即白色部分表示的區(qū)域,手勢圖像經過二值化和形態(tài)學操作后,與背景圖像明顯分離,只需要對圖像進行掃描,計算白色區(qū)域的面積即可得到手勢圖像的面積。手勢圖像的周長指的是圖像中白色部分輪廓的周長,通過連通域計算可以得到該長度。圖像的黑色部分輪廓即為圖像的最小外接矩形,矩形度可以通過(H1+H2)/(W1+W2)得到,矩形度體現了一個圖像的對其外接矩形的充實程度,通過這個特征參數可以分離圖像方形部分。圓形度通過手勢面積乘上4π除以周長的平方得到,這個參數描述的是手勢圖像與圓形圖像的相似程度。離心率表示的是手勢圖像的形狀,以O點作為圓心計算得到。
通過得到的幾何特征與不變矩-Hu矩特征結合起來,即得到了手勢圖像的形狀特征。
4.4 BP神經網絡訓練
BP神經網絡的訓練過程如下:
(1)神經網絡初始化。根據訓練圖像任務的要求,選擇合適的神經網絡輸入層的個數,隱層的權值和閾值以及輸出層的個數,合理的參數往往能達到不錯的訓練效果。本文針對10個手勢圖像進行訓練,每個手勢圖像有10個特征值,包括7個Hu矩特征,3個空間特征(矩形度,圓形度,偏心率),所以本神經網絡的輸入層為10,代表10個特征值,隱層節(jié)點為1,輸出層神經元個數為10,代表10個阿拉伯數字。
(2)特征輸入與輸出。將圖像特征輸入神經網絡進行訓練,經過隱層后輸出訓練結果。
(3)誤差計算。計算網絡的輸出層與期望值之間的差值。
(4)權值和閾值更新。將誤差反向傳遞,根據誤差調整隱層的權值和閾值。
(5)結束條件判斷。訓練結束與否取決于誤差值是滿足條件,若滿足,則結束訓練,若不滿足,則重復第二步的操作。
經過以上步驟的訓練,手勢識別神經網絡的訓練結果如下:
圖4-8 神經網絡訓練結果
由訓練結果可以看出,訓練網絡的input有10個變量的輸入,output部分有10個變量的輸出,中間有一個隱藏層,網絡訓練方式采用的是學習率自適應的梯度下降BP算法,BP神經網絡能夠根據訓練結果自動調整步長以及權值;中間的progress顯示了每次訓練的進度,圖像經過了37輪的訓練,validation check為泛化能力檢查,由訓練結果可以看出,神經網絡連續(xù)6次訓練誤差不降反升,滿足了訓練結束的調節(jié),所以訓練結束。
4.5 本章小結
本章通過結合需求分析和設計說明,詳細介紹了本文中圖像處理和手勢識別的基本流程,依次對戰(zhàn)術手語的編成和設計、圖像預處理、圖像分割、圖像特征處理、BP神經網絡識別進行詳細的設計與實驗情況的介紹,并給出了實現的相關算法和界面截圖。
第五章 GUI用戶使用界面的實現
本章根據設計的需要,在實現圖像處理和手勢識別的基礎上,實現對GUI用戶使用界面的設計,著重介紹MATLAB環(huán)境下的GUI設計相關屬性和技術。通過對GUI的基本功能的使用介紹和演示,使用戶對GUI的搭建基礎有進一步的了解。最后根據前文提出的設計需要,對基于MATLAB的戰(zhàn)術手勢識別功能的用戶使用界面進行設計實現,并給出核心代碼和流程圖。
5.1 GUI設計相關參數和函數
圖形用戶界面(graphical user interfaces,GUI)是MATLAB軟件中的一個重要模塊,具有窗口、圖標、菜單和文本說明等多個圖形對象,由菜單控件、按鈕控件、坐標軸控件、滾動條控件、面板控件等對象控件構成,是采用圖形方式顯示的用戶操作界面。完成GUI界面的對象設定和界面設計后,會自動生成一個包含所有對象屬性值的fig文件和包含函數代碼的m文件。在m文件中,包含了GUI的主函數、Opening函數、Callback函數以及Output函數等,通過對這些函數的編寫,可以實現不同的功能需要。
在GUI中,所有的對象都有對應的基本函數和屬性來對它們的特征進行定義,正是通過對這些基本函數和屬性的設定,從而實現了GUI界面中各類控件、圖像、軸的展現方式。盡管較多的一般屬性是所有的對象都具備的,不具有特殊性,但與每一種對象類型(比如坐標軸,線,曲面)相關的屬性和函數都是獨一無二的。對象屬性可包括諸如對象的位置、顏色、類型、父對象、子對象及其它內容。每一個不同對象都有和它相關的函數和屬性,可以通過單獨的改變這些函數和屬性而不影響同類型的其他對象。
下面對GUI中常用的基本函數屬性進行列舉介紹:
表5-1 GUI函數屬性表
| 函數 | 屬性 |
| Figure | 創(chuàng)建圖窗窗口 |
| Axes | 創(chuàng)建笛卡爾坐標區(qū) |
| Uicontrol | 創(chuàng)建用戶界面控件 |
| Uitable | 創(chuàng)建表用戶界面組件 |
| Uipanel | 創(chuàng)建面板容器對象 |
| Uibuttongroup | 創(chuàng)建用于管理單選按鈕和切換按鈕的按鈕組 |
| uitab | 創(chuàng)建選項卡式面板 |
| Uitabgroup | 創(chuàng)建包含選項卡式面板的容器 |
| Uimenu | 創(chuàng)建菜單或菜單項 |
| Uicontextmenu | 創(chuàng)建上下文菜單 |
| Uitoolbar | 在圖窗上創(chuàng)建工具欄 |
| uipushtool | 在工具欄上創(chuàng)建普通按鈕 |
| uitoggletool | 在工具欄上創(chuàng)建切換按鈕 |
| actxcontrol | 在圖窗窗口創(chuàng)建Microsoft ActiveX控件 |
在GUI用戶使用界面的研究和設計中,各個控件的使用和定義都需要基于回調函數的調用,通過對每個控件下的回調函數下根據需要進行的相應代碼的編寫來實現所要達成的效果,在戰(zhàn)術手勢識別的研究和設計中,針對戰(zhàn)術手勢視頻的錄入、戰(zhàn)術手勢圖像的分解、識別結果的展示和音頻播放、重置五個功能進行了回調函數的設置,下面首先針對GUI中常用的回調函數的屬性和使用規(guī)則進行總結講述。
(1)Callback函數
通常作為主回調函數,包含函數句柄、元胞數組、字符向量等基本屬性,MATLAB 在基礎工作區(qū)計算此表達式。該函數用于普通按鈕點擊、滑塊移動或復選框選中執(zhí)行用戶交互功能,整個GUI界面的操作的完成基本上都通過Callback函數來控制完成。對于Callback函數的執(zhí)行情況,通常在定義組件、更改回調函數值時執(zhí)行相應的操作。當Callback控件為按鈕或滑塊時,點擊按鈕、拖動滑塊操作后對應的Callback函數就會執(zhí)行。概況而言即為,當對控件進行默認操作時,其對應的Callback函數便會被調用并執(zhí)行。在戰(zhàn)術手勢識別的研究與設計中,實現點擊按鈕正確錄入手勢圖像以及點擊按鈕不錄入手勢圖像時顯示對話框的核心代碼如下:
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[filename,pathname]=uigetfile({'*.*';'*.bmp';'*.jpg';'*.tif';'*.jpg'},'選擇圖像');%返回文件名,文件路徑
if isequal(filename,0)||isequal(pathname,0)
errordlg('請選擇圖片','提示');%如果沒有輸入,則創(chuàng)建錯誤對話框
return;
else
im=[pathname,filename];%合成路徑+文件名
image=imread(im);%讀取圖像
%set(handles.axes1,'HandleVisibility','OFF');%關閉坐標,方便操作
axes(handles.axes1);%%使用圖像,操作在坐標1
imshow(image);%在坐標axes1顯示原圖像
%title('手勢圖像一');
end
(2)ButtonDownFcn函數
ButtonDownFcn函數與Callback函數功能相似,在點擊控件時,便會執(zhí)行該控件下的ButtonDownFcn函數。由于Callback函數同樣具備點擊后執(zhí)行的屬性,所以通常情況下,ButtonDownFcn函數會被覆蓋。
(3)CreateFcn函數
CreateFcn函數的執(zhí)行是在所有屬性設定完成后,程序運行或者控件建立時便會執(zhí)行,無須進行任何操作。相比較來看,Callback則需要選中或者按下對應的控件,函數才會執(zhí)行。
(4)DeleteFcn函數
在控件要執(zhí)行消除或者關閉行為時,在被執(zhí)行以上行為之前執(zhí)行這個函數名下的代碼。日常見到的諸如各種軟件在點擊關閉按鈕后彈出的“是否確認關閉?”此類的設計即為在該函數下進行的代碼設置。
(5)KeyPressFcn函數
當前控件獲得焦點且有按鍵按下時執(zhí)行。焦點指某控件被鼠標選中或者由tab鍵輪選選中時,該控件所處的狀態(tài)即為焦點,可以理解為當前正在使用的窗口。其原理亦可借鑒攝影原理進行分析,在攝影時,鏡頭聚焦一個點后,其他地方就會呈現虛化,達不到攝影效果甚至無法識別,KeyPressFcn函數在調用時即是在控件得到這種類似“聚焦”的狀態(tài)時才能執(zhí)行。一般情況下,KeyPressFcn下編寫的代碼還會對按鍵下面內容進行判斷,然后再執(zhí)行相應的代碼。
(6)SelectionChangeFcn函數
SelectionChangeFcn函數用于多個對象互斥,不能同時被選中時,通過按鈕的聯力建立的函數,類似于單選題。在使用SelectionChangeFcn函數實現單選目的時時,需要添加button group控件,然后在button group中添加radio button按鈕,而后再對SelectionChangeFcn函數進行設置最終實現預期目標。
以上即為MATLAB中GUI基本回調函數的概念和使用環(huán)境,在實際運用中通常還需要指定回調屬性值,其方法主要有三種:
一是指定函數句柄。函數句柄提供了一種以變量表示函數的方法。通過對函數的定義或者在函數名稱前規(guī)定運算符號,即可創(chuàng)建指定函數句柄。但是在指定的函數句柄中,不會顯示引用的任何輸入參數,即便如此,在指定函數句柄時,仍然需要在函數的聲明中對包含的兩個輸入參數進行強調,這兩個輸入參數對于所有指定為函數句柄的回調都是必需的。
二是指定元胞數組,通過元胞數組的指定來使回調函數執(zhí)行,使得回調函數中可以使用更多的輸入參數(以逗號分割多個輸入參數,在函數聲明中進行定義)。
第三種指定匿名函數,當函數要執(zhí)行時,如果該函數不滿足函數句柄和元胞數組所必需的兩個參數,則可以通過指定匿名函數來使得函數正常執(zhí)行。例如,以下將 Callback 屬性指定為匿名函數,利用uicontrol 命令來創(chuàng)建一個普通按鈕,規(guī)定函數的名稱為max,僅用它來定義一個輸入參數 x。
b = uicontrol(“Style”,”pushbutton”,”Callback”,@(src,event)max(x));
本節(jié)通過對GUI設計中常用的相關參數和函數進行介紹,為實際的GUI設計打下理論基礎,下面結合以上原理,以簡單的GUI用戶界面搭建為例進行GUI用戶使用界面設計的介紹。
5.2 創(chuàng)建GUI圖形用戶界面
根據戰(zhàn)術手勢識別的功能需要,在建立美觀簡潔的GUI用戶界面的基礎上,實現戰(zhàn)術手勢視頻的錄入、自動分割功能,并對識別結果進行文字呈現和語音呈現。同時,設計重置按鈕,使得用戶在一輪使用后能夠將程序歸位。結合整體GUI用戶使用界面的功能設計,將其分為視頻錄入并播放模塊、分解手勢圖像展示模塊、識別結果文字呈現模塊、識別結果音頻呈現模塊以及重置模塊。
下面就實際GUI圖形用戶界面的創(chuàng)建進行詳細介紹。
(一)GUI設計一般步驟
在實際應用中,根據所需求的功能以及最終需要實現的目的,第一步應當分析界面所需要的主要功能、明確設計任務,確定好GUI界面需要的控件和工具的類型,宏觀上有一個方向和目標;第二步應當繪制界面草圖,利用Visio等工具以圖形文字的形式繪制界面草圖,從使用者角度來考慮確定GUI界面的整體布局、各個控件的位置,在確保功能實現的基礎上提高美觀度;第三步利用GUI設計工具制作靜態(tài)界面,制作過程中確定好各個控件應具備的功能,并做好文字注釋和標注;第四步編寫界面動態(tài)功能程序,編寫對應的回調函數,最終實現各個控件的功能。
(二)GUI設計基本原則
本文功能實現的目的為提高提升提高官兵的記憶效率,確保戰(zhàn)斗或者執(zhí)行任務過程中戰(zhàn)術手語的有效正確運用。故此,在設計時需要依照用戶的實際操作體驗和功能實現的實際情況。結合GUI用戶使用界面的框架設計,本文GUI設計主要遵循以下原則:
1. 簡單性:根據人視覺美學的需要,以及人們對用戶使用界面的喜好,在設計界面時應當力求簡潔直觀,體現必要功能和特征,去除冗余的控件、窗口,通過多采用生動形象的圖形來代替文字從而加強美觀度;
2. 一致性:設計通常追求簡潔、精美,為達到這樣的效果,需要保持整體界面風格的一致,從顏色到排版都需要保持協調一致,將各對象按照功能和習慣進行排列分組,讓用戶輕松使用;
3. 安全性:界面的設計需要全面考慮用戶的實際體驗,當用戶不熟悉的時候,往往可能做出錯誤操作,故此,需要使得用戶對界面的操作盡可能可逆,當用戶做出錯誤甚至危險操作時,系統應當給出提示或者警告信息;
4. 其他因素:動態(tài)的性能能夠給與用戶更好的更直接的感官體驗,所以在設計界面時,應當注重界面的動態(tài)性能;軟件的設計皆是為了硬件服務,注重界面的美觀的前提是保證良好的功能條件,響應迅速連續(xù),對于持續(xù)時間較長應給出等待時間提示,允許用戶中斷運算等。
5.3 設計和實現戰(zhàn)術手勢識別用戶使用界面
根據基于MATLAB的戰(zhàn)術手勢識別功能的預期目標和實現需求,在設計戰(zhàn)術手勢識別用戶界面時,需要實現的功能設計包含一個選擇控件、一個展示面板、一個結果面板、一個重置控件。通過單擊選擇控件,會彈出手勢視頻文件的選擇窗口,通過選擇對應的手勢視頻文件讀取后,選擇控件下的回調函數會執(zhí)行手勢視頻的分割、手勢圖像的處理識別等功能,并將執(zhí)行后的結果于展示面板中呈現。并且,實現功能演示后,在結果面板中會根據選擇的視頻將對應的識別文字結果進行展示并播放對應的結果音頻文件。完成一個手勢視頻的處理識別操作后,單擊重置控件,使得整個戰(zhàn)術手勢識別用戶使用界面回到初始狀態(tài)。另外,當單擊選擇控件,彈出手勢視頻文件的選擇窗口后,用戶沒有選擇手勢視頻文件進行讀取時,將會彈出錯誤提示窗口。
本節(jié)以“1 2 3 前方發(fā)現敵人,所有人散開”為實例進行戰(zhàn)術手勢識別用戶使用界面的構建進行詳細介紹,當用鼠標單擊讀取視頻按鈕選擇對應的視頻進行讀取后,即在主界面中讀取并播放該視頻,對讀取的視頻進行幀數分割并將分割圖片進行展示,隨后通過圖像處理和手勢識別的算法,實現手勢識別結果的呈現。可令初學者直觀的感受到不同的圖像處理函數的功能。
5.3.1 用戶識別界面的構建
基于MATLAB的戰(zhàn)術手勢識別功能,設計總體可以分為手勢視頻分解、手勢圖像處理與識別、GUI用戶使用界面三個部分,在GUI用戶使用界面的設計中,為便于用戶的操作使用以及對手勢識別的結果有一個直觀的印象,綜合分析后設計呈現的步驟為手勢視頻的錄入和分解、手勢圖像處理與識別、手勢識別結果的文字結果呈現和語音結果播放以及程序重置四個部分內容,根據前文兼顧GUI用戶使用界面的美觀和各個模塊的功能實現兩個方面所設想的用戶使用界面圖,結合實際條件和功能實現,初步搭建用戶使用界面如下圖:
圖5-8 初步搭建用戶使用界面
在實際使用中,通過按扭的使用,將文件中的視頻錄入并在axes4這一圖像處理軸上呈現,并實現了自動播放。在視頻截取結果框圖中,設計了三個axes軸來展示手勢視頻分解后的手勢圖像,在圖像處理和手勢識別完成后,文字的結果呈現于設置好的靜態(tài)文本框中,并同步自動播放對應的音頻文件。當手勢視頻的錄入和分解、手勢圖像處理與識別、手勢識別結果的文字結果呈現和語音結果播放三個部分全部完成后,設計的程序重置按鈕能清空程序內運行完成的圖像、文字等內容,以進入第二次的運行。通過對各個控件的拖動設計,初步實現了預期效果,其展示形式如下:
圖5-9 初步搭建用戶使用界面展示
在初步設計出戰(zhàn)術手勢識別用戶使用界面后,結合實際運用的需要,將該界面的背景、控制按鈕字體、顏色等內容進行優(yōu)化保證美觀。在設計中,視頻圖片截取結果中采用了三個axes軸來展示手勢視頻分解后的手勢圖像,但在實際運用中,為保證手勢圖片像素的清晰度和準確度,實際拍攝的圖片的長度和寬度通常難以保持相應的縱橫比,故此,在考慮到整個用戶使用界面的美觀度的同時,對這三個axes軸進行了隱藏式處理。
在對用戶使用界面的背景進行設計時使用的代碼如下:
% --- Executes during object creation, after setting all properties.
function figure1_CreateFcn(hObject, eventdata, handles)
% hObject handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
ha=axes('units','normalized','pos',[0 0 1 1]);
uistack(ha,'down');
ii=imread('beijing.png');
image(ii);
colormap gray
set(ha,'handlevisibility','off','visible','off');
最終效果如下:
圖5-10 戰(zhàn)術手勢識別系統用戶使用界面
在完成戰(zhàn)術手勢識別系統的用戶使用界面后,根據預期需要實現的功能和目標,針對各個控件的功能和axes軸需要展示的內容進行設計,在各個控件中對其回調函數進行設置,如下圖
圖5-11 進入讀取視頻按鈕回調函數
選擇查看GUI讀取視頻按鈕的Callback回調函數后進入如下界面:
圖5-12 打開圖片回調函數
在GUI讀取視頻按鈕的Callback回調函數中,通過文件名(filename)和路徑(pathname)的設置,使得用戶在界面單擊讀取視頻按鈕后,直接彈出選擇視頻文件對話框,直接采用選中視頻打開讀取的方式進行手勢視頻的錄入,方便簡潔,其效果如圖:
圖5-13 選擇視頻文件對話框
在錄入視頻后,根據本文中規(guī)定的手勢識別規(guī)則,以每三個手勢圖片為一組進行識別并得出結果,所以需要對錄入的視頻進行分割處理,在錄制并測試多個手勢視頻后,最終采取以幀數分割的形式來得到所需要的手勢圖片。其思想為,正常播放一個完整的手勢視頻,每隔五個幀數的圖片進行一次圖片保存,獲取完成后將所有照片分為三段,再在每一段中取中位數,將獲得的圖片保存至對應文件夾。通過實際研究測試,按照人手勢的使用習慣,在錄成視頻時每個手勢持續(xù)時間差不多,故此以5為基數進行的幀數分割能保證最大概率獲得準確的手勢圖像。
手勢視頻幀數分割代碼如下:
for t = 1: numFrames
if 5*t<numFrames
frame = read(obj,5*t);%隔5張保存一張圖像
I=frame;
%保存每一幀圖片
imwrite(I,strcat('E:\基于MATLAB的戰(zhàn)術手勢識別功能的設計與實現\任務\匹配結果數據\分解圖像\',num2str(t),'.jpg'),'jpg');
end
end
通過對手勢視頻的幀數分割獲得相應的手勢圖片后,需要對獲取的手勢圖片進行調用并呈現在對應的axes軸上,在對axes軸的CreateFcn回調函數進行設置的過程中,通過建立一個數組(文中為imageindex)對分解的圖像進行定位,而后在Imread調用圖片路徑中以num2str(imageindex1)作為圖片的文件名。通過該算法的計算和數組的運用后,用戶讀取的手勢視頻經分割處理后的三組準確圖像就能準確的呈現在對應的axes軸上。其代碼如下:
for i = 1
imageindex1 = (2*i-1)*sumnum1/2;%定位標簽
imageindex2 = (2*(i+1)-1)*sumnum1/2;
imageindex3 = (2*(i+2)-1)*sumnum1/2;
end
imageindex1 = round(imageindex1);
imageindex2 = round(imageindex2);
imageindex3 = round(imageindex3);
Image{1}=imread(['E:\基于MATLAB的戰(zhàn)術手勢識別功能的設計與實現\任務\匹配結果數據\分解圖像\',num2str(imageindex1),'.jpg']);%圖像存入數組
Image{2}=imread(['E:\基于MATLAB的戰(zhàn)術手勢識別功能的設計與實現\任務\匹配結果數據\分解圖像\',num2str(imageindex2),'.jpg'])
Image{3}=imread(['E:\基于MATLAB的戰(zhàn)術手勢識別功能的設計與實現\任務\匹配結果數據\分解圖像\',num2str(imageindex3),'.jpg'])
set(handles.axes1,'HandleVisibility','ON');%打開坐標,方便操作
axes(handles.axes1);%%使用圖像,操作在坐標1
imshow(Image{1}); %顯示每一幀圖片
set(handles.axes2,'HandleVisibility','ON');%打開坐標,方便操作
axes(handles.axes2);%%使用圖像,操作在坐標1
imshow(Image{2}); %顯示每一幀圖片
set(handles.axes3,'HandleVisibility','ON');%打開坐標,方便操作
axes(handles.axes3);%%使用圖像,操作在坐標1
imshow(Image{3}); %顯示每一幀圖片
針對設計中運用到的axes2軸和axes3軸進行設置后,就能實現讀取手勢視頻后,對視頻進行自動的分割成三張手勢圖片從而進入下一步的圖像處理和手勢識別過程。
圖5-14 讀取手勢視頻后結果
通過讀取手勢視頻并對視頻進行的分割呈現,順利獲得了按照本文設定的戰(zhàn)術手語所規(guī)定的三組手勢圖像。在獲取手勢圖像后,對獲得的手勢圖像進行圖像處理并代入神經網絡庫進行識別,從而得出了對應的文字識別結果并彈出識別成功對話框。
圖5-15 錄入視頻識別成功
根據第四章中設定好的戰(zhàn)術手語編成內容,在MATLB中規(guī)定并編寫了對應的數組,其中,規(guī)定各組戰(zhàn)術手勢對應的文字結果為一個數組(文中為strvalue),各組戰(zhàn)術手勢對應的數字結果為一個數組(文中為re_mat),保持兩組數組的一一對應順序,確保識別結果的準確。
其代碼如下:
load('net.mat');%數據初始化
load('class_name.mat');
strvalue = {'前方發(fā)現敵人,所有人散開','前方敵人弱火力點,進行兩側攻擊','發(fā)現敵人重火力點,迅速趴下','所有人散開,至前方集合','報告!搜索發(fā)現強火力點','敵人已消滅,前方展開搜索'};
re_mat= [123,176,285,914,428,3110];
regc = 0;
將讀取的手勢視頻分割為對應的三組手勢圖片后,通過多次實驗測試得出,以index=1:3參數進行調試可以達到最為準確的實驗結果,通過對獲得的手勢圖片特征歸一化處理后,將所得結果建立為數組(文中為fetuer_arr),而后將所得結果存入MATLAB的net神經網絡庫進行識別,得出識別的各個圖像對應的數字結果,最終識別匹配出用戶讀取的視頻對應的文字識別結果,其代碼如下:
for index=1:3
im =Image{index};%索引數組
fetuer_arr = Shape(im,0);
fetuer_arr = fetuer_arr';
fetuer_arr(1,:) =(fetuer_arr(1,:)-1)/(4-1);%%特征歸一化
fetuer_arr(2,:) =(fetuer_arr(2,:)-10)/(100-10);%%特征歸一化
fetuer_arr(3,:) =(fetuer_arr(3,:)-1)/(4-1);%%特征歸一化
[result] = net(fetuer_arr);
[va,ind] = max(result);
ind = str2double(class_name{ind});
if(ind~=20)
regc = ind+regc*10;
else
regc = regc*100+ind;
end
end
[flag,memindex] = ismember(regc,re_mat);
if flag
%fprintf('識別手勢為:%d\n',regc);
value = strvalue(memindex);%文字結果
set(handles.edit1,'string',value)%設置顯示結果
end
toc;
msgbox('識別完成','結果');
在完成戰(zhàn)術手勢的讀取和識別后,用戶即得到了與其讀取視頻相對應的文字結果。同時,為了用戶在使用時的便利性以及整體設計的生動性,在識別得出文字結果后,通過MATLAB函數的編寫,實現同步的文字結果的語音播放,從而使得該GUI用戶使用界面的結果展示更加生動形象,能夠適應更多人群的需要,其代碼如下:
sound_dir = 'E:\基于MATLAB的戰(zhàn)術手勢識別功能的設計與實現\任務\匹配結果數據';
sound_list = dir([sound_dir,'\*.mp3']);
if flag
%fprintf('識別手勢為:%d\n',regc);
sound_file_name = [sound_dir,'/',sound_list(memindex).name];
[y, Fs] = audioread(sound_file_name);
sound(y,Fs);
end
完成對一個手勢視頻的讀取與識別后,通過單擊程序重置按鈕,復原整個手勢識別用戶使用界面,用戶即可按照同樣的順序讀取新的視頻進行新一輪的處理和識別過程。其代碼如下:
axes(handles.axes1);%清空圖像
cla
axes(handles.axes2);
cla
axes(handles.axes3);
cla
axes(handles.axes4);
cla
set(handles.edit1,'string','');%清空結果
5.4 本章小結
本章從用戶實際使用的角度出發(fā),結合實際需求分析,依次介紹了GUI設計的基本概念和流程,通過實際設計,詳細介紹了本文設計的GUI用戶界面的實現過程,并給出了實現的關鍵代碼和相關界面截圖。
第六章 戰(zhàn)術手勢識別功能的測試與分析
為了測試系統的各項功能是否能夠正常地運行,對本系統的進行多次測試,并對每個測試進行計時,得出實驗結果并針對錯誤進行改進,以確保系統正常運行。
6.1 系統的測試與分析
系統的測試與分析作為建議系統可靠性和質量的關鍵步驟,其目的是在完成開發(fā)后,通過對開發(fā)中各個階段的需求和功能的實現進行測試檢驗,通過全面或者特殊的測試用例,來測試運行結果,確保以最少的時間和精力來發(fā)現錯誤。系統的測試與分析作為系統開發(fā)的最后階段工作,是十分重要并不可或缺的,通過測試,能夠發(fā)現前期設計中忽略的一系列問題,保證了系統或功能的質量和可靠性。一般的,系統的測試與分析需要遵循以下原則:
1. 測試用例應當具備有效合理的特性,并且要有代表性,能夠通過該測試例子得出整體設計的普遍規(guī)則;
2. 測試工作應當貫穿整個系統或功能的設計與實現的各個階段,發(fā)現問題盡早糾正,以減低后期修改的工作量;
3. 測試過程產生的結果、數據應該整理保存,并作為論文的重要組成部分。
6.2 戰(zhàn)術手勢識別功能測試
6.2.1 戰(zhàn)術手勢識別功能測試(一)
針對本文設計的基于MATLAB的戰(zhàn)術手勢識別功能,結合文中編成的戰(zhàn)術手語庫,對設計組合的六組戰(zhàn)術手語分別進行測試,并記錄從讀取視頻到完成識別的時間,為分析改進提供重要依據。
在測試過程中,運用MATLAB的tic和toc代碼,即可完成對整個識別過程的自動計時。
(1)第一組:測試數組為1 2 3。對應識別結果為:前方發(fā)現敵人,所有人散開。
在MATLAB運行main代碼,讀取第一組測試視頻后,呈現結果如下圖。
圖6-1 第一組測試視頻
通過測試,第一組視頻順利完成識別,通過tic和toc代碼計算得出識別時間為0.765040秒
第二組:測試數組為1 7 6。對應識別結果為:前方發(fā)現弱火力點,進行兩側進攻。
針對第二組測試,為提高測試準確度和全面性,第二組測試視頻選用了視頻及視頻分割后形成圖像方向為橫向的手勢視頻,從而與其他測試組形成對比分析結果。
單擊程序重置按鈕重置程序后,讀取第二組測試視頻后,呈現結果如下圖。
圖6-2 第二組測試結果
通過測試,第二組視頻順利完成識別,通過tic和toc代碼計算得出識別時間為1.415490秒
在測試視頻中,第二組視頻及圖片方向為橫向而另外五組視頻及圖片方向均為縱向,通過第二組的對比測試可以分析得出,視頻和圖片的方向不影響整體功能測試的完成,整體仍舊能夠保持較好的識別速度和效率。
第三組:測試數組為2 8 5。對應識別結果為:發(fā)現敵人重火力點,迅速趴下。
單擊程序重置按鈕重置程序后,讀取第三組測試視頻后,呈現結果如下圖。
圖6-3 第三組測試結果
通過測試,第三組視頻順利完成識別,通過tic和toc代碼計算得出識別時間為0.661082秒
第四組:測試數組為9 1 4。對應識別結果為:敵人已消滅,前方展開搜索。
單擊程序重置按鈕重置程序后,讀取第四組測試視頻后,呈現結果如下圖。
圖6-4 第四組測試結果
通過測試,第四組視頻順利完成識別,通過tic和toc代碼計算得出識別時間為0.639774秒
第五組:測試數組為4 2 8。對應識別結果為:報告!搜索發(fā)現強火力點。
針對第五組測試,為提高測試準確度和全面性,第五組測試視頻選用了未經模糊化處理的原始視頻,并與經過模糊化處理的測試視頻進行對比測試,從而形成對比分析結果。
單擊程序重置按鈕重置程序后,分別讀取格式為avi的經模糊化處理的和格式為mp4的第五組測試視頻后,呈現結果如下圖。
圖6-5 第五組測試結果(mp4)
圖6-6 第五組測試結果(avi)
通過測試,第五組視頻順利完成識別,通過tic和toc代碼計算得出,未經模糊化處理的原始視頻識別時間為4.761494秒,而經過模糊化處理的測試視頻識別時間為0.655298秒,兩者測試時間相差約為7倍。
在對整個識別過程進行分析后,針對影響手勢視頻識別速率的因素得出以下兩個方面的結論:
(1)通過對該組視頻的基本屬性進行分析,經過模糊化處理的測試視頻avi,視頻較為模糊,對應的分辨率為272×480;未經過模糊化處理的原始視頻MP4,視頻較為清晰,對應的分辨率為1080×1920。
通過對比分析得出,視頻的幀寬度和幀高度即視頻的清晰度會對讀取視頻后的視頻分割造成影響,從而造成整體識別的速率。
圖6-7 第五組視頻屬性對比
(2)通過對讀取視頻后分割形成的圖像屬性進行分析,未經過模糊化處理的原始視頻MP4,分解形成的圖像較為清晰,分辨率為1080×1920,其對應的大小為59.5kb;而經過模糊化處理的測試視頻avi,分解形成的圖像較為模糊,分辨率為272×480,其對應的大小為6.87kb。
綜合以上屬性,通過分析得出MATLAB對不同分辨率的圖像識別速率不同從而會對設計整體識別速率造成影響。
圖6-8 第五組分割后圖像屬性對比
第六組:測試數組為1 8 9。對應識別結果為:報告!前方強火力點已消滅。
單擊程序重置按鈕重置程序后,讀取第六組測試視頻后,呈現結果如下圖。
圖6-9 第六組測試結果
在第六組測試中,讀取的手勢視頻能夠正確分解為對應的三個手勢圖片,但出現了沒有得出識別結果的問題。
針對該問題,在代碼的檢查完成并確認無誤后,為查找無法識別問題的原因,通過在手勢識別源代碼中進行斷點檢查的方式進行無法正確識別結果問題的排查。
在綜合考慮多個斷點查找方法后,決定采取在完成手勢識別與手勢識別結果呈現這兩個部分中間設置斷點,從而判斷該讀取的手勢視頻實際識別出的數字結果,從而判斷問題所在。
在圖中所示位置,即代碼第337行處設置一斷點,而后運行程序,再次讀取視頻,得到結果如下圖。
圖6-10 斷點運行后結果
通過斷點運行后結果可以得出,在該組中讀取的視頻正確完成了視頻分割、圖像處理以及圖像識別的過程,但是圖像識別結果為337,與實際對應數字189不符。根據斷點運行后結果初步判斷出現無法正確識別出結果的問題為:訓練圖片數量較少或相似造成的識別混亂。
根據以上分析結果,在對訓練圖像庫進行整理添加后,尤其針對1、3、7、8、9這五個數字的訓練圖像庫進行添加整理,而后運行train代碼對訓練圖像進行第二次訓練。
訓練完成后結果如下圖:
圖6-11 第二次訓練結果
完成訓練后,再次運行main代碼,按照同樣的步驟讀取第六組視頻,成功識別出結果。
圖6-12 第六組修正后訓練結果
通過測試,第六組視頻順利完成識別,通過tic和toc代碼計算得出識別時間為1.162034秒
6.2.2 戰(zhàn)術手勢識別功能測試(二)
通過對本文中規(guī)定的六組手勢組合進行測試,從而基本分析出了整個功能再實現和運用中可能存在的問題和不足之處,下面,針對整體功能的實現,進行一百組手勢數組的實驗測試,從而得到每一組數組的測試時間
結合本文對數組的設計背景,以1到10的十個數字為集合,取三個元素為一組進行不重復的排列組合,產生的組合有4320種。
圖6-13 排列組合結果
根據設計實驗測試的實際需求和需要,在1到10的十個數字為集合產生的4320種組合中,選擇出符合語句序列并且貼近實戰(zhàn)的100組戰(zhàn)術手勢語言組合進行戰(zhàn)術手勢識別功能的第二輪測試。
通過對100組語句序列的挑選分析以及編成,下面將編成的100組戰(zhàn)術手語分為5組,每20個語句為一組進行測試并列表。每組測試需要事先擬寫的內容包括戰(zhàn)術手勢語言組合的數字組合、文字含義,需要測試得到的內容為每一組手勢語言的識別時間,建立文件夾如圖6-14。
圖6-14 100組測試視頻
相對應的將100組視頻的文字結果進行轉化得到音頻結果如圖6-15。
圖6-15 100組測試音頻(截取部分)
最終通過對100組戰(zhàn)術手勢語言組合的測試時間的數學分析,得出普遍規(guī)律并加以分析。
五組測試結果表如下:
表6-1 第一組數組測試結果(1-20)
| 序號 | 數組 | 文字含義 | 測試時間 |
| 001 | 1 2 3 | 前方發(fā)現敵人,所有人散開。 | 0.765040 |
| 002 | 1 7 6 | 前方發(fā)現弱火力點,進行兩側進攻 | 1.415490 |
| 003 | 2 8 5 | 發(fā)現敵人重火力點,迅速趴下。 | 0.661082 |
| 004 | 9 1 4 | 敵人已消滅,前方展開搜索 | 0.639774 |
| 005 | 4 2 8 | 報告!搜索發(fā)現強火力點 | 0.655298 |
| 006 | 1 8 9 | 報告!前方強火力點已消滅 | 1.162034 |
| 007 | 1 2 5 | 前方發(fā)現敵人,迅速趴下。 | 0.645282 |
| 008 | 1 2 7 | 前方發(fā)現敵人弱火力點。 | 0.688214 |
| 009 | 1 2 8 | 前方發(fā)現敵人強火力點。 | 0.710258 |
| 010 | 1 2 10 | 前方發(fā)現敵人,迅速集合! | 0.692015 |
| 011 | 3 1 4 | 散開,前面展開搜索。 | 0.625894 |
| 012 | 3 6 8 | 散開,對敵人強火力點進行兩側進攻。 | 0.895220 |
| 013 | 3 7 10 | 散開,至敵人弱火力點處集合。 | 0.675215 |
| 014 | 3 5 4 | 散開,趴下進行匍匐搜索。 | 0.652113 |
| 015 | 1 5 7 | 前方趴下與敵人弱火力點對峙。 | 0.642581 |
| 016 | 1 4 8 | 前方展開搜索而后建立強火力點。 | 1.158995 |
| 017 | 1 4 7 | 前方展開搜索而后建立弱火力點。 | 0.664821 |
| 018 | 1 4 10 | 前方展開搜索而后集合。 | 0.642587 |
| 019 | 1 9 10 | 前方敵人已消滅,集合。 | 0.641258 |
| 020 | 2 9 7 | 發(fā)現敵人已消滅弱火力點。 | 0.681204 |
表6-2 第二組數組測試結果(21-40)
| 序號 | 數組 | 文字含義 | 測試時間 |
| 021 | 5 8 3 | 匍匐(趴下)前進,至強火力點散開。 | 錯誤識別 |
| 022 | 1 3 5 | 前方散開,趴下觀察。 | 0.675215 |
| 023 | 5 7 3 | 匍匐(趴下)前進,至弱火力點散開。 | 0.669872 |
| 024 | 1 3 4 | 前方散開,展開搜索。 | 0.636489 |
| 025 | 9 3 4 | 敵人已消滅,前方散開進行搜索。 | 0.642538 |
| 026 | 1 6 8 | 前方成兩側隊形進攻敵人強火力點。 | 0.723586 |
| 027 | 1 6 7 | 前方成兩側隊形進攻敵人弱火力點。 | 0.658328 |
| 028 | 7 9 10 | 弱火力點敵人已消滅,迅速集合。 | 0.695323 |
| 029 | 2 7 9 | 發(fā)現敵人被摧毀弱火力點。 | 0.735286 |
| 030 | 8 9 10 | 強火力點敵人已消滅,迅速集合。 | 0.953218 |
| 031 | 10 4 8 | 集合,搜索敵人強火力點。 | 0.782356 |
| 032 | 1 5 10 | 前方匍匐(趴下)前進,而后集合。 | 0.683329 |
| 033 | 5 3 4 | 匍匐(趴下)散開,展開搜索。 | 0.728535 |
| 034 | 7 3 6 | 以弱火力點為準散開,進行兩側進攻。 | 0.653221 |
| 035 | 8 3 6 | 以強火力點為準散開,進行兩側進攻。 | 0.623228 |
| 036 | 2 8 9 | 發(fā)現敵人被摧毀強火力點。 | 0.782325 |
| 037 | 1 10 4 | 前方集合,展開搜索。 | 0.695238 |
| 038 | 2 7 5 | 發(fā)現敵人弱火力點,迅速趴下。 | 0.786333 |
| 039 | 9 1 10 | 敵人已消滅,前方集合。 | 0.953219 |
| 040 | 10 4 7 | 集合,搜索敵人弱火力點。 | 0.681234 |
表6-3 第三組數組測試結果(41-60)
| 序號 | 數組 | 文字含義 | 測試時間 |
| 041 | 5 1 7 | 趴下,前方敵人弱火力點。 | 0.654768 |
| 042 | 5 1 8 | 趴下,前方敵人強火力點。 | 0.753875 |
| 043 | 7 1 6 | 我方弱火力點進行兩側進攻。 | 1.246547 |
| 044 | 8 1 6 | 我方強火力點進行兩側進攻。 | 0.744464 |
| 045 | 9 1 7 | 敵人已消滅,前方建立弱火力點。 | 0.764395 |
| 046 | 9 1 8 | 敵人已消滅,前方建立強火力點。 | 0.623345 |
| 047 | 10 4 1 | 密集搜索前方。 | 0.624367 |
| 048 | 9 10 1 | 敵人已消滅,集合前進。 | 0.667467 |
| 049 | 6 1 10 | 兩側進攻前方敵人聚集地。 | 0.825476 |
| 050 | 9 10 4 | 敵人已消滅,集合搜索。 | 0.676542 |
| 051 | 8 10 4 | 敵人強火力點集合,而后展開搜索 | 0.698543 |
| 052 | 7 10 4 | 敵人弱火力點集合,而后展開搜索 | 1.243668 |
| 053 | 8 10 5 | 至(我方)強火力點集合趴下。 | 0.733656 |
| 054 | 7 10 5 | 至(我方)弱火力點集合趴下。 | 0.658643 |
| 055 | 8 10 9 | 敵方強火力點聚集地敵人已消滅。 | 0.638757 |
| 056 | 7 10 9 | 敵方弱火力點聚集地敵人已消滅。 | 0.643858 |
| 057 | 1 8 10 | 前方強火力點處集合。 | 錯誤識別 |
| 058 | 1 7 10 | 前方弱火力點處集合。 | 0.679447 |
| 059 | 1 8 3 | 前方強火力點處散開。 | 0.713554 |
| 060 | 1 7 3 | 前方弱火力點處散開。 | 0.654768 |
表6-4 第四組數組測試結果(61-80)
| 序號 | 數組 | 文字含義 | 測試時間 |
| 061 | 3 7 6 | 散開,向敵人弱火力點兩側進攻。 | 0.856234 |
| 062 | 3 8 6 | 散開,向敵人強火力點兩側進攻。 | 0.745896 |
| 063 | 1 7 5 | 前方弱火力點處趴下。 | 0.763489 |
| 064 | 1 8 5 | 前方強火力點處趴下。 | 0.603506 |
| 065 | 1 7 9 | 報告!前方弱火力點已消滅。 | 0.865023 |
| 066 | 1 9 4 | 前方敵人已消滅,展開搜索。 | 0.642036 |
| 067 | 2 8 10 | 發(fā)現敵人強火力點,集合。 | 0.960325 |
| 068 | 2 7 10 | 發(fā)現敵人弱火力點,集合。 | 0.622306 |
| 069 | 2 9 8 | 發(fā)現敵人已消滅強火力點。 | 0.700630 |
| 070 | 4 2 7 | 搜索發(fā)現敵人弱火力點。 | 0.830265 |
| 071 | 9 4 1 | 敵人已消滅,搜索前進。 | 0.603598 |
| 072 | 9 5 1 | 敵人已消滅,匍匐(趴下)前進。 | 0.860325 |
| 073 | 5 4 1 | 匍匐(趴下)搜索前方。 | 0.769325 |
| 074 | 5 4 7 | 匍匐(趴下)搜索敵人弱火力點。 | 1.103642 |
| 075 | 5 4 8 | 匍匐(趴下)搜索敵人強火力點。 | 0.960351 |
| 076 | 1 7 4 | 前方弱火力點展開搜索。 | 0.862035 |
| 077 | 1 8 4 | 前方強火力點展開搜索。 | 1.225815 |
| 078 | 3 8 4 | 以強火力點為基準散開進行搜索。 | 0.730451 |
| 079 | 3 7 4 | 以弱火力點為基準散開進行搜索。 | 0.632587 |
| 080 | 8 9 1 | 敵人強火力點已消滅,前進。 | 0.964046 |
表6-5 第五組數組測試結果(81-100)
| 序號 | 數組 | 文字含義 | 測試時間 |
| 081 | 7 9 1 | 敵人弱火力點已消滅,前進。 | 0.765040 |
| 082 | 6 9 10 | 兩側進攻成功消滅敵人,集合。 | 1.315490 |
| 083 | 1 6 4 | 前方展開兩側搜索。 | 0.561082 |
| 084 | 6 5 7 | 兩側匍匐進攻敵人弱火力點。 | 0.639774 |
| 085 | 6 5 8 | 兩側匍匐進攻敵人強火力點。 | 0.655298 |
| 086 | 8 10 7 | 我方強火力點集火敵人弱火力點。 | 1.162034 |
| 087 | 7 10 8 | 我方弱火力點集火敵人強火力點。 | 錯誤識別 |
| 088 | 8 10 1 | 強火力點集中攻擊前方。 | 0.688214 |
| 089 | 7 10 1 | 弱火力點集中攻擊前方。 | 0.710258 |
| 090 | 7 9 4 | 敵人弱火力點已消滅,展開搜索。 | 0.692015 |
| 091 | 8 9 4 | 敵人強火力點已消滅,展開搜索。 | 0.625894 |
| 092 | 5 1 4 | 匍匐前進式搜索。 | 0.895220 |
| 093 | 5 1 6 | 匍匐前進兩側進攻。 | 0.675215 |
| 094 | 6 4 7 | 兩側搜索發(fā)現敵人弱火力點。 | 0.652113 |
| 095 | 6 4 8 | 兩側搜索發(fā)現敵人強火力點。 | 0.642581 |
| 096 | 6 5 4 | 兩側匍匐式搜索。 | 1.058995 |
| 097 | 1 5 4 | 前方匍匐式搜索。 | 0.664821 |
| 098 | 10 1 4 | 集合進行匍匐式搜索。 | 0.742587 |
| 099 | 6 5 1 | 兩側匍匐前進。 | 0.641258 |
| 100 | 7 6 10 | 弱火力點進行兩側進攻消滅敵人。 | 0.681204 |
以上即為基于MATLAB的戰(zhàn)術手勢識別功能進行的100組戰(zhàn)術手勢語言組合進行的測試結果。在對分為五組的100組戰(zhàn)術手勢語言組合進行測試后,通過數學方法對得出的結果進行平均值、方差、極值、識別率等方面的計算并進行分析。
6.3 測試結果分析
通過上一節(jié)中針對本文設計的基于MATLAB的戰(zhàn)術手勢識別功能進行的兩組測試,得出的結果分析如下:
(一)在識別時選取的手勢視頻的格式對整個手勢識別過程速率影響較大。通常通過手機、相機等數碼設備拍攝獲得的手勢視頻分辨率較高、體積也較大,對識別的速率會產生一定影響。故此,在實際運用時,可以通過蜂窩、格式工廠等相關視頻處理軟件對手勢視頻進行模糊化處理,也就是降低分辨率。
(二)視頻和圖片的方向不影響整體功能測試的完成,整體仍舊能夠保持較好的識別速度和效率。故此在拍攝手勢視頻和手勢圖片時,不需要考慮方向因素,但是本文設計所使用的視頻、圖片皆是以二維平面的形式加以使用,所以在實際拍攝時需要考慮手的空間角度。
(三)在對基于MATLAB的戰(zhàn)術手勢識別功能進行的100組戰(zhàn)術手勢語言組合進行的測試結中,平均的識別時間為0.76秒,該時間較短,說明整體功能實現和運行較為良好,能夠較高效率的實現手勢視頻的處理和識別過程;
(四)在對基于MATLAB的戰(zhàn)術手勢識別功能進行的100組戰(zhàn)術手勢語言組合進行的測試結中,識別時間極大值為1.41秒,極小值為0.56秒,極差為0.85秒,方差為0.031。同時,通過97組有效測試數組的測試時間分布圖綜合來看,識別時間的極大值和極小值差值較大,整體的波動明顯。
(五)在對基于MATLAB的戰(zhàn)術手勢識別功能進行的100組戰(zhàn)術手勢語言組合進行的測試結中,數字8、10、7、5、3為高頻錯誤手勢,尤其數字8、10有較大的錯誤率。結合這五組數字對應的手勢進行分析,7、8、3數字手勢形態(tài)相近,特征上具有共同點,在識別過程中容易產生混淆,10、5數字手勢作為源手勢,是其他數字手勢通過變形產生手勢的基礎手勢,廣義性比較強,在識別過程中容易出現錯誤。
(六)綜合兩輪測試結果,基于MATLAB的戰(zhàn)術手勢識別整體識別正確率較高,識別時間較短,基本實現了預期目標。
第七章 總結與展望
7.1 總結
隨著現代技術的發(fā)展,各種無線、有線通信聯絡方式飛速發(fā)展,有效保障了分隊行動中的良好通信聯絡。但是,戰(zhàn)場環(huán)境的多變導致依靠無線電波等技術的通信聯絡具有較高的不確定性,其受地形、天氣等要素的影響較多,同時也易遭到敵方勢力的電子對抗打擊從而降低甚至破壞我方通信聯絡效能。故此,作為分隊行動中的戰(zhàn)術手勢通信不可或缺。
總結全文,個人設計主要完成的工作如下:
(一)基于圖像處理和手勢識別的功能分析,建立了戰(zhàn)術手語庫,以十個數字為基準賦予文字意義,并以每三個手勢動作為一組進行定義,形成了完整的手勢語言。
(二)研究并掌握了MATLAB的圖像處理和手勢識別并通過學習代碼、查詢書籍、練習輸入代碼、上機實踐操作等過程深入了解了代碼的編寫和運用。并通過實際設計運用,選用了相應的圖像處理方法和BP神經網絡識別方法,實現了對手勢圖像的處理和識別。
(三)通過對GUI用戶使用界面的研究和掌握,設計了基于MATLAB的戰(zhàn)術手勢識別功能的設計與實現的用戶使用模塊。并通過代碼的嵌入,完成了整體功能的實現。
7.2 展望
通過此次畢業(yè)論文的選題、撰寫以及整個畢業(yè)設計的完成,我從其中受益匪淺。在前期的選題過程中了解到,當前部隊尤其是特戰(zhàn)作戰(zhàn)小隊在執(zhí)行解救人質、捕殲暴恐分子等任務時,需要確保良好的通信聯絡。否則低劣的通信質量在實戰(zhàn)中將導致分隊無法及時得到上級行動命令、失去對戰(zhàn)場情況的把控,指揮部無法及時了解作戰(zhàn)情況,導致行動指揮失控,最終導致丟失戰(zhàn)場控制權,進而完全喪失戰(zhàn)斗力。故此,為便于官兵在訓練中加強對手語的記憶掌握,根據不同的戰(zhàn)術背景不同的手語需要,針對特戰(zhàn)小隊在實際任務中可以運用到的手語聯絡方式進行設計研究,通過自擬暗語,完成了基于MATLAB的戰(zhàn)術手語的識別功能的設計與實現。在學習MATLAB的圖像處理和圖像識別過程中,遇到復雜的代碼、難以理解的概念時,通過導師和身邊戰(zhàn)友的幫助指導,使得我能夠順利實現MATLAB的編程操作。在學習GUI用戶使用界面的過程中,實現了對基本控件的熟悉到整體框架的設計,最后實現的過程,達到了從不會到實現的預期目標。
但是,由于個人能力的局限性,在前期設計路線的制定上出現誤區(qū)后未及時修正等問題,雖然在功能的設計以及論文撰寫方面花了非常多的精力,但后期不得不放棄原先的一些想法,同時系統也難免出現一些漏洞或者錯誤,使得整體設計效果并不十分緊貼實戰(zhàn),利于實戰(zhàn)。
本人深知系統軟件的設計與開發(fā)并不是一朝一夕就能夠做到完美無瑕,只有通過不斷的創(chuàng)新與基礎知識的學習,拓展更多的功能模塊,提高功能的完整性,逐步提高系統的可操作性,實現對系統的進一步優(yōu)化,也才更能夠被廣大基層單位認可并采用。
在下一步,我總結還有以下幾點需要繼續(xù)完善的方面:
一是提升整體設計的實戰(zhàn)性,在本文的設計中,我采用的是讀取事先錄制好的視頻進行的處理和識別,而后進行的教學使用,但在實際運用中,該方法無法做到真正的高效率以及生動性。在下步的設計中,應該將讀取視頻改制為攝像頭自動捕捉手勢,而后自動進行處理識別,這樣使得整體設計更為方便、高效率,并且在必要時,能夠投入實戰(zhàn)進行使用;
二是在圖像的處理部分回避了手勢背景的問題,同樣的,無論是用于教學的手勢學習還是用于實戰(zhàn)的手語聯絡,在實際運用中往往無法保證背景的單一性,故此應該針對所使用的手勢圖像進行背景的處理,從而更加適合于實際運用;
三是手勢圖像的訓練圖庫數量較少,在本文設計的測試中可以看出,訓練手勢圖像的數量不足會導致訓練結果的不準確從而導致最終無法識別。針對該問題,應該從各個年齡段、各類人群進行手勢圖像的獲取從而有效地擴大手勢訓練數量,從而確保識別的準確度和效率;
四是GUI用戶使用界面的設計較為簡單,總體的布局設計比較粗糙,可以適當添加教學使用過程中的正誤判斷、自我測試等功能設計。
附 錄
附錄一 功能完整設計與實現代碼
% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
load('net.mat');%數據初始化
load('class_name.mat');
sound_dir = 'E:\基于MATLAB的戰(zhàn)術手勢識別功能的設計與實現\任務\匹配結果數據';
sound_list = dir([sound_dir,'\*.mp3']);
strvalue = {'前方發(fā)現敵人,所有人散開','前方敵人弱火力點,進行兩側攻擊','發(fā)現敵人重火力點,迅速趴下','所有人散開,至前方集合','報告!搜索發(fā)現強火力點','敵人已消滅,前方展開搜索'};
re_mat= [123,176,285,914,428,3110];
regc = 0;
Image{1}=getimage(handles.axes1);%圖像存入數組
Image{2}=getimage(handles.axes2);
Image{3}=getimage(handles.axes3);
for index=1:3
im =Image{index};%索引數組
fetuer_arr = Shape(im,0);
fetuer_arr = fetuer_arr';
fetuer_arr(1,:) =(fetuer_arr(1,:)-1)/(4-1);%%特征歸一化
fetuer_arr(2,:) =(fetuer_arr(2,:)-10)/(100-10);%%特征歸一化
fetuer_arr(3,:) =(fetuer_arr(3,:)-1)/(4-1);%%特征歸一化
[result] = net(fetuer_arr);
[va,ind] = max(result);
ind = str2double(class_name{ind});
if(ind~=20)
regc = ind+regc*10;
else
regc = regc*100+ind;
end
end
[flag,memindex] = ismember(regc,re_mat);
if flag
%fprintf('識別手勢為:%d\n',regc);
value = strvalue(memindex);
set(handles.edit1,'string',value)%設置顯示結果
sound_file_name = [sound_dir,'/',sound_list(memindex).name];
[y, Fs] = audioread(sound_file_name);
sound(y,Fs);
end
% --- Executes on button press in pushbutton5.
function pushbutton5_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton5 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
axes(handles.axes1);%清空圖像
cla
axes(handles.axes2);
cla
axes(handles.axes3);
cla
axes(handles.axes4);
cla
set(handles.edit1,'string','');%清空結果
% --- Executes on button press in pushbutton6.
function pushbutton6_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton6 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[filename,pathname]=uigetfile({'*.*'},'選擇視頻');
video = [pathname,filename];
obj = VideoReader(video); %讀取視頻文件
numFrames = obj.NumberOfFrames; %視頻總的幀數
for y = 1: numFrames
frame = read(obj,y);
set(handles.axes4,'HandleVisibility','ON');%打開坐標,方便操作
axes(handles.axes4);%%使用圖像,操作在坐標1
imshow(frame); %顯示每一幀圖片
end
for t = 1: numFrames
if 5*t<numFrames
frame = read(obj,5*t);%隔5張保存一張圖象
I=frame;
%保存每一幀圖片
imwrite(I,strcat('E:\基于MATLAB的戰(zhàn)術手勢識別功能的設計與實現\任務\匹配結果數據\分解圖像\',num2str(t),'.jpg'),'jpg');
end
end
% msgbox('分解完成','結果');
tic;
load('net.mat');%數據初始化
load('class_name.mat');
sound_dir = 'E:\基于MATLAB的戰(zhàn)術手勢識別功能的設計與實現\任務\匹配結果數據';
sound_list = dir([sound_dir,'\*.mp3']);
strvalue = {'前方發(fā)現敵人,所有人散開','前方敵人弱火力點,進行兩側攻擊','發(fā)現敵人重火力點,迅速趴下','所有人散開,至前方集合','報告!搜索發(fā)現強火力點','敵人已消滅,前方展開搜索'};
re_mat= [123,176,285,914,428,3110];
regc = 0;
sumnum = fix(numFrames/5);%計算保存圖像數量
sumnum1 = fix(sumnum/3);
for i = 1
imageindex1 = (2*i-1)*sumnum1/2;%定位標簽
imageindex2 = (2*(i+1)-1)*sumnum1/2;
imageindex3 = (2*(i+2)-1)*sumnum1/2;
end
Image{1}=imread(['E:\基于MATLAB的戰(zhàn)術手勢識別功能的設計與實現\任務\匹配結果數據\分解圖像\',num2str(imageindex1),'.jpg']);%圖像存入數組
Image{2}=imread(['E:\基于MATLAB的戰(zhàn)術手勢識別功能的設計與實現\任務\匹配結果數據\分解圖像\',num2str(imageindex2),'.jpg'])
Image{3}=imread(['E:\基于MATLAB的戰(zhàn)術手勢識別功能的設計與實現\任務\匹配結果數據\分解圖像\',num2str(imageindex3),'.jpg'])
set(handles.axes1,'HandleVisibility','ON');%打開坐標,方便操作
axes(handles.axes1);%%使用圖像,操作在坐標1
imshow(Image{1}); %顯示每一幀圖片
set(handles.axes2,'HandleVisibility','ON');%打開坐標,方便操作
axes(handles.axes2);%%使用圖像,操作在坐標1
imshow(Image{2}); %顯示每一幀圖片
set(handles.axes3,'HandleVisibility','ON');%打開坐標,方便操作
axes(handles.axes3);%%使用圖像,操作在坐標1
imshow(Image{3}); %顯示每一幀圖片
% Image{1}=imread(['E:\基于MATLAB的戰(zhàn)術手勢識別功能的設計與實現\任務\匹配結果數據\分解圖像\',num2str(imageindex1),'.jpg']);%圖像存入數組
% Image{2}=imread(['E:\基于MATLAB的戰(zhàn)術手勢識別功能的設計與實現\任務\匹配結果數據\分解圖像\',num2str(imageindex2),'.jpg'])
% Image{3}=imread(['E:\基于MATLAB的戰(zhàn)術手勢識別功能的設計與實現\任務\匹配結果數據\分解圖像\',num2str(imageindex3),'.jpg'])
for index=1:3
im =Image{index};%索引數組
fetuer_arr = Shape(im,0);
fetuer_arr = fetuer_arr';
fetuer_arr(1,:) =(fetuer_arr(1,:)-1)/(4-1);%%特征歸一化
fetuer_arr(2,:) =(fetuer_arr(2,:)-10)/(100-10);%%特征歸一化
fetuer_arr(3,:) =(fetuer_arr(3,:)-1)/(4-1);%%特征歸一化
[result] = net(fetuer_arr);
[va,ind] = max(result);
ind = str2double(class_name{ind});
if(ind~=20)
regc = ind+regc*10;
else
regc = regc*100+ind;
end
end
[flag,memindex] = ismember(regc,re_mat);
if flag
%fprintf('識別手勢為:%d\n',regc);
value = strvalue(memindex);%文字結果
set(handles.edit1,'string',value)%設置顯示結果
sound_file_name = [sound_dir,'/',sound_list(memindex).name];
[y, Fs] = audioread(sound_file_name);
sound(y,Fs);
end
toc;
msgbox('識別完成','結果');
附錄二 手勢圖像訓練代碼
clear all;
close all;
fulldirname = 'E:\基于MATLAB的戰(zhàn)術手勢識別功能的設計與實現\任務\匹配結果數據\訓練圖像';
fullfile = dir(fulldirname);
fetuer_arr = [];
target = [];
class_name = [];
sum = numel(fullfile);
%%一下代碼是遍歷文件夾的圖像,并提取特征,合成特征矩陣
for fileindex=3:numel(fullfile)
if(fullfile(fileindex).isdir&&~isempty(fullfile(fileindex).name))
dirname = [fulldirname,'/',fullfile(fileindex).name];
class_name{end+1} = fullfile(fileindex).name;
filestr = dir([dirname,'/*.jpg']); %%查找目錄的jpg圖像
temp = zeros(numel(filestr),numel(fullfile)-2);
temp(:,fileindex-2) = ones(size(temp(:,fileindex-2)));
target = [target;temp];
for index=1:numel(filestr)
filename = [dirname,'/',filestr(index).name];%%圖像文件名
im = imread(filename);%%讀取圖像
fetuer_arr = [fetuer_arr;Shape(im,0)];%%提取特征
end
end
end
%%一下代碼主要是為了將提取的特征分為訓練樣本和測試樣本
% trainstartIndex = 1:20:(numel(fullfile)-2)*20;%%利用每個文件夾的前15個圖像訓練,訓練樣本對應的開始坐標
% trainendIndex = 15:20:(numel(fullfile)-2)*20;%%馴良樣本對一個的結束坐標
% trainIndex = [];
% for index=1:numel(trainstartIndex)
% trainIndex = [trainIndex,trainstartIndex(index):trainendIndex(index)];
% end
% testIndx = setdiff(1:20*(numel(fullfile)-2),trainIndex);
fetuer_arr = fetuer_arr';
target = target';
fetuer_arr(1,:) =(fetuer_arr(1,:)-1)/(4-1);%%特征歸一化
fetuer_arr(2,:) =(fetuer_arr(2,:)-10)/(100-10);%%特征歸一化
fetuer_arr(3,:) =(fetuer_arr(3,:)-1)/(4-1);%%特征歸一化
% trainset= fetuer_arr(:,trainIndex);%%用于訓練的特征樣本
% traintaget = target(:,trainIndex);%%用于訓練的目標標簽
% testset = fetuer_arr(:,testIndx);%%用于測試的特征樣本
% testtarget = target(:,testIndx);%%用于測試的目標標簽
% save('trainset.mat','trainset');%保存變量
% save('testset.mat','testset');%保存變量
% save('testtarget.mat','testtarget');%保存變量
% save('traintaget.mat','traintaget');%保存變量
net = patternnet(10);%構建神經網絡
net = train(net,fetuer_arr,target);%訓練網絡
save('net.mat','net');
% testresult = sim(net,testset);%利用網絡測試數據集合
% for index=1:size(testresult,2)
% [ma result] = max(testresult(:,index));
% [ma corecet] = max(testtarget(:,index));
% fprintf('測試樣本%d,所屬類別%d:,分類類別:%d: )\n',index,corecet,result);
% end
附錄三 手勢圖像處理代碼
%%提取圖片的形狀特征
function feature = Shape(Image,istrain)
% Gray = rgb2gray(Image);%%轉換為灰度圖形
% hsv = rgb2hsv(Image);%%將rgb顏色空間轉換為hsvyanse空間
% h = hsv(:,:,1);%%hsv顏色空間h通道
% s = hsv(:,:,2);
% v = hsv(:,:,3);
% BW = (h>0.14&s>0.17&h<0.565)|(h<0.15&s>0.3&v<0.56);%%選取圖像中綠色區(qū)域,作為二值化結果
% th = graythresh(Gray);
% BW = im2bw(Gray,th);
% figure;
hsv = rgb2hsv(Image);
map = hsv(:,:,1)<0.09&hsv(:,:,2)>0.15;
map = imfill(map,'holes');
lab = bwlabel(map);
reg = regionprops(lab,'Area');
area = [reg.Area];
[va,maindex] = max(area);
BW2 = lab==maindex;
% th = graythresh(Gray);
% BW = im2bw(Gray,th);
% BW = 1-BW;
% BW2= imfill(BW,'holes');%%填充二值圖像中的空洞
if(istrain)
subplot(1,2,1);imshow(hsv);title('hsv顏色空間');
% subplot(2,2,2);imshow(BW);title('根據顏色空間二值化圖像');
subplot(1,2,2);imshow(BW2);title('空洞填充后圖像');
end
regionprops(BW2);
imLabel = bwlabel(BW2); %對各連通域進行標記
stats = regionprops(imLabel,'Area','BoundingBox','Perimeter','MajorAxisLength','MinorAxisLength'); %求各連通域的大小
area = cat(1,stats.Area);
index = find(area == max(area)); %求最大連通域的索引 ,作為葉片區(qū)域
S = stats(index).Area;%計算葉片面積
Perimeter = stats(index).Perimeter;%計算葉片周長
BoundingBox = stats(index).BoundingBox;%%計算最小外接矩形
X = BoundingBox(3);%%外接矩形的長
Y = BoundingBox(4);%%外接矩形的寬
Rectangularity = X*Y/S;%%計算矩形度
Circularity = Perimeter^2/S;%%計算圓形度
Ecc = stats(index).MajorAxisLength/stats(index).MinorAxisLength;%%計算偏心率
BW =zeros(size(BW2));
BW(imLabel==index)=1;
if(istrain)
subplot(2,2,4);imshow(BW);title('葉片區(qū)域提取結果');
end
% figure;imshow(BW);
[M,N] = size(BW);
%%一下代碼計算7個不變矩
%--------------------------------------------------------------------------
%計算圖像質心:(I,J)
%--------------------------------------------------------------------------
m00 = sum(sum(BW)); %零階矩
m01 = 0; %一階矩
m10 = 0; %一階矩
for i = 1:M
for j = 1:N
m01 = BW(i,j)*j+m01;
m10 = BW(i,j)*i+m10;
end
end
I = (m10)/(m00);
J = m01/m00;
%--------------------------------------------------------------------------
%中心矩:
%--------------------------------------------------------------------------
u11 = 0;
u20 = 0; u02 = 0;
u30 = 0; u03 = 0;
u12 = 0; u21 = 0;
for i = 1:M
for j = 1:N
u20 = BW(i,j)*(i-I)^2+u20;
u02 = BW(i,j)*(j-J)^2+u02;
u11 = BW(i,j)*(i-I)*(j-J)+u11;
u30 = BW(i,j)*(i-I)^3+u30;
u03 = BW(i,j)*(j-J)^3+u03;
u12 = BW(i,j)*(i-I)*(j-J)^2+u12;
u21 = BW(i,j)*(i-I)^2*(j-J)+u21;
end
end
u20 = u20/m00^2;
u02 = u02/m00^2;
u11 = u11/m00^2;
u30 = u30/m00^(5/2);
u03 = u03/m00^(5/2);
u12 = u12/m00^(5/2);
u21 = u21/m00^(5/2);
%--------------------------------------------------------------------------
%7個Hu不變矩:
%--------------------------------------------------------------------------
n(1) = u20+u02;
n(2) = (u20-u02)^2+4*u11^2;
n(3) = (u30-3*u12)^2+(u03-3*u21)^2;
n(4) = (u30+u12)^2+(u03+u21)^2;
n(5) = (u30-3*u12)*(u30+u12)*((u30+u12)^2-3*(u03-3*u21)^2)+(u03-3*u21)*(u03+u21)*((u03+u21)^2-3*(u30+u12)^2);
n(6) = (u20-u02)*((u30+u12)^2-(u03+u21)^2)+4*u11*(u30+u12)*(u03+u21);
n(7) = (3*u21-u03)*(u30+u12)*((u30+u12)^2-3*(u03-3*u21)^2)+(u30-3*u21)*(u03+u21)*((u03+u21)^2-3*(u30+u12)^2);
feature = [Rectangularity,Circularity,Ecc,n];%%將計算的所有特征連接起來作為形狀特征
參考文獻
總結
以上是生活随笔為你收集整理的基于MATLAB的战术手势识别功能的设计与实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 20155202《网络对抗》Exp9 w
- 下一篇: ajax无刷新评论的思路,ajax学习—