package org.opencv.test.features2d; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.opencv.calib3d.Calib3d; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.core.MatOfInt; import org.opencv.core.MatOfDMatch; import org.opencv.core.MatOfKeyPoint; import org.opencv.core.MatOfPoint2f; import org.opencv.core.Point; import org.opencv.core.Range; import org.opencv.core.Scalar; import org.opencv.core.DMatch; import org.opencv.features2d.DescriptorMatcher; import org.opencv.features2d.Features2d; import org.opencv.core.KeyPoint; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.test.OpenCVTestCase; import org.opencv.test.OpenCVTestRunner; import org.opencv.features2d.Feature2D; public class Features2dTest extends OpenCVTestCase { public void testDrawKeypointsMatListOfKeyPointMat() { fail("Not yet implemented"); } public void testDrawKeypointsMatListOfKeyPointMatScalar() { fail("Not yet implemented"); } public void testDrawKeypointsMatListOfKeyPointMatScalarInt() { fail("Not yet implemented"); } public void testDrawMatches2MatListOfKeyPointMatListOfKeyPointListOfListOfDMatchMat() { fail("Not yet implemented"); } public void testDrawMatches2MatListOfKeyPointMatListOfKeyPointListOfListOfDMatchMatScalar() { fail("Not yet implemented"); } public void testDrawMatches2MatListOfKeyPointMatListOfKeyPointListOfListOfDMatchMatScalarScalar() { fail("Not yet implemented"); } public void testDrawMatches2MatListOfKeyPointMatListOfKeyPointListOfListOfDMatchMatScalarScalarListOfListOfByte() { fail("Not yet implemented"); } public void testDrawMatches2MatListOfKeyPointMatListOfKeyPointListOfListOfDMatchMatScalarScalarListOfListOfByteInt() { fail("Not yet implemented"); } public void testDrawMatchesMatListOfKeyPointMatListOfKeyPointListOfDMatchMat() { fail("Not yet implemented"); } public void testDrawMatchesMatListOfKeyPointMatListOfKeyPointListOfDMatchMatScalar() { fail("Not yet implemented"); } public void testDrawMatchesMatListOfKeyPointMatListOfKeyPointListOfDMatchMatScalarScalar() { fail("Not yet implemented"); } public void testDrawMatchesMatListOfKeyPointMatListOfKeyPointListOfDMatchMatScalarScalarListOfByte() { fail("Not yet implemented"); } public void testDrawMatchesMatListOfKeyPointMatListOfKeyPointListOfDMatchMatScalarScalarListOfByteInt() { fail("Not yet implemented"); } public void testPTOD() { String detectorCfg = "%YAML:1.0\n---\nhessianThreshold: 4000.\noctaves: 3\noctaveLayers: 4\nupright: 0\n"; String extractorCfg = "%YAML:1.0\n---\nnOctaves: 4\nnOctaveLayers: 2\nextended: 0\nupright: 0\n"; Feature2D detector = createClassInstance(XFEATURES2D+"SURF", DEFAULT_FACTORY, null, null); Feature2D extractor = createClassInstance(XFEATURES2D+"SURF", DEFAULT_FACTORY, null, null); DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE); String detectorCfgFile = OpenCVTestRunner.getTempFileName("yml"); writeFile(detectorCfgFile, detectorCfg); detector.read(detectorCfgFile); String extractorCfgFile = OpenCVTestRunner.getTempFileName("yml"); writeFile(extractorCfgFile, extractorCfg); extractor.read(extractorCfgFile); Mat imgTrain = Imgcodecs.imread(OpenCVTestRunner.LENA_PATH, Imgcodecs.IMREAD_GRAYSCALE); Mat imgQuery = imgTrain.submat(new Range(0, imgTrain.rows() - 100), Range.all()); MatOfKeyPoint trainKeypoints = new MatOfKeyPoint(); MatOfKeyPoint queryKeypoints = new MatOfKeyPoint(); detector.detect(imgTrain, trainKeypoints); detector.detect(imgQuery, queryKeypoints); // OpenCVTestRunner.Log("Keypoints found: " + trainKeypoints.size() + // ":" + queryKeypoints.size()); Mat trainDescriptors = new Mat(); Mat queryDescriptors = new Mat(); extractor.compute(imgTrain, trainKeypoints, trainDescriptors); extractor.compute(imgQuery, queryKeypoints, queryDescriptors); MatOfDMatch matches = new MatOfDMatch(); matcher.add(Arrays.asList(trainDescriptors)); matcher.match(queryDescriptors, matches); // OpenCVTestRunner.Log("Matches found: " + matches.size()); DMatch adm[] = matches.toArray(); List lp1 = new ArrayList(adm.length); List lp2 = new ArrayList(adm.length); KeyPoint tkp[] = trainKeypoints.toArray(); KeyPoint qkp[] = queryKeypoints.toArray(); for (int i = 0; i < adm.length; i++) { DMatch dm = adm[i]; lp1.add(tkp[dm.trainIdx].pt); lp2.add(qkp[dm.queryIdx].pt); } MatOfPoint2f points1 = new MatOfPoint2f(lp1.toArray(new Point[0])); MatOfPoint2f points2 = new MatOfPoint2f(lp2.toArray(new Point[0])); Mat hmg = Calib3d.findHomography(points1, points2, Calib3d.RANSAC, 3); assertMatEqual(Mat.eye(3, 3, CvType.CV_64F), hmg, EPS); Mat outimg = new Mat(); Features2d.drawMatches(imgQuery, queryKeypoints, imgTrain, trainKeypoints, matches, outimg); String outputPath = OpenCVTestRunner.getOutputFileName("PTODresult.png"); Imgcodecs.imwrite(outputPath, outimg); // OpenCVTestRunner.Log("Output image is saved to: " + outputPath); } public void testDrawKeypoints() { Mat outImg = Mat.ones(11, 11, CvType.CV_8U); MatOfKeyPoint kps = new MatOfKeyPoint(new KeyPoint(5, 5, 1)); // x, y, size Features2d.drawKeypoints(new Mat(), kps, outImg, new Scalar(255), Features2d.DrawMatchesFlags_DRAW_OVER_OUTIMG); Mat ref = new MatOfInt(new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 15, 54, 15, 1, 1, 1, 1, 1, 1, 1, 76, 217, 217, 221, 81, 1, 1, 1, 1, 1, 100, 224, 111, 57, 115, 225, 101, 1, 1, 1, 44, 215, 100, 1, 1, 1, 101, 214, 44, 1, 1, 54, 212, 57, 1, 1, 1, 55, 212, 55, 1, 1, 40, 215, 104, 1, 1, 1, 105, 215, 40, 1, 1, 1, 102, 221, 111, 55, 115, 222, 103, 1, 1, 1, 1, 1, 76, 218, 217, 220, 81, 1, 1, 1, 1, 1, 1, 1, 15, 55, 15, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }).reshape(1, 11); ref.convertTo(ref, CvType.CV_8U); assertMatEqual(ref, outImg); } }