2013-02-11 103 views
-2

我必须制作一个应用程序,用户只有在iPhone尚未使用时才能拍照。您能否告诉我如何继续。任何帮助将不胜感激。如何检测iphone是否仍然?

以下是我已经尝试了代码,请推荐其上的改进,该代码是给干输出

  _previousMotionValue = 0.0f; 
      memset(xQueue, 0, sizeof(xQueue)); 
      memset(yQueue, 0, sizeof(yQueue)); 
      queueIndex = 0; 

      [_motionManager startAccelerometerUpdatesToQueue:_motionManagerUpdatesQueue withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) { 

       if ([_motionManagerUpdatesQueue operationCount] > 1) { 
        return; 
       } 

       xQueue[queueIndex] = -accelerometerData.acceleration.x; 
       yQueue[queueIndex] = accelerometerData.acceleration.y; 

       queueIndex++; 
       if (queueIndex >= QueueCapacity) { 
        queueIndex = 0; 
       } 

       float xSum = 0; 
       float ySum = 0; 

       int i = 0; 

       while (i < QueueCapacity) 
       { 
        xSum += xQueue[i]; 
        ySum += yQueue[i]; 
        i++; 
       } 

       ySum /= QueueCapacity; 
       xSum /= QueueCapacity; 

        double motionValue = sqrt(xSum * xSum + ySum * ySum); 
        CGFloat difference = 50000.0 * ABS(motionValue - _previousMotionValue); 
        if (difference < 100) 
        { 
         //fire event for capture 
        } 
        [view setVibrationLevel:difference]; 
        _previousMotionValue = motionValue; 

      }]; 

基于振动水平,我设置不同的图像如绿色,黄色,红色。 我选择的阈值100

回答

0

要回答“......用户可以拍照,只有当iPhone是稳定的......?”:

您可以使用CoreMotion.framework及其有关设备运动CMMotionManager获得信息。 (我想你对加速度计数据很感兴趣。)这些数据会以很高的速度出现(你可以选择频率,默认情况下为1/60秒)。然后你存储(比方说)10个最新值,并对平均值和差值进行一些统计。通过选择最佳阈值,您可以知道设备何时处于稳定位置。


但你提到防抖,这是不一样的稳定位置拍照。为了稳定图像,我想你必须通过从设备运动计算出来的一些小偏移量来调整捕捉的图像。

+0

我试过类似的逻辑,你可以在更新后的问题中发现,但它给出了生涩的输出。 – 2013-02-11 19:05:05

+1

尝试使用低通滤波器。其中一个包含在文档中的示例应用程序“AccelerometerGraph”中。当我们将它用于加速计数据时,它会更好,更顺畅。 – Tricertops 2013-02-11 19:48:12

+0

总是会有噪音影响运动传感器。你总是会得到少量的生涩运动。你必须找出你可以处理的门槛。 – Fogmeister 2013-02-11 20:23:01

相关问题