陸欣欣,李曉欣
(賀州學院人工智能學院,賀州 542899)
隨著互聯網體系的成熟,物聯網技術已經逐漸被廣泛應用到各個領域。在日常生活中,手機已經成為人們生活中不可或缺的一部分。人們除了將手機用來通訊之外,還更多的是將它作為生活娛樂的重要工具。現在的人們越來越喜歡在社交平臺上分享自己的自拍視頻來記錄自己的美好生活,但是在拍攝過程當中或多或少會出現一些拍攝的問題,比如需要他人幫忙,或是需要人為的控制拍攝的方向等等,都不能達到智能的效果。如果手機在視頻拍攝過程當中可以檢測出人臉,并且可以跟隨人臉的位置移動而移動,這樣就可以使拍攝效果更加的智能化,人們的拍攝效果和體驗感更佳。
本設計由2部分組成,Android手機視頻采集端以及由STM32單片機、藍牙模塊、2個舵機模塊以及放置手機的支架組成的硬件端。整個系統的流程是:Android手機在實時視頻采集過程中檢測出單人臉,根據人臉位置通過藍牙技術將不同的指令發送到硬件端,硬件端通過藍牙模塊接收指令后,經STM32模塊處理后驅動舵機的做出相應的轉動,手機放置在舵機的支架上,從而可以實現對手機的控制,最終達到智能實時視頻采集的效果。整體設計如圖1所示。

圖1 系統的整體框架
Android手機視頻采集端最終要實現的是一個手機APP,采用的開發的語言以及開發工具分別是JAVA和Android Studio。Android Studio提供了集成的Android開發工具,對于編寫手機軟件的PC端程序來說,在其提供的工具下,能夠快速的建立Android開發環境,以及程序的實時調試,開發過程中開發者可以利用模擬器進行調試,也可以用手機連接電腦,直接進行調試。
Android手機視頻采集端主要實現的功能是先與硬件端的藍牙模塊連接,然后在實時視頻采集過程中檢測出每幀視頻的人臉位置信息,最后再根據人臉位置信息給硬件端發送不同的控制指令。
Android手機視頻采集端與硬件端的通信需要通過藍牙技術來實現,所以手機在實時視頻采集前需要與硬件端的藍牙模塊連接。連接的過程是:①要想手機使用藍牙功能,首先需要先添加藍牙權限。②藍牙的初始化設置。利用管理者對象調用getAdapter()方法檢查當前手機是否支持藍牙,并將藍牙狀態設置為打開狀態,如圖2所示。③搜索設備,調用BluetoothAdapter類中的startLeScan()方法來搜索硬件端的藍牙模塊,通過回調函數LeScanCallback()獲得藍牙設備的設備名稱和MAC地址,如圖3所示。④實現藍牙的連接,連接之前先獲取目標藍牙設備BluetoothDevice對象,調用connectGatt()方法進行連接,并將BluetoothGattCallback作為connect?Gatt方法的參數,然后最這些參數status進行分析,如果status為GATT_SUCCESS時表明藍牙連接成功。如圖4所示。

圖2 藍牙開啟

圖3 藍牙搜索

圖4 藍牙連接
要想實現智能實時視頻采集,在實時視頻采集過程中獲取到每一幀視頻的人臉位置信息非常關鍵。實現的過程是:①在設計實時視頻采集界面的時候用兩個View進行疊加,底層的View用來實現實時視頻采集,頂層的View用來繪制人臉框,并默認設置為透明狀態。②打開手機攝像頭,獲取CameraDevice的mCameraDe?vice對象,利用mCameraDevice對象調用create?CaptureRequest()方法實現視頻預覽和監聽每一幀視頻數據。③利用回調方法CameraCapture?Session.CaptureCallback()獲取每幀視頻的人臉的模式以及人臉的Face[]數據。④在頂層View通過畫布和畫筆將人臉框繪制出來。
在人臉檢測過程中繪制人臉框的時候要特別注意,因為屏幕看到的人臉位置和實際測出的人臉位置信息不匹配。主要的原因是Android默認坐標系和視圖坐標系不同,默認坐標系的原點在手機屏幕左上角,而視圖坐標系是相對默認坐標系而言,需要通過一定的方法來獲取控件相對默認坐標系的位置。人臉位置信息的采集是在默認坐標系的基礎上進行的,而人臉框的繪制是以視圖坐標系為基準的,所以為了可以使檢測出來的人臉位置和在屏幕上看到的人臉位置一樣,需要將檢測出的人臉位置信息進行一定的轉換。在轉換的之前又需要先區分是手機前置攝像頭還是后置攝像頭,因為兩者的轉換方法有區別,如果是前置攝像頭,需要先將獲取到的人臉位置信息在水平方向左右轉換,再旋轉90°,如果是后置攝像頭,只需旋轉90°。最后再將轉換后的人臉信息根據視圖坐標系繪制在頂層的View即可。還需要注意的是,在繪制新的一幀視頻人臉位置信息時需要重新刷新一下頂層的View。圖5和圖6分別是2種情況下在實時視頻采集時采集到的單人臉位置結果。

圖5 前置攝像頭單人臉檢測

圖6 后置攝像頭單人臉檢測
手機在實時視頻采集過程中檢測到每一幀視頻人臉位置信息后,還需要將人臉位置信息通過藍牙技術發到給硬件端。但是因為檢測到的人臉信息是一個矩形數據,如果要將所有的數據都發送給硬件端,那么無論是在手機發送和還是硬件接收的過程中要處理的數據都太復雜。所以為了方便,只取矩形的中點作為人臉位置信息,根據與上一幀人臉位置中點信息的不同,給硬件端發送上下左右不同的控制指令。
硬件端主要由一個微型STM32單片機、一個藍牙模塊、2個舵機、電源和一個手機支架構成,主要實現的功能是通過藍牙模塊來接收手機發送的控制指令,轉交給STM32處理后驅動舵機的轉動,手機放置在手機支架上,從而達到實現智能實時視頻采集的效果。
硬件部分的主控芯片采用的是STM32F103C 8T6,它是基于高性能ARM?CortexTM-M3的32位RISC內核處理器,芯片主頻高達72 MHz,擁有I2C,SPI,PWM等總線接口。
因為只需要接收手機控制端發出的指令,所以藍牙模塊采用的是BT05從模塊。它引出的端口包括VCC、GND、TXD、RXD以及預留LED狀態輸出引腳。它的輸出電壓為3.6~6 V,在空曠的地方有效距離可超過10 m。藍牙模塊中的TXD為發送端,需與STM32的RDX端連接,RDX為接收端,需與STM32的TXD端連接。
因為手機在實時視頻采集過程中需要根據人臉位置移動而移動,所以需要用舵機來實現。舵機模塊采用的是MG995,本設計其工作的時候使用的電壓為5 V,需要旋轉的角度在0~180之間。舵機上有三根線,分別為電源、接地和信號線。
電源模塊主要是為STM32單片機和藍牙模塊供電,本系統設計采用的電源模塊為可充電電池,可以方便實現對STM32單片機3.3 V以及藍牙模塊5 V的穩壓供電。
硬件端的主控芯片是STM32單片機,程序設計的過程主要包含定時器的初始化,串口的初始化以及主程序的實現。
3.2.1 定時器的初始化
(1)打開TIM4的時鐘。因為設計需要控制2個舵機上下左右的轉動,所以需要用到定時器的兩個輸出通道CH1和CH2,并將對應的引腳PB6和PB7設置為復用功能輸出。
(2)設置定時器的基本參數,主要是用來設置定時器的時鐘周期、預分頻器和定期器的計數模式。
(3)設置定時器輸出通道,主要是用來確定輸出波形的占空比和輸出比較極性。
(4)使用定時器,可以利用庫函數TIM_Cmd()來實現。
3.2.2 串口的初始化
(1)需要使能串口時鐘以及它相應的GPIO端口才能實現數據的輸入輸出。
(2)設置GPIO端口模式。
(3)設置串口參數。
(4)開啟中斷并且初始化NVIC。
(5)編寫中斷處理函數。
(6)實現串口數據收發。
(7)獲取串口傳輸的狀態。
3.2.3 主程序的實現
在主函數里面主要實現的是處理藍牙模塊收到的數據,并控制舵機的轉動,處理函數如下:


程序設計好后,首先將藍牙模塊上的RXD、TXD、VCC、GND引腳分別連接STM32上的串口2的PA2引腳、PA3引腳,3.3V引腳、GND引腳,兩個舵機的信號線分別連接STM32上的PB6、PB7引腳,剩下的兩根線分別接電源和地。然后通過MDK的方式將程序下載到STM32上。硬件部分效果如圖7所示。

圖7 硬件效果
啟動手機APP后,在手機實時視頻采集之前首先需要在藍牙界面搜索連接硬件端的藍牙模塊,如果連接成功,這個時候的藍牙模塊上的LED燈會由閃爍狀態變成一直亮著的狀態。藍牙成功后可以開始實時視頻采集,視頻采集過程中會檢測到每一幀視頻的人臉信息,手機根據人臉信息位置不同給硬件端發送不同的控制指令,從而可以實現對手機的前后左右的控制,達到智能實時視頻采集的效果。
本設計采用STM32最小系統為控制中心,結合藍牙模塊、舵機模塊等,在Android手機平臺上,利用藍牙傳輸技術,通過軟件編程的方式來實現智能實時視頻采集的效果,這為將來智能家居的遙控設計提供一定的參考意義。
將編譯的手機APP安裝成功以及硬件部分的主控芯片的程序下載好后,經過反復測試,可以在一定距離之內很好的實現手機在實時視頻采集時可以根據人臉位置的轉動而轉動,達到了預期的設想。
本控制系統采用人臉檢測+接收端信號轉化控制,這種方式采用的終端軟件具有易移植和通用性,市場的應用價值較高,便于推廣,本系統所需硬件系統符合國產化要求。