前言:
百度的手勢識別目前能做到21種手勢的識別夭委,以及能做到手部關(guān)鍵點識別(手部關(guān)鍵關(guān)節(jié)點的位置坐標)杆麸。
但是目前百度手勢識別的輸入只能是圖片文件旷赖,或者是圖片的byte數(shù)據(jù)辅髓。
百度官方手勢識別文檔:
https://cloud.baidu.com/doc/BODY/s/4k3cpywrv
https://cloud.baidu.com/doc/BODY/s/Kk3cpyxeu
要實現(xiàn)隔空手勢泣崩,必須做到基于視頻流識別手勢,并轉(zhuǎn)換成Android系統(tǒng)的觸屏手勢操作洛口,如左滑矫付,右滑,放大第焰,縮小等买优。
本文基于baidu 手勢識別的API 實現(xiàn)了左滑,右滑的手勢挺举。其他的手勢原理是一樣的杀赢,可以自己設(shè)計算法開發(fā)。
接入百度sdk
- 首先需要注冊百度云賬號:https://cloud.baidu.com/product/body/gesture
-
創(chuàng)建一個新應(yīng)用湘纵,名字隨便寫可以不和實際項目的名字對應(yīng)葵陵。
創(chuàng)建完成后,在應(yīng)用列表可以看到生成的應(yīng)用信息瞻佛,這里面的三個參數(shù)Appid, API key, Secret Key需要保存下來脱篙,之后的app接入sdk開發(fā)時會用到
3.下載sdk
手勢檢測demo
筆者的需求是基于攝像頭的視頻流檢測手勢,而百度手勢識別sdk的輸入只能是圖片文件或者是圖片的byte數(shù)據(jù)伤柄。輸出是手的坐標點或手勢的名稱绊困,所以這里面臨著兩個問題。
1.如何將視頻流數(shù)據(jù)轉(zhuǎn)換成圖片二進制流适刀,然后調(diào)用百度的云AI 完成手勢檢測
2.如何根據(jù)坐標點轉(zhuǎn)換成手勢
第一個問題很好解決秤朗,主要是截取攝像頭幀數(shù)據(jù),然后轉(zhuǎn)換層圖片的byte數(shù)據(jù)笔喉。核心代碼如下:
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
Bitmap bp = textureView.getBitmap();
bp = Bitmap.createBitmap(bp, 0, 0, bp.getWidth(), bp.getHeight(), textureView.getTransform(null), true);
if (System.currentTimeMillis() - lastTime > 1000) {
CameraThread cameraThread = new CameraThread(bp);
cameraThread.start();
lastTime = System.currentTimeMillis();
}
}
這里是將Texture的視頻流數(shù)據(jù)轉(zhuǎn)換成bitmap, 然后開啟一個線程將bitmap壓縮成jpg格式的圖片數(shù)據(jù)
對于第二個問題取视,我這邊采取的算法是:
取視頻流前后2幀的數(shù)據(jù)(間隔1秒,baidu的API有調(diào)用的時間間隔限制)常挚,發(fā)送給baidu API進行手勢識別作谭,根據(jù)手勢識別的結(jié)果,取相同的一個關(guān)節(jié)坐標點(這里我取的是下圖中0點的坐標奄毡,即手腕的中心點折欠。),第一幀的數(shù)據(jù)為初始點坐標,第二幀的數(shù)據(jù)為終點坐標锐秦,然后根據(jù)手勢中同一坐標點的變化來判斷左移還是右移咪奖。
Demo效果:
Demo 地址:
https://download.csdn.net/download/wxkly2020/20815557