parent
19c3cf45cc
commit
e1cd84bb25
4 changed files with 84 additions and 6 deletions
@ -1,6 +1,84 @@ |
|||||||
package org.opencv.test.features2d; |
package org.opencv.test.features2d; |
||||||
|
|
||||||
|
import org.opencv.calib3d.Calib3d; |
||||||
|
import org.opencv.core.CvType; |
||||||
|
import org.opencv.core.Mat; |
||||||
|
import org.opencv.core.Point; |
||||||
|
import org.opencv.core.Range; |
||||||
|
import org.opencv.features2d.DMatch; |
||||||
|
import org.opencv.features2d.DescriptorExtractor; |
||||||
|
import org.opencv.features2d.DescriptorMatcher; |
||||||
|
import org.opencv.features2d.FeatureDetector; |
||||||
|
import org.opencv.features2d.Features2d; |
||||||
|
import org.opencv.features2d.KeyPoint; |
||||||
|
import org.opencv.highgui.Highgui; |
||||||
import org.opencv.test.OpenCVTestCase; |
import org.opencv.test.OpenCVTestCase; |
||||||
|
import org.opencv.test.OpenCVTestRunner; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Arrays; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
public class features2dTest extends OpenCVTestCase { |
public class features2dTest extends OpenCVTestCase { |
||||||
|
|
||||||
|
public void testPTOD() |
||||||
|
{ |
||||||
|
String detectorCfg = "%YAML:1.0\nhessianThreshold: 4000.\noctaves: 3\noctaveLayers: 4\nupright: 0\n"; |
||||||
|
String extractorCfg = "%YAML:1.0\nnOctaves: 4\nnOctaveLayers: 2\nextended: 0\nupright: 0\n"; |
||||||
|
|
||||||
|
FeatureDetector detector = FeatureDetector.create(FeatureDetector.SURF); |
||||||
|
DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.SURF); |
||||||
|
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 = Highgui.imread(OpenCVTestRunner.LENA_PATH, Highgui.CV_LOAD_IMAGE_GRAYSCALE); |
||||||
|
Mat imgQuery = imgTrain.submat(new Range(0, imgTrain.rows()-100), Range.all()); |
||||||
|
|
||||||
|
List<KeyPoint> trainKeypoints = new ArrayList<KeyPoint>(); |
||||||
|
List<KeyPoint> queryKeypoints = new ArrayList<KeyPoint>(); |
||||||
|
|
||||||
|
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); |
||||||
|
|
||||||
|
List<DMatch> matches = new ArrayList<DMatch>(); |
||||||
|
|
||||||
|
matcher.add(Arrays.asList(trainDescriptors)); |
||||||
|
matcher.match(queryDescriptors, matches); |
||||||
|
|
||||||
|
//OpenCVTestRunner.Log("Matches found: " + matches.size());
|
||||||
|
|
||||||
|
List<Point> points1 = new ArrayList<Point>(); |
||||||
|
List<Point> points2 = new ArrayList<Point>(); |
||||||
|
|
||||||
|
for(int i = 0; i < matches.size(); i++){ |
||||||
|
DMatch match = matches.get(i); |
||||||
|
points1.add(trainKeypoints.get(match.trainIdx).pt); |
||||||
|
points2.add(queryKeypoints.get(match.queryIdx).pt); |
||||||
|
} |
||||||
|
|
||||||
|
Mat hmg = Calib3d.findHomography(points1, points2, Calib3d.RANSAC); |
||||||
|
|
||||||
|
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"); |
||||||
|
Highgui.imwrite(outputPath, outimg); |
||||||
|
//OpenCVTestRunner.Log("Output image is saved to: " + outputPath);
|
||||||
|
} |
||||||
} |
} |
||||||
|
Loading…
Reference in new issue