vinylsleevedetection.Analyze.java Source code

Java tutorial

Introduction

Here is the source code for vinylsleevedetection.Analyze.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package vinylsleevedetection;

import java.util.LinkedList;
import java.util.List;

import org.opencv.calib3d.Calib3d;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.MatOfDMatch;
import org.opencv.core.MatOfKeyPoint;
import org.opencv.core.MatOfPoint2f;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.core.DMatch;
import org.opencv.features2d.DescriptorExtractor;
import org.opencv.features2d.DescriptorMatcher;
import org.opencv.features2d.FeatureDetector;
import org.opencv.features2d.Features2d;
import org.opencv.core.KeyPoint;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

/**
 *
 * @author Jamie
 */
public class Analyze {

    public static int count = 1;
    GUIController orc = new GUIController();

    public void Check() {
        count = 1;
        //load openCV library
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        //for loop to compare source images to user image
        for (int j = 1; j < 4; j++) {
            //source image location (record sleeve)
            String Object = "E:\\Users\\Jamie\\Documents\\NetBeansProjects\\VinylSleeveDetection\\Source\\" + j
                    + ".jpg";
            //user image location
            String Scene = "E:\\Users\\Jamie\\Documents\\NetBeansProjects\\VinylSleeveDetection\\Output\\camera.jpg";
            //load images
            Mat objectImage = Imgcodecs.imread(Object, Imgcodecs.CV_LOAD_IMAGE_COLOR);
            Mat sceneImage = Imgcodecs.imread(Scene, Imgcodecs.CV_LOAD_IMAGE_COLOR);
            //use BRISK feature detection
            MatOfKeyPoint objectKeyPoints = new MatOfKeyPoint();
            FeatureDetector featureDetector = FeatureDetector.create(FeatureDetector.BRISK);
            //perform feature detection on source image
            featureDetector.detect(objectImage, objectKeyPoints);
            KeyPoint[] keypoints = objectKeyPoints.toArray();
            //use descriptor extractor
            MatOfKeyPoint objectDescriptors = new MatOfKeyPoint();
            DescriptorExtractor descriptorExtractor = DescriptorExtractor.create(DescriptorExtractor.BRISK);
            descriptorExtractor.compute(objectImage, objectKeyPoints, objectDescriptors);

            Mat outputImage = new Mat(objectImage.rows(), objectImage.cols(), Imgcodecs.CV_LOAD_IMAGE_COLOR);
            Scalar newKeypointColor = new Scalar(255, 0, 0);

            Features2d.drawKeypoints(objectImage, objectKeyPoints, outputImage, newKeypointColor, 0);

            MatOfKeyPoint sceneKeyPoints = new MatOfKeyPoint();
            MatOfKeyPoint sceneDescriptors = new MatOfKeyPoint();
            featureDetector.detect(sceneImage, sceneKeyPoints);
            descriptorExtractor.compute(sceneImage, sceneKeyPoints, sceneDescriptors);

            Mat matchoutput = new Mat(sceneImage.rows() * 2, sceneImage.cols() * 2, Imgcodecs.CV_LOAD_IMAGE_COLOR);
            Scalar matchestColor = new Scalar(0, 255, 0);

            List<MatOfDMatch> matches = new LinkedList<>();
            DescriptorMatcher descriptorMatcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE);
            descriptorMatcher.knnMatch(objectDescriptors, sceneDescriptors, matches, 2);

            LinkedList<DMatch> goodMatchesList = new LinkedList<DMatch>();

            float nndrRatio = 0.7f;

            for (int i = 0; i < matches.size(); i++) {
                MatOfDMatch matofDMatch = matches.get(i);
                DMatch[] dmatcharray = matofDMatch.toArray();
                DMatch m1 = dmatcharray[0];
                DMatch m2 = dmatcharray[1];

                if (m1.distance <= m2.distance * nndrRatio) {
                    goodMatchesList.addLast(m1);

                }
            }
            //if the number of good mathces is more than 150 a match is found
            if (goodMatchesList.size() > 150) {
                System.out.println("Object Found");

                List<KeyPoint> objKeypointlist = objectKeyPoints.toList();
                List<KeyPoint> scnKeypointlist = sceneKeyPoints.toList();

                LinkedList<Point> objectPoints = new LinkedList<>();
                LinkedList<Point> scenePoints = new LinkedList<>();

                for (int i = 0; i < goodMatchesList.size(); i++) {
                    objectPoints.addLast(objKeypointlist.get(goodMatchesList.get(i).queryIdx).pt);
                    scenePoints.addLast(scnKeypointlist.get(goodMatchesList.get(i).trainIdx).pt);
                }

                MatOfPoint2f objMatOfPoint2f = new MatOfPoint2f();
                objMatOfPoint2f.fromList(objectPoints);
                MatOfPoint2f scnMatOfPoint2f = new MatOfPoint2f();
                scnMatOfPoint2f.fromList(scenePoints);

                Mat homography = Calib3d.findHomography(objMatOfPoint2f, scnMatOfPoint2f, Calib3d.RANSAC, 3);

                Mat obj_corners = new Mat(4, 1, CvType.CV_32FC2);
                Mat scene_corners = new Mat(4, 1, CvType.CV_32FC2);

                obj_corners.put(0, 0, new double[] { 0, 0 });
                obj_corners.put(1, 0, new double[] { objectImage.cols(), 0 });
                obj_corners.put(2, 0, new double[] { objectImage.cols(), objectImage.rows() });
                obj_corners.put(3, 0, new double[] { 0, objectImage.rows() });

                Core.perspectiveTransform(obj_corners, scene_corners, homography);

                Mat img = Imgcodecs.imread(Scene, Imgcodecs.CV_LOAD_IMAGE_COLOR);
                //draw a green square around the matched object
                Imgproc.line(img, new Point(scene_corners.get(0, 0)), new Point(scene_corners.get(1, 0)),
                        new Scalar(0, 255, 0), 10);
                Imgproc.line(img, new Point(scene_corners.get(1, 0)), new Point(scene_corners.get(2, 0)),
                        new Scalar(0, 255, 0), 10);
                Imgproc.line(img, new Point(scene_corners.get(2, 0)), new Point(scene_corners.get(3, 0)),
                        new Scalar(0, 255, 0), 10);
                Imgproc.line(img, new Point(scene_corners.get(3, 0)), new Point(scene_corners.get(0, 0)),
                        new Scalar(0, 255, 0), 10);

                MatOfDMatch goodMatches = new MatOfDMatch();
                goodMatches.fromList(goodMatchesList);

                Features2d.drawMatches(objectImage, objectKeyPoints, sceneImage, sceneKeyPoints, goodMatches,
                        matchoutput, matchestColor, newKeypointColor, new MatOfByte(), 2);
                //output image with match, image of the match locations and keypoints image
                String folder = "E:\\Users\\Jamie\\Documents\\NetBeansProjects\\VinylSleeveDetection\\Output\\";
                Imgcodecs.imwrite(folder + "outputImage.jpg", outputImage);
                Imgcodecs.imwrite(folder + "matchoutput.jpg", matchoutput);
                Imgcodecs.imwrite(folder + "found.jpg", img);
                count = j;
                break;
            } else {
                System.out.println("Object Not Found");
                count = 0;
            }

        }

    }
}