13

フロントカメラと Android SDK を使用して簡単なモーション検出器を実装するにはどうすればよいですか?

シナリオの例は次のようなものです: デバイスがスタンドに立っていて、映画を再生しています。触れずに目の前に人が現れると、映画が変わります。

4

3 に答える 3

22

Android 用のオープン ソースのモーション検出アプリを次に示します。

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

于 2012-10-09T00:27:30.647 に答える
15

カメラで写真を撮る方法のチュートリアルです。

毎秒写真を撮り、それを 8x8 ピクセルなどに縮小すると、簡単に 2 枚の写真を比較して、何かが起こったかどうかを調べて、行動を起こすことができます。

縮小する必要がある理由は次のとおりです。

  1. カメラによって導入されたノイズによるエラーが発生しにくい
  2. 画像全体の比較を行うよりもはるかに高速になります
于 2012-03-19T17:04:43.407 に答える
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)
}
于 2019-09-17T17:00:51.440 に答える