001/**
002 * Copyright (c) 2011, The University of Southampton and the individual contributors.
003 * All rights reserved.
004 *
005 * Redistribution and use in source and binary forms, with or without modification,
006 * are permitted provided that the following conditions are met:
007 *
008 *   *  Redistributions of source code must retain the above copyright notice,
009 *      this list of conditions and the following disclaimer.
010 *
011 *   *  Redistributions in binary form must reproduce the above copyright notice,
012 *      this list of conditions and the following disclaimer in the documentation
013 *      and/or other materials provided with the distribution.
014 *
015 *   *  Neither the name of the University of Southampton nor the names of its
016 *      contributors may be used to endorse or promote products derived from this
017 *      software without specific prior written permission.
018 *
019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
020 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
021 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
022 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
023 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
024 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
025 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
026 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
027 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
028 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029 */
030package org.openimaj.demos;
031
032import java.io.IOException;
033
034import org.openimaj.hardware.kinect.KinectException;
035import org.openimaj.image.DisplayUtilities;
036import org.openimaj.image.FImage;
037import org.openimaj.image.MBFImage;
038import org.openimaj.image.analysis.algorithm.HoughCircles;
039import org.openimaj.image.analysis.algorithm.HoughCircles.WeightedCircle;
040import org.openimaj.image.processing.edges.CannyEdgeDetector;
041import org.openimaj.image.processing.resize.ResizeProcessor;
042import org.openimaj.video.VideoDisplay;
043import org.openimaj.video.VideoDisplayListener;
044import org.openimaj.video.capture.VideoCapture;
045
046public class JugglingKinect {
047        public static void main(String[] args) throws KinectException, IOException {
048//              KinectController c = new KinectController();
049//              VideoDisplay<MBFImage> vid = (VideoDisplay<MBFImage>) VideoDisplay.createVideoDisplay(c.videoStream);
050                VideoDisplay<MBFImage> vid = VideoDisplay.createVideoDisplay(new VideoCapture(320,240));
051                vid.addVideoListener(new VideoDisplayListener<MBFImage>() {
052                        int frames = 0;
053                        private HoughCircles circles;
054                        @Override
055                        public void beforeUpdate(MBFImage frame) {
056                                if(frame==null)return;
057                                FImage gframe = frame.flatten();
058                                frames ++;
059//                              FImage hband = trans.getBand(1).normalise();
060//                              frame = frame.process(new Disk(20));
061                                CannyEdgeDetector d = new CannyEdgeDetector();
062                                ResizeProcessor resize = new ResizeProcessor(0.3f);
063                                FImage resized = gframe.process(resize);
064//                              FImage canny = resized.process(new FSobelMagnitude()).threshold(0.8f);
065                                FImage canny = resized.process(d);
066                                if(this.circles == null)
067                                        this.circles = new HoughCircles(canny.width/15,canny.width/4,5,360);
068                                canny.analyseWith(circles);
069//                              if(frames % 2 == 0){
070//                                      f = f.process(circles);
071//                                      f.drawPoints(circles.accum, 1.f, 10);
072//                                      f.drawShape(new Circle(10,10,10), 1f);
073//                              }
074                                MBFImage colResized = new MBFImage(resized.clone(),resized.clone(),resized.clone());
075                                for (WeightedCircle circ : circles.getBest(5)) {
076                                        System.out.println(circ.weight);
077                                        colResized.drawShape(circ, new Float[]{circ.weight,0f,0f});
078                                }
079
080                                DisplayUtilities.displayName(canny,"circles");
081                                DisplayUtilities.displayName(colResized,"wang");
082                        }
083
084                        @Override
085                        public void afterUpdate(VideoDisplay<MBFImage> display) {
086                                // TODO Auto-generated method stub
087
088                        }
089                });
090        }
091}