Android - камера как датчик движения

Как реализовать простой детектор движения с помощью фронтальной камеры и Android SDK?

Примерный сценарий будет таким: устройство стоит на подставке и воспроизводит фильм. Если перед ним появляется человек, даже не прикасаясь к нему — это меняет фильм.


person Yar    schedule 19.03.2012    source источник
comment
Добавлю лишь, что в итоге я так и не сделал этого, так как мой заказчик отказался от этого функционала и у меня не было времени заниматься этим самостоятельно.   -  person Yar    schedule 16.09.2014


Ответы (3)


Вот учебник о том, как делать фотографии с помощью камеры.

Если вы будете делать снимок каждую секунду, а затем уменьшите его до размера, например, 8x8 пикселей, вы сможете легко сравнить два снимка и узнать, произошло ли что-то, чтобы спровоцировать действие.

Причина, по которой вам следует уменьшить масштаб, заключается в следующем:

  1. Это менее подвержено ошибкам из-за шума, создаваемого камерой.
  2. Это будет намного быстрее, чем делать сравнение всего изображения
person devsnd    schedule 19.03.2012
comment
Мне нравится твой ответ. Спасибо. Осталось разобраться, как использовать фронтальную камеру. И как масштабировать изображение (выполняется ли усреднение цветов для создания одного пикселя масштабированного изображения?). - person Yar; 19.03.2012
comment
Да, вот и все, просто усредните несколько пикселей исходного изображения. но имейте в виду, что среднее значение должно быть рассчитано путем суммирования нескольких пикселей, а это означает, что числа могут стать довольно большими. поэтому не забудьте использовать long для расчетов. Кроме того, может быть достаточно работы с черно-белым изображением... - person devsnd; 19.03.2012
comment
Ссылка не работает. Не могли бы вы обновить его, пожалуйста? - person Noobification; 03.09.2015
comment
Актуальная ссылка на руководство: newcircle.com/s/post/ 39/using__the_camera_api?page=3 - person mostar; 15.10.2015

Вот мое приложение для обнаружения движения с открытым исходным кодом для Android.

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

person Justin    schedule 09.10.2012
comment
Описание проекта: Android-код для обнаружения движения путем сравнения двух изображений. - person ban-geoengineering; 12.02.2016

Я решил делать снимки каждые 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)
}
person Rainmaker    schedule 17.09.2019