首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于iOS加速度计的手势识别

基于iOS加速度计的手势识别
EN

Stack Overflow用户
提问于 2013-05-13 18:39:33
回答 1查看 2.8K关注 0票数 1

我想创建一个项目,读取用户的手势(基于加速度计)并识别它,我搜索了很多,但我发现太老了,我在分类和识别方面都没有问题,我会使用1美元识别器或嗯,我只想知道如何使用加速度计读取用户的手势。

加速计数据(x,y,z值)是否足够,或者我是否应该使用其他数据,如姿态数据(滚动,俯仰,偏航),陀螺数据或震级数据,我甚至不理解他们中的任何一个,所以解释这些传感器做什么将是有用的。

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-17 17:36:10

最后我做到了,我使用了userAcceleration data ,这是由于设备不包括重力而导致的设备加速,我发现很多人使用正常的加速度数据,并做了很多数学运算来消除重力,现在iOS 6已经在userAcceleration中完成了这项工作。

我使用了1$识别器,这是一个2D识别器(即point(5,10),no Z)。

这里有一个1$ recognizer的链接,在下载部分有它的c++版本。

以下是我的代码的步骤...

  1. 读取频率为50 HZ的userAcceleration数据。
  2. 对其应用低通滤波器。
  3. 仅在x或y值大于0.05时才考虑该点,以降低噪声。

(注意:下一步取决于您的代码和使用的识别器)。

  • 将x和y点保存到array.

  • Create中此数组中的2D路径。

  • 将此路径发送到识别器,以便对其进行天气训练或重新匹配。

这是我的代码。

代码语言:javascript
运行
复制
@implementation MainViewController {
    double previousLowPassFilteredAccelerationX;
double previousLowPassFilteredAccelerationY;
double previousLowPassFilteredAccelerationZ;

    CGPoint position;
    int numOfTrainedGestures;
    GeometricRecognizer recognizer;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

    previousLowPassFilteredAccelerationX = previousLowPassFilteredAccelerationY = previousLowPassFilteredAccelerationZ = 0.0;

    recognizer = GeometricRecognizer();

    //Note: I let the user train his own gestures, so i start up each time with 0 gestures
    numOfTrainedGestures = 0;
}

#define kLowPassFilteringFactor 0.1
#define MOVEMENT_HZ 50
#define NOISE_REDUCTION 0.05

- (IBAction)StartAccelerometer
{
    CMMotionManager *motionManager = [CMMotionManager SharedMotionManager];
    if ([motionManager isDeviceMotionAvailable])
    {
        [motionManager setDeviceMotionUpdateInterval:1.0/MOVEMENT_HZ];
        [motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue]
                                       withHandler: ^(CMDeviceMotion *motion, NSError *error)
         {
             CMAcceleration lowpassFilterAcceleration, userAcceleration = motion.userAcceleration;

             lowpassFilterAcceleration.x = (userAcceleration.x * kLowPassFilteringFactor) + (previousLowPassFilteredAccelerationX * (1.0 - kLowPassFilteringFactor));
             lowpassFilterAcceleration.y = (userAcceleration.y * kLowPassFilteringFactor) + (previousLowPassFilteredAccelerationY * (1.0 - kLowPassFilteringFactor));
             lowpassFilterAcceleration.z = (userAcceleration.z * kLowPassFilteringFactor) + (previousLowPassFilteredAccelerationZ * (1.0 - kLowPassFilteringFactor));

             if (lowpassFilterAcceleration.x > NOISE_REDUCTION || lowpassFilterAcceleration.y > NOISE_REDUCTION)
                 [self.points addObject:[NSString stringWithFormat:@"%.2f,%.2f", lowpassFilterAcceleration.x, lowpassFilterAcceleration.y]];

             previousLowPassFilteredAccelerationX = lowpassFilterAcceleration.x;
             previousLowPassFilteredAccelerationY = lowpassFilterAcceleration.y;
             previousLowPassFilteredAccelerationZ = lowpassFilterAcceleration.z;


             // Just viewing the points to the user
             self.XLabel.text = [NSString stringWithFormat:@"X : %.2f", lowpassFilterAcceleration.x];
             self.YLabel.text = [NSString stringWithFormat:@"Y : %.2f", lowpassFilterAcceleration.y];
             self.ZLabel.text = [NSString stringWithFormat:@"Z : %.2f", lowpassFilterAcceleration.z];
         }];
    }
    else NSLog(@"DeviceMotion is not available");
}


- (IBAction)StopAccelerometer
{
    [[CMMotionManager SharedMotionManager] stopDeviceMotionUpdates];

    // View all the points to the user
    self.pointsTextView.text = [NSString stringWithFormat:@"%d\n\n%@", self.points.count, [self.points componentsJoinedByString:@"\n"]];

    // There must be more that 2 trained gestures because in recognizing, it gets the closest one in distance
    if (numOfTrainedGestures > 1) {
        Path2D path = [self createPathFromPoints]; // A method to create a 2D path from pointsArray
        if (path.size()) {
            RecognitionResult recongnitionResult = recognizer.recognize(path);
            self.recognitionLabel.text = [NSString stringWithFormat:@"%s Detected with Prob %.2f !", recongnitionResult.name.c_str(),
                                      recongnitionResult.score];
        } else self.recognitionLabel.text = @"Not enough points for gesture !";
    }
    else self.recognitionLabel.text = @"Not enough templates !";

    [self releaseAllVariables];
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16520081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档