/* * Copyright Inria and Bordeaux University. * Author Jeremy Laviole. jeremy.laviole@inria.fr * PapAR project is the open-source version of the * PapARt project. License is LGPLv3, distributed with the sources. * This project can also distributed with standard commercial * licence for closed-sources projects. */ package fr.inria.papart.procam.camera; import org.bytedeco.javacpp.opencv_core; import org.bytedeco.javacpp.opencv_core.CvSize; import org.bytedeco.javacpp.opencv_core.IplImage; import org.bytedeco.javacpp.opencv_imgproc; import org.bytedeco.javacv.FlyCapture2FrameGrabber; import org.bytedeco.javacv.FrameGrabber; import org.bytedeco.javacv.OpenCVFrameConverter; import processing.core.PImage; /** * * @author jiii */ public class CameraFlyCapture extends Camera { private FrameGrabber grabber; private boolean useBayerDecode = false; private final OpenCVFrameConverter.ToIplImage converter; protected CameraFlyCapture(int cameraNo) { this.systemNumber = cameraNo; this.setPixelFormat(PixelFormat.BGR); converter = new OpenCVFrameConverter.ToIplImage(); } @Override public void start() { try { FlyCapture2FrameGrabber grabberFly = new FlyCapture2FrameGrabber(this.systemNumber); grabberFly.setImageWidth(width()); grabberFly.setImageHeight(height()); if (useBayerDecode) { grabberFly.setImageMode(FrameGrabber.ImageMode.GRAY); } else { // Hack for now ... // real Gray colors are not supported by Processing anyway ! grabberFly.setImageMode(FrameGrabber.ImageMode.COLOR); } this.grabber = grabberFly; grabberFly.start(); this.isConnected = true; } catch (Exception e) { System.err.println("Could not start FlyCapture frameGrabber... " + e); System.err.println("Camera ID " + this.systemNumber + " could not start."); System.err.println("Check cable connection, ID and resolution asked."); } } @Override public void grab() { if (this.isClosing()) { return; } try { IplImage img = converter.convert(grabber.grab()); img = checkBayer(img); if (img != null) { this.updateCurrentImage(img); } } catch (Exception e) { System.err.println("Camera: OpenCV Grab() Error ! " + e); } } private IplImage debayer = null; private IplImage checkBayer(IplImage source) { if (!useBayerDecode) { return source; } if (debayer == null) { CvSize outSize = new CvSize(); outSize.width(source.width()); outSize.height(source.height()); debayer = opencv_core.cvCreateImage(outSize, opencv_core.IPL_DEPTH_8U, 3); } opencv_imgproc.cvCvtColor(source, debayer, opencv_imgproc.CV_BayerBG2BGR); return debayer; } @Override public PImage getPImage() { if (currentImage != null) { this.checkCamImage(); camImage.update(currentImage); return camImage; } // TODO: exceptions !!! return null; } public void setBayerDecode(boolean isBayer) { this.useBayerDecode = isBayer; } @Override public void close() { this.setClosing(); if (debayer != null) { debayer.deallocate(); } if (grabber != null) { try { this.stopThread(); grabber.stop(); grabber.release(); } catch (Exception e) { } } } }