2011年2月1日火曜日

USBカメラで簡易的に動作の検出をする

たぶん、もっと正しい方法があるのだろうけど、動いている物体があることを検出する簡易的なプログラム。
画像の適当な観測点を予め決めておいて、その場所の輝度が変化したら動いているであろうとする。
USBカメラからの画像の取得にはPythonのライブラリのVideoCaptureを使っています。

# -*- coding: utf-8 -*-
# motion1.py 2011.2.1
import time
import random
import VideoCapture

class Motion1:
    def __init__(self):
        self.sample = []  # 観測点
        self.old_val = []

    def ginfo(self, buf, xy):
        b = ord(buf[xy])
        g = ord(buf[xy + 1])
        r = ord(buf[xy + 2])
        return (r * 299 + g * 587 + b * 114) / 1000  # 輝度の計算

    def check(self, buf, noize = 30, limit = 12):
        max_sample = 200  # 観測数
        if not self.sample:
            self.sample = random.sample(range(0, len(buf)-1, 3), max_sample)
        new_val = []
        for xy in self.sample:
            new_val.append(self.ginfo(buf, xy))
        t = 0
        if self.old_val:
            for i in range(max_sample):
                if abs(self.old_val[i] - new_val[i]) > noize:
                    t += 1
        self.old_val = new_val
        return (t * 100 / max_sample) > limit

if __name__ == '__main__':
    devnum = 1 # ManyCam
    cam = VideoCapture.Device(devnum)
    motion = Motion1()
    while True:
        (buf, x, y) = cam.getBuffer()
        if motion.check(buf):
            print VideoCapture.now(), u"動作を検出しました"
        time.sleep(0.5)

0 件のコメント: