Android - 相机作为运动检测器

时间:2012-03-19 16:36:37

标签: android camera motion

如何使用前置摄像头和Android SDK实现简单的运动检测器?

示例场景将是这样的:设备站在支架上并播放电影。如果一个人出现在它前面,甚至没有触摸它 - 它会改变电影。

3 个答案:

答案 0 :(得分:22)

这是我的Android开源运动检测应用程序。

https://github.com/phishman3579/android-motion-detection

答案 1 :(得分:14)

Here is a Tutorial了解如何使用相机拍照。

如果您每秒拍摄一张照片,然后将其缩小到8x8像素,您可以轻松比较两张照片并查看是否发生了某些事情,以触发您的操作。

您应该缩小它的原因如下:

  1. 摄像机引入噪音的可能性较小
  2. 比整个图像的比较要快得多

答案 2 :(得分:0)

我解决了每n秒拍摄一次并将其缩放到10*10像素并找出它们之间的差异的问题。这是kotlin的实现:

private fun detectMotion(bitmap1: Bitmap, bitmap2: Bitmap) {
    val difference =
        getDifferencePercent(bitmap1.apply { scale(16, 12) }, bitmap2.apply { scale(16, 12) })
    if (difference > 10) { // customize accuracy
        // motion detected
    }
}

private fun getDifferencePercent(img1: Bitmap, img2: Bitmap): Double {
    if (img1.width != img2.width || img1.height != img2.height) {
        val f = "(%d,%d) vs. (%d,%d)".format(img1.width, img1.height, img2.width, img2.height)
        throw IllegalArgumentException("Images must have the same dimensions: $f")
    }
    var diff = 0L
    for (y in 0 until img1.height) {
        for (x in 0 until img1.width) {
            diff += pixelDiff(img1.getPixel(x, y), img2.getPixel(x, y))
        }
    }
    val maxDiff = 3L * 255 * img1.width * img1.height
    return 100.0 * diff / maxDiff
}

private fun pixelDiff(rgb1: Int, rgb2: Int): Int {
    val r1 = (rgb1 shr 16) and 0xff
    val g1 = (rgb1 shr 8) and 0xff
    val b1 = rgb1 and 0xff
    val r2 = (rgb2 shr 16) and 0xff
    val g2 = (rgb2 shr 8) and 0xff
    val b2 = rgb2 and 0xff
    return abs(r1 - r2) + abs(g1 - g2) + abs(b1 - b2)
}