Android - 相机作为运动检测器

Posted

技术标签:

【中文标题】Android - 相机作为运动检测器【英文标题】:Android - camera as motion detector 【发布时间】:2012-04-04 04:04:22 【问题描述】:

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

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

【问题讨论】:

让我补充一下,最后我从来没有这样做过,因为我的客户放弃了这个功能,我没有时间自己处理它。 【参考方案1】:

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

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

【讨论】:

项目描述:“通过比较两张图片来检测运动的Android代码。”【参考方案2】:

Here is a Tutorial关于如何用相机拍照。

如果您每秒拍摄一张照片,然后将其缩小到 8x8 像素,您可以轻松比较两张照片并找出是否发生了什么事情,从而触发您的行动。

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

    相机引入的噪音不易出错 这将比对整个图像进行比较快得多

【讨论】:

我喜欢你的回答。谢谢。只需要弄清楚使用前置摄像头。以及,如何缩放图像(对颜色进行平均以创建缩放图像的一个像素?)。 是的,就是这样,只是平均源图像的多个像素。但请记住,平均值必须通过将多个像素相加来计算,这意味着数字可能会变得非常大。所以请记住使用long 进行计算。此外,对黑白图像进行操作可能就足够了...... 链接失效。请问可以更新一下吗? 教程的最新链接:newcircle.com/s/post/39/using__the_camera_api?page=3【参考方案3】:

我解决了每隔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)

【讨论】:

以上是关于Android - 相机作为运动检测器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用运动检测触发相机?

使用 raspi 相机的树莓派运动检测

如何检测相机上的运动以移动鼠标

使用 Picamera 进行运动检测

在opencv c ++(移动相机)上检测运动

Android在后台运行任务时关闭屏幕