我正在尝试实现一个识别手势的小项目(类似于Google Soli),但将PIR热阵列传感器(Grid-Eye AMG8833)与Arduino结合使用。
热阵列以64个值的阵列形式返回传感器前面的8x8网格中的温度。
当以2D矩阵查看时,它看起来像这样:
20.00 20.00 20.50 21.00 20.75 20.50 21.25 21.25
20.00 19.25 20.25 20.75 20.50 20.50 20.75 20.75
20.00 20.25 20.75 21.00 21.00 20.75 21.25 21.00
19.75 20.25 20.50 21.00 20.75 21.00 21.00 20.75
20.00 20.25 20.75 21.00 20.50 20.75 20.75 21.00
20.25 20.50 20.50 20.75 20.50 20.50 21.00 21.00
20.75 20.00 20.50 20.25 20.50 20.75 20.75 21.25
20.25 20.25 20.50 20.75 21.25 20.50 21.00 21.00
现在,我正在做的是创建一个二进制2D数组,其中检测到手(基于高于特定阈值的温度)的网格像素为1,其余为0。
当手指放在传感器前面时,阵列看起来像这样:
(。)表示0,(o)表示1。或更具体地说,(。)表示未检测到手指/手的网格像素,(o)表示检测到手指的网格像素。
所以现在我的问题是找到在此二维二进制数组中识别手部动作/手势的最有效方法。
到目前为止,我已经成功实现了2种简单手势的识别-使用比较数组左半部分和右半部分总和的简单方法,从左向右和从右向左滑动手检测手势开始和手势结束。我在下面添加了一个代码段,该代码段显示了从左到右的识别方式。 (此代码在loop()函数中运行)
//SWIPE LEFT-TO-RIGHT GESTURE
if( left_sum > thresh && right_gesture_start != 1 && left_gesture_start != 1 ){
left_gesture_start = 1;
Serial.println("LEFT START");
} //Hand has moved onto the left part of the sensor -> gesture start
//thresh = 20. This value was decided after repeated testing to check what is the minimum no. of pixels that need to be filled to account for a gesture.
if(left_gesture_start == 1 && ((left_gesture_end == 0 && right_sum > thresh && left < thresh))){
left_gesture_end = 1;
}//Hand has moved from left part of the sensor to the right
if(left_gesture_end == 1 && right_sum < thresh){
Serial.println("LEFT TO RIGHT");
left_gesture_start = 0;
left_gesture_end = 0;
delay(500);
}//Hand has left the right part of the sensor -> gesture end
但是这种蛮力方法严重限制了我识别更复杂的手势。
还有其他方法/算法可用于检测2D二进制数组中的模式,这些模式/算法对我识别手势有用吗?