import java.awt.Dimension; import java.awt.GridLayout; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.List; import javax.swing.BorderFactory; import javax.swing.JFrame; import com.github.sarxos.webcam.Webcam; import com.github.sarxos.webcam.WebcamMotionDetector; import com.github.sarxos.webcam.WebcamMotionEvent; import com.github.sarxos.webcam.WebcamMotionListener; import com.github.sarxos.webcam.WebcamPanel; import com.github.sarxos.webcam.ds.ipcam.IpCamDriver; import com.github.sarxos.webcam.ds.ipcam.IpCamStorage; public class DetectMotionFromIpCamerasExample { static { Webcam.setDriver(new IpCamDriver(new IpCamStorage("src/examples/resources/movable.xml"))); } public static void main(String[] args) throws MalformedURLException { JFrame f = new JFrame("Detect Motion Multiple Cameras"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setLayout(new GridLayout(0, 3, 1, 1)); WebcamMotionListener listener = new WebcamMotionListener() { @Override public void motionDetected(WebcamMotionEvent wme) { synchronized (this) { System.out.println("motion detected ---------------- "); System.out.println("webcam: " + ((WebcamMotionDetector) wme.getSource()).getWebcam()); System.out.println("diff area: " + wme.getArea() + "%"); System.out.println("cog: [" + wme.getCog().getX() + "," + wme.getCog().getY() + "]"); } } }; final List<Webcam> webcams = new ArrayList<Webcam>(); final List<WebcamPanel> panels = new ArrayList<WebcamPanel>(); final List<WebcamMotionDetector> detectors = new ArrayList<WebcamMotionDetector>(); for (Webcam webcam : Webcam.getWebcams()) { webcams.add(webcam); WebcamPanel panel = new WebcamPanel(webcam, new Dimension(256, 144), false); panel.setFitArea(true); panel.setFPSLimited(true); panel.setFPSLimit(0.5); // 0.5 FPS = 1 frame per 2 seconds panel.setBorder(BorderFactory.createEmptyBorder()); f.add(panel); panels.add(panel); WebcamMotionDetector detector = new WebcamMotionDetector(webcam); detector.addMotionListener(listener); detector.setInterval(100); // one motion check per 2 seconds detectors.add(detector); } f.pack(); f.setVisible(true); for (int i = 0; i < webcams.size(); i++) { final int x = i; Thread t = new Thread() { @Override public void run() { webcams.get(x).open(); // open in asynchronous mode panels.get(x).start(); detectors.get(x).start(); } }; t.setDaemon(true); t.start(); } } }