/* * * Panbox - encryption for cloud storage * Copyright (C) 2014-2015 by Fraunhofer SIT and Sirrix AG * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * Additonally, third party code may be provided with notices and open source * licenses from communities and third parties that govern the use of those * portions, and any licenses granted hereunder do not alter any rights and * obligations you may have under such open source licenses, however, the * disclaimer of warranty and limitation of liability provisions of the GPLv3 * will apply to all the product. * */ package org.panbox.desktop.common.pairing.cam; import java.awt.Color; import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.ImageIO; import org.apache.log4j.Logger; import org.bytedeco.javacpp.opencv_core.IplImage; import org.bytedeco.javacv.OpenCVFrameGrabber; @SuppressWarnings("serial") public class OpenCVWebCam extends ImagePanel { protected static final Logger logger = Logger.getLogger("org.panbox"); private boolean running = false; private Thread runner = null; private OpenCVFrameGrabber grabber; private CVImageProcessor imageProcessor = null; public OpenCVWebCam(int device, int width, int height) { this.grabber = new OpenCVFrameGrabber(device); grabber.setImageWidth(width); grabber.setImageHeight(height); this.setBackground(Color.LIGHT_GRAY); } public void setImageProcessor(CVImageProcessor imageProcessor) { this.imageProcessor = imageProcessor; } public CVImageProcessor getImageProcessor() { return imageProcessor; } private void grabAndPaint() { try { BufferedImage out; // grab the raw image from the webcam IplImage frame = grabber.grab(); // if an image processor has been defined, start processing the // image if (imageProcessor != null) { frame = imageProcessor.process(frame); } // output the final result as a bufferedimage out = frame.getBufferedImage(); this.setImage(out); } catch (Exception ex) { try { BufferedImage image = ImageIO.read(getClass().getResource( "nocam.png")); setImage(image); } catch (IOException e) { // something really strange must happen here in order to throw // this // exception } } this.repaint(); } /** * Start grabbing frames from the webcam. * * @throws Exception */ public void start() throws Exception { if (running) { return; } grabber.start(); running = true; runner = new Thread() { @Override public void run() { while (running) { grabAndPaint(); Thread.yield(); } try { grabber.stop(); } catch (Exception ex) { logger.error("Could not stop OpenCV camera."); } runner = null; } }; runner.start(); } public boolean isRunnning() { return runner != null; } public void stop() { running = false; } }