Package it.freedomotic.plugins.webcam

Source Code of it.freedomotic.plugins.webcam.CamMotionDetector

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package it.freedomotic.plugins.webcam;

import it.freedomotic.api.EventTemplate;
import it.freedomotic.api.Protocol;
import it.freedomotic.app.Freedomotic;
import it.freedomotic.events.GenericEvent;
import it.freedomotic.exceptions.UnableToExecuteException;
import it.freedomotic.reactions.Command;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
*
* @author Enrico Nicoletti
*/
public class CamMotionDetector extends Protocol {

    private String ipCamera = "http://194.218.96.93/axis-cgi/mjpg/video.cgi?resolution=320x240";
    private ArrayList<Integer> motion = new ArrayList<Integer>();
    private MjpegWebcamConnector mjpegWebcam;
    private int lastMotionLevel = 0;

    public CamMotionDetector() {
        super("Camera Motion Detector", "/it.freedomotic.wmotion/camera-motion-detector.xml");
        ipCamera = configuration.getStringProperty("camera-url", "http://194.218.96.93/axis-cgi/mjpg/video.cgi?resolution=320x240");
    }

    public void displayVideo() {
        //sends a message to a video player to visualize the stream
        Command playMedia = new Command();
        playMedia.setName("Media Player Request");
        playMedia.setDescription("request to play a media file or web stream");
        playMedia.setReceiver("app.actuators.media.player.in");
        playMedia.setProperty("url", ipCamera);
        playMedia.setProperty("fullscreen", "false");
        playMedia.setProperty("dimension", "from source");
    }

    public void setMotionLevel(int motionLevel) {
        if (motion.size() < 30) {
            motion.add(motionLevel);
        } else {
            motion.remove(0);
            motion.add(motionLevel);
        }
        int averageMotionLevel = applyForgettingFactor(motion);
        Freedomotic.logger.fine("Motion level in " + ipCamera + " is " + averageMotionLevel + "%");
        sendMotionNotification(averageMotionLevel);
    }

    private void sendMotionNotification(int averageMotionLevel) {
        if (averageMotionLevel != lastMotionLevel) {
            this.setDescription("Last detected motion level was " + averageMotionLevel + "%");
            if (averageMotionLevel > configuration.getIntProperty("sensibility-threshold", 30)) {
                //here create and send the freedom event
                GenericEvent event = new GenericEvent(this);
                event.addProperty("motion-level", new Integer(averageMotionLevel).toString());
                event.setDestination("app.event.sensor.video.motion");
                notifyEvent(event);
                lastMotionLevel = averageMotionLevel;
            }
        }
    }

    private int applyForgettingFactor(List<Integer> list) {
        double factorSum = 0.0;
        double motionVal = 0.0;
        int id = 0;
        int exp = 0;
        int size = list.size() - 1;
        int currVal;
        int lastVal = list.get(size);
        for (int i = size; i >= 0; i--) {
            //a factor= 0 means only the last received value is used
            //factor=1 menas all value used
            double factor = Math.pow(configuration.getDoubleProperty("forgetting-factor", 0.8), exp);
            currVal = list.get(i);
            double tmpVal = currVal * factor;
            factorSum += factor;
            motionVal += tmpVal;
            exp++;
        }
        double coordx = motionVal / factorSum;
        return (int) coordx;
    }

    @Override
    public void onRun() {
        MotionDetector algorithm = new SimpleMotionDetector();
        if (configuration.getStringProperty("algorithm", "simple").equalsIgnoreCase("simple")) {
            algorithm = new SimpleMotionDetector();
        }
        //instantiate a camera connection with simple motion detection algorithm
        algorithm.setNoiseThreshold(configuration.getIntProperty("noise-threshold", 20));
        MjpegWebcamConnector webcam = new MjpegWebcamConnector(ipCamera, algorithm, this);
        try {
            webcam.connect();
            setDescription("Connected to " + ipCamera.toString());
            displayVideo();
        } catch (IOException ex) {
            stop();
            setDescription("Unable to connect to " + ipCamera.toString());
        }
    }

    @Override
    public void onStop() {
        if (mjpegWebcam != null) {
            mjpegWebcam.disconnect();
        }
    }

    @Override
    protected void onCommand(Command c) throws IOException, UnableToExecuteException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    protected boolean canExecute(Command c) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    protected void onEvent(EventTemplate event) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
TOP

Related Classes of it.freedomotic.plugins.webcam.CamMotionDetector

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.