Search in sources :

Example 6 with PkltConfig

use of boofcv.alg.tracker.klt.PkltConfig in project BoofCV by lessthanoptimal.

the class TestWrapVisOdomPixelDepthPnP method createAlgorithm.

@Override
public StereoVisualOdometry<GrayF32> createAlgorithm() {
    StereoDisparitySparse<GrayF32> disparity = FactoryStereoDisparity.regionSparseWta(2, 150, 3, 3, 30, -1, true, GrayF32.class);
    PkltConfig config = new PkltConfig();
    config.pyramidScaling = new int[] { 1, 2, 4, 8 };
    config.templateRadius = 3;
    ConfigGeneralDetector configDetector = new ConfigGeneralDetector(600, 3, 1);
    PointTrackerTwoPass<GrayF32> tracker = FactoryPointTrackerTwoPass.klt(config, configDetector, GrayF32.class, GrayF32.class);
    return FactoryVisualOdometry.stereoDepth(1.5, 40, 2, 200, 50, false, disparity, tracker, GrayF32.class);
}
Also used : GrayF32(boofcv.struct.image.GrayF32) PkltConfig(boofcv.alg.tracker.klt.PkltConfig) ConfigGeneralDetector(boofcv.abst.feature.detect.interest.ConfigGeneralDetector)

Example 7 with PkltConfig

use of boofcv.alg.tracker.klt.PkltConfig in project MAVSlam by ecmnet.

the class StreamRealSenseTest method start.

@Override
public void start(Stage primaryStage) {
    primaryStage.setTitle("BoofCV RealSense Demo");
    FlowPane root = new FlowPane();
    root.getChildren().add(ivrgb);
    ivrgb.setOnMouseMoved(event -> {
        MouseEvent ev = event;
        mouse_x = (int) ev.getX();
        mouse_y = (int) ev.getY();
    });
    // RealSenseInfo info = new RealSenseInfo(320,240, RealSenseInfo.MODE_RGB);
    RealSenseInfo info = new RealSenseInfo(640, 480, RealSenseInfo.MODE_RGB);
    try {
        realsense = new StreamRealSenseVisDepth(0, info);
    } catch (Exception e) {
        System.out.println("REALSENSE:" + e.getMessage());
        return;
    }
    mouse_x = info.width / 2;
    mouse_y = info.height / 2;
    primaryStage.setScene(new Scene(root, info.width, info.height));
    primaryStage.show();
    PkltConfig configKlt = new PkltConfig();
    configKlt.pyramidScaling = new int[] { 1, 2, 4, 8 };
    configKlt.templateRadius = 3;
    PointTrackerTwoPass<GrayU8> tracker = FactoryPointTrackerTwoPass.klt(configKlt, new ConfigGeneralDetector(900, 2, 1), GrayU8.class, GrayS16.class);
    DepthSparse3D<GrayU16> sparseDepth = new DepthSparse3D.I<GrayU16>(1e-3);
    // declares the algorithm
    MAVDepthVisualOdometry<GrayU8, GrayU16> visualOdometry = FactoryMAVOdometry.depthDepthPnP(1.2, 120, 2, 200, 50, true, sparseDepth, tracker, GrayU8.class, GrayU16.class);
    visualOdometry.setCalibration(realsense.getIntrinsics(), new DoNothingPixelTransform_F32());
    output = new BufferedImage(info.width, info.height, BufferedImage.TYPE_3BYTE_BGR);
    wirgb = new WritableImage(info.width, info.height);
    ivrgb.setImage(wirgb);
    realsense.registerListener(new Listener() {

        int fps;

        float mouse_depth;

        float md;

        int mc;

        int mf = 0;

        int fpm;

        @Override
        public void process(Planar<GrayU8> rgb, GrayU16 depth, long timeRgb, long timeDepth) {
            if ((System.currentTimeMillis() - tms) > 250) {
                tms = System.currentTimeMillis();
                if (mf > 0)
                    fps = fpm / mf;
                if (mc > 0)
                    mouse_depth = md / mc;
                mc = 0;
                md = 0;
                mf = 0;
                fpm = 0;
            }
            mf++;
            fpm += (int) (1f / ((timeRgb - oldTimeDepth) / 1000f) + 0.5f);
            oldTimeDepth = timeRgb;
            if (!visualOdometry.process(rgb.getBand(0), depth)) {
                bus1.writeObject(position);
                System.out.println("VO Failed!");
                visualOdometry.reset();
                return;
            }
            Se3_F64 leftToWorld = visualOdometry.getCameraToWorld();
            Vector3D_F64 T = leftToWorld.getT();
            AccessPointTracks3D points = (AccessPointTracks3D) visualOdometry;
            ConvertBufferedImage.convertTo(rgb, output, false);
            Graphics c = output.getGraphics();
            int count = 0;
            float total = 0;
            int dx = 0, dy = 0;
            int dist = 999;
            int x, y;
            int index = -1;
            for (int i = 0; i < points.getAllTracks().size(); i++) {
                if (points.isInlier(i)) {
                    c.setColor(Color.BLUE);
                    x = (int) points.getAllTracks().get(i).x;
                    y = (int) points.getAllTracks().get(i).y;
                    int d = depth.get(x, y);
                    if (d > 0) {
                        int di = (int) Math.sqrt((x - mouse_x) * (x - mouse_x) + (y - mouse_y) * (y - mouse_y));
                        if (di < dist) {
                            index = i;
                            dx = x;
                            dy = y;
                            dist = di;
                        }
                        total++;
                        if (d < 500) {
                            c.setColor(Color.RED);
                            count++;
                        }
                        c.drawRect(x, y, 1, 1);
                    }
                }
            }
            if (depth != null) {
                if (index > -1)
                    System.out.println(visualOdometry.getTrackLocation(index));
                mc++;
                md = md + depth.get(dx, dy) / 1000f;
                c.setColor(Color.GREEN);
                c.drawOval(dx - 3, dy - 3, 6, 6);
            }
            c.setColor(Color.CYAN);
            c.drawString("Fps:" + fps, 10, 20);
            c.drawString(String.format("Loc: %4.2f %4.2f %4.2f", T.x, T.y, T.z), 10, info.height - 10);
            c.drawString(String.format("Depth: %3.2f", mouse_depth), info.width - 85, info.height - 10);
            position.x = T.x;
            position.y = T.y;
            position.z = T.z;
            position.tms = timeRgb;
            bus1.writeObject(position);
            if ((count / total) > 0.6f) {
                c.setColor(Color.RED);
                c.drawString("WARNING!", info.width - 70, 20);
            }
            c.dispose();
            Platform.runLater(() -> {
                SwingFXUtils.toFXImage(output, wirgb);
            });
        }
    }).start();
}
Also used : Listener(com.comino.realsense.boofcv.StreamRealSenseVisDepth.Listener) PkltConfig(boofcv.alg.tracker.klt.PkltConfig) ConfigGeneralDetector(boofcv.abst.feature.detect.interest.ConfigGeneralDetector) AccessPointTracks3D(boofcv.abst.sfm.AccessPointTracks3D) BufferedImage(java.awt.image.BufferedImage) ConvertBufferedImage(boofcv.io.image.ConvertBufferedImage) FlowPane(javafx.scene.layout.FlowPane) Planar(boofcv.struct.image.Planar) GrayU8(boofcv.struct.image.GrayU8) MouseEvent(javafx.scene.input.MouseEvent) GrayU16(boofcv.struct.image.GrayU16) Scene(javafx.scene.Scene) Graphics(java.awt.Graphics) WritableImage(javafx.scene.image.WritableImage) DoNothingPixelTransform_F32(boofcv.alg.distort.DoNothingPixelTransform_F32) Vector3D_F64(georegression.struct.point.Vector3D_F64) Se3_F64(georegression.struct.se.Se3_F64)

Example 8 with PkltConfig

use of boofcv.alg.tracker.klt.PkltConfig in project narchy by automenta.

the class WebcamTrack method main.

public static void main(String[] args) {
    // tune the tracker for the image size and visual appearance
    ConfigGeneralDetector configDetector = new ConfigGeneralDetector(-1, 8, 1);
    PkltConfig configKlt = new PkltConfig(3, new int[] { 1, 2, 4, 8 });
    PointTracker<ImageFloat32> tracker = FactoryPointTracker.klt(configKlt, configDetector, ImageFloat32.class, null);
    // Open a webcam at a resolution close to 640x480
    Webcam webcam = UtilWebcamCapture.openDefault(640, 480);
    // Create the panel used to display the image and
    ImagePanel gui = new ImagePanel();
    gui.setPreferredSize(webcam.getViewSize());
    ShowImages.showWindow(gui, "KLT Tracker");
    int minimumTracks = 100;
    while (true) {
        BufferedImage image = webcam.getImage();
        ImageFloat32 gray = ConvertBufferedImage.convertFrom(image, (ImageFloat32) null);
        tracker.process(gray);
        List<PointTrack> tracks = tracker.getActiveTracks(null);
        // Spawn tracks if there are too few
        if (tracks.size() < minimumTracks) {
            tracker.spawnTracks();
            tracks = tracker.getActiveTracks(null);
            minimumTracks = tracks.size() / 2;
        }
        // Draw the tracks
        Graphics2D g2 = image.createGraphics();
        for (PointTrack t : tracks) {
            VisualizeFeatures.drawPoint(g2, (int) t.x, (int) t.y, Color.RED);
        }
        gui.setBufferedImageSafe(image);
    }
}
Also used : PointTrack(boofcv.abst.feature.tracker.PointTrack) ImageFloat32(boofcv.struct.image.ImageFloat32) PkltConfig(boofcv.alg.tracker.klt.PkltConfig) ConfigGeneralDetector(boofcv.abst.feature.detect.interest.ConfigGeneralDetector) Webcam(com.github.sarxos.webcam.Webcam) BufferedImage(java.awt.image.BufferedImage) ConvertBufferedImage(boofcv.core.image.ConvertBufferedImage) ImagePanel(boofcv.gui.image.ImagePanel)

Example 9 with PkltConfig

use of boofcv.alg.tracker.klt.PkltConfig in project BoofCV by lessthanoptimal.

the class FactoryPointTracker method klt.

/**
 * Pyramid KLT feature tracker.
 *
 * @see boofcv.alg.tracker.klt.PyramidKltTracker
 *
 * @param config Config for the tracker. Try PkltConfig.createDefault().
 * @param configExtract Configuration for extracting features
 * @return KLT based tracker.
 */
public static <I extends ImageGray<I>, D extends ImageGray<D>> PointTracker<I> klt(PkltConfig config, ConfigGeneralDetector configExtract, Class<I> imageType, Class<D> derivType) {
    if (derivType == null)
        derivType = GImageDerivativeOps.getDerivativeType(imageType);
    if (config == null) {
        config = new PkltConfig();
    }
    if (configExtract == null) {
        configExtract = new ConfigGeneralDetector();
    }
    GeneralFeatureDetector<I, D> detector = createShiTomasi(configExtract, derivType);
    InterpolateRectangle<I> interpInput = FactoryInterpolation.<I>bilinearRectangle(imageType);
    InterpolateRectangle<D> interpDeriv = FactoryInterpolation.<D>bilinearRectangle(derivType);
    ImageGradient<I, D> gradient = FactoryDerivative.sobel(imageType, derivType);
    PyramidDiscrete<I> pyramid = FactoryPyramid.discreteGaussian(config.pyramidScaling, -1, 2, true, ImageType.single(imageType));
    return new PointTrackerKltPyramid<>(config.config, config.templateRadius, pyramid, detector, gradient, interpInput, interpDeriv, derivType);
}
Also used : PkltConfig(boofcv.alg.tracker.klt.PkltConfig) ConfigGeneralDetector(boofcv.abst.feature.detect.interest.ConfigGeneralDetector)

Example 10 with PkltConfig

use of boofcv.alg.tracker.klt.PkltConfig in project BoofCV by lessthanoptimal.

the class FactoryPointTracker method klt.

/**
 * Pyramid KLT feature tracker.
 *
 * @see boofcv.alg.tracker.klt.PyramidKltTracker
 *
 * @param scaling       Scales in the image pyramid. Recommend [1,2,4] or [2,4]
 * @param configExtract Configuration for extracting features
 * @param featureRadius Size of the tracked feature.  Try 3 or 5
 * @param imageType     Input image type.
 * @param derivType     Image derivative  type.
 * @return KLT based tracker.
 */
public static <I extends ImageGray<I>, D extends ImageGray<D>> PointTracker<I> klt(int[] scaling, ConfigGeneralDetector configExtract, int featureRadius, Class<I> imageType, Class<D> derivType) {
    PkltConfig config = new PkltConfig();
    config.pyramidScaling = scaling;
    config.templateRadius = featureRadius;
    return klt(config, configExtract, imageType, derivType);
}
Also used : PkltConfig(boofcv.alg.tracker.klt.PkltConfig)

Aggregations

PkltConfig (boofcv.alg.tracker.klt.PkltConfig)18 ConfigGeneralDetector (boofcv.abst.feature.detect.interest.ConfigGeneralDetector)16 GrayU8 (boofcv.struct.image.GrayU8)7 Vector3D_F64 (georegression.struct.point.Vector3D_F64)4 Se3_F64 (georegression.struct.se.Se3_F64)4 DescribeRegionPoint (boofcv.abst.feature.describe.DescribeRegionPoint)3 PointTracker (boofcv.abst.feature.tracker.PointTracker)3 FactoryDescribeRegionPoint (boofcv.factory.feature.describe.FactoryDescribeRegionPoint)3 FactoryPointTracker (boofcv.factory.feature.tracker.FactoryPointTracker)3 MediaManager (boofcv.io.MediaManager)3 DefaultMediaManager (boofcv.io.wrapper.DefaultMediaManager)3 GrayF32 (boofcv.struct.image.GrayF32)3 GrayU16 (boofcv.struct.image.GrayU16)3 BufferedImage (java.awt.image.BufferedImage)3 AssociateDescription2D (boofcv.abst.feature.associate.AssociateDescription2D)2 ScoreAssociateHamming_B (boofcv.abst.feature.associate.ScoreAssociateHamming_B)2 PointTrack (boofcv.abst.feature.tracker.PointTrack)2 PointTrackerToTwoPass (boofcv.abst.feature.tracker.PointTrackerToTwoPass)2 PointTrackerTwoPass (boofcv.abst.feature.tracker.PointTrackerTwoPass)2 GeneralFeatureDetector (boofcv.alg.feature.detect.interest.GeneralFeatureDetector)2