/*
 * Copyright (c) 2011-2016, Peter Abeles. All Rights Reserved.
 *
 * This file is part of BoofCV (http://boofcv.org).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package boofcv.demonstrations.feature.detect;

import boofcv.abst.feature.detect.extract.NonMaxSuppression;
import boofcv.abst.feature.detect.extract.WrapperNonMaximumBlock;
import boofcv.abst.feature.detect.intensity.GeneralFeatureIntensity;
import boofcv.abst.feature.detect.intensity.WrapperGradientCornerIntensity;
import boofcv.alg.feature.detect.extract.NonMaxBlockStrict;
import boofcv.alg.feature.detect.interest.GeneralFeatureDetector;
import boofcv.alg.filter.derivative.DerivativeType;
import boofcv.alg.filter.derivative.GImageDerivativeOps;
import boofcv.core.image.GeneralizedImageOps;
import boofcv.factory.feature.detect.intensity.FactoryIntensityPointAlg;
import boofcv.gui.image.ImagePanel;
import boofcv.gui.image.ProcessImageSequence;
import boofcv.gui.image.ShowImages;
import boofcv.io.UtilIO;
import boofcv.io.image.SimpleImageSequence;
import boofcv.io.video.BoofVideoManager;
import boofcv.struct.BoofDefaults;
import boofcv.struct.QueueCorner;
import boofcv.struct.image.GrayF32;
import boofcv.struct.image.ImageGray;
import boofcv.struct.image.ImageType;
import georegression.struct.point.Point2D_I16;

import java.awt.*;
import java.awt.image.BufferedImage;

/**
 * Displays detected corners in a video sequence
 *
 * @author Peter Abeles
 */
public class VideoDetectCorners
		extends ProcessImageSequence {

	GeneralFeatureDetector detector;
	D derivX;
	D derivY;
	D derivXX;
	D derivYY;
	D derivXY;

	Class derivType;

	QueueCorner corners;

	ImagePanel panel;

	public VideoDetectCorners(SimpleImageSequence sequence,
							  GeneralFeatureDetector detector,
							  Class derivType) {
		super(sequence);

		this.derivType = derivType;
		this.detector = detector;
	}


	@Override
	public void processFrame(T image) {

		if (detector.getRequiresGradient()) {
			if (derivX == null) {
				derivX = GeneralizedImageOps.createSingleBand(derivType, image.width, image.height);
				derivY = GeneralizedImageOps.createSingleBand(derivType, image.width, image.height);
			}

			// compute the image gradient
			GImageDerivativeOps.gradient(DerivativeType.SOBEL, image, derivX, derivY, BoofDefaults.DERIV_BORDER_TYPE);
		}

		if (detector.getRequiresHessian()) {
			if (derivXX == null) {
				derivXX = GeneralizedImageOps.createSingleBand(derivType, image.width, image.height);
				derivYY = GeneralizedImageOps.createSingleBand(derivType, image.width, image.height);
				derivXY = GeneralizedImageOps.createSingleBand(derivType, image.width, image.height);
			}

			// compute the image gradient
			GImageDerivativeOps.hessian(DerivativeType.THREE, image, derivXX, derivYY, derivXY, BoofDefaults.DERIV_BORDER_TYPE);
		}

		detector.process(image, derivX, derivY, derivXX, derivYY, derivXY);
		corners = detector.getMaximums();
	}

	@Override
	public void updateGUI(BufferedImage guiImage, T origImage) {
		Graphics2D g2 = guiImage.createGraphics();

		for (int i = 0; i < corners.size(); i++) {
			Point2D_I16 pt = corners.get(i);

			g2.setColor(Color.BLACK);
			g2.fillOval(pt.x - 4, pt.y - 4, 9, 9);
			g2.setColor(Color.RED);
			g2.fillOval(pt.x - 2, pt.y - 2, 5, 5);
		}

		if (panel == null) {
			panel = ShowImages.showWindow(guiImage, "Image Sequence");
			addComponent(panel);
		} else {
			panel.setBufferedImage(guiImage);
			panel.repaint();
		}
	}

	public static 
	void perform(String fileName, Class imageType, Class derivType) {
		SimpleImageSequence sequence = BoofVideoManager.loadManagerDefault().load(fileName, ImageType.single(imageType));

		int maxCorners = 200;
		int radius = 2;

		GeneralFeatureIntensity intensity = new WrapperGradientCornerIntensity(FactoryIntensityPointAlg.shiTomasi(radius, false, derivType));
//		GeneralFeatureIntensity intensity =
//				new WrapperFastCornerIntensity(FactoryIntensityPointAlg.createFast12(imageType, 8 , 12));

		NonMaxSuppression extractor = new WrapperNonMaximumBlock(new NonMaxBlockStrict.Max());
//		FeatureExtractor extractor = new WrapperNonMaximumBlock( new NonMaxExtractorNaive(radius+10,10f));
//		FeatureExtractor extractor = new WrapperNonMaxCandidate(new NonMaxCandidateStrict(radius+10, 10f));
		extractor.setIgnoreBorder(radius + 10);
		extractor.setThresholdMaximum(10f);

		GeneralFeatureDetector detector = new GeneralFeatureDetector(intensity, extractor);
		detector.setMaxFeatures(maxCorners);

		VideoDetectCorners display = new VideoDetectCorners(sequence, detector, derivType);

		display.process();
	}

	public static void main(String args[]) {
		String fileName;

		if (args.length == 0) {
			fileName = UtilIO.pathExample("zoom.mjpeg");
		} else {
			fileName = args[0];
		}

//		perform(fileName,GrayU8.class,GrayS16.class);
		perform(fileName, GrayF32.class, GrayF32.class);
	}
}

 

Ads help maintain this website.