173 lines
6.6 KiB
Java
173 lines
6.6 KiB
Java
|
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<Point> lp1 = new ArrayList<Point>(adm.length);
|
||
|
List<Point> lp2 = new ArrayList<Point>(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);
|
||
|
}
|
||
|
}
|