【发布时间】:2012-04-04 04:04:22
【问题描述】:
如何使用前置摄像头和Android SDK实现一个简单的运动检测器?
示例场景如下:设备站在支架上并播放电影。如果一个人出现在它面前,甚至没有触摸它 - 它会改变电影。
【问题讨论】:
-
让我补充一下,最后我从来没有这样做过,因为我的客户放弃了这个功能,我没有时间自己处理它。
如何使用前置摄像头和Android SDK实现一个简单的运动检测器?
示例场景如下:设备站在支架上并播放电影。如果一个人出现在它面前,甚至没有触摸它 - 它会改变电影。
【问题讨论】:
这是我的 Android 开源运动检测应用程序。
【讨论】:
Here is a Tutorial关于如何用相机拍照。
如果您每秒拍摄一张照片,然后将其缩小到 8x8 像素,您可以轻松比较两张照片并找出是否发生了什么事情,从而触发您的行动。
你应该缩小它的原因如下:
【讨论】:
long 进行计算。此外,对黑白图像进行操作可能就足够了......
我解决了每隔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)
}
【讨论】: