Java基于OpenCV的Surf特征检测与匹配
2015-04-13 15:56
465 查看
Mat srcImage = Highgui.imread("e:\\1.jpg");
Mat destImage = Highgui.imread("e:\\2.jpg");
if(srcImage.empty()||destImage.empty()){
System.out.println("图片读写失败");
return;
}
FeatureDetector dectorSurf = FeatureDetector.create(FeatureDetector.SURF);
MatOfKeyPoint srcKeyPoints=new MatOfKeyPoint();
MatOfKeyPoint destKeyPoints=new MatOfKeyPoint();
dectorSurf.detect(srcImage, srcKeyPoints);
dectorSurf.detect(destImage, destKeyPoints);
DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.SURF);
Mat srcDescriptor=new Mat();
Mat descDescriptor=new Mat();
extractor.compute(srcImage, srcKeyPoints, srcDescriptor);
extractor.compute(destImage, destKeyPoints, descDescriptor);
DescriptorMatcher descriptorMatcher = DescriptorMatcher.create(DescriptorMatcher.FLANNBASED);
MatOfDMatch matches=new MatOfDMatch();
descriptorMatcher.match(srcDescriptor, descDescriptor, matches);
double maxDistance=0; double minDistance=100;
for(int i=0; i<srcDescriptor.rows(); i++){
if(maxDistance<matches.toList().get(i).distance){
maxDistance = matches.toList().get(i).distance;
}
if(minDistance>matches.toList().get(i).distance){
minDistance = matches.toList().get(i).distance;
}
}
List<DMatch> goodMatchs = new ArrayList<DMatch>();
for(int i=0; i<srcDescriptor.rows(); i++){
if(matches.toList().get(i).distance<3*minDistance){
goodMatchs.add(matches.toList().get(i));
}
}
List<MatOfByte> matchesMask= new ArrayList<MatOfByte>();
Mat outMat = new Mat();
MatOfDMatch goodMatchsALl = new MatOfDMatch();
goodMatchsALl.fromList(goodMatchs);
List<MatOfDMatch> matchList = new ArrayList<MatOfDMatch>();
matchList.add(goodMatchsALl);
Features2d.drawMatches2(srcImage, srcKeyPoints, destImage, destKeyPoints, matchList, outMat, Scalar.all(-1), Scalar.all(-1), matchesMask, Features2d.NOT_DRAW_SINGLE_POINTS);
Highgui.imwrite("e:\\3.jpg", outMat);
Mat destImage = Highgui.imread("e:\\2.jpg");
if(srcImage.empty()||destImage.empty()){
System.out.println("图片读写失败");
return;
}
FeatureDetector dectorSurf = FeatureDetector.create(FeatureDetector.SURF);
MatOfKeyPoint srcKeyPoints=new MatOfKeyPoint();
MatOfKeyPoint destKeyPoints=new MatOfKeyPoint();
dectorSurf.detect(srcImage, srcKeyPoints);
dectorSurf.detect(destImage, destKeyPoints);
DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.SURF);
Mat srcDescriptor=new Mat();
Mat descDescriptor=new Mat();
extractor.compute(srcImage, srcKeyPoints, srcDescriptor);
extractor.compute(destImage, destKeyPoints, descDescriptor);
DescriptorMatcher descriptorMatcher = DescriptorMatcher.create(DescriptorMatcher.FLANNBASED);
MatOfDMatch matches=new MatOfDMatch();
descriptorMatcher.match(srcDescriptor, descDescriptor, matches);
double maxDistance=0; double minDistance=100;
for(int i=0; i<srcDescriptor.rows(); i++){
if(maxDistance<matches.toList().get(i).distance){
maxDistance = matches.toList().get(i).distance;
}
if(minDistance>matches.toList().get(i).distance){
minDistance = matches.toList().get(i).distance;
}
}
List<DMatch> goodMatchs = new ArrayList<DMatch>();
for(int i=0; i<srcDescriptor.rows(); i++){
if(matches.toList().get(i).distance<3*minDistance){
goodMatchs.add(matches.toList().get(i));
}
}
List<MatOfByte> matchesMask= new ArrayList<MatOfByte>();
Mat outMat = new Mat();
MatOfDMatch goodMatchsALl = new MatOfDMatch();
goodMatchsALl.fromList(goodMatchs);
List<MatOfDMatch> matchList = new ArrayList<MatOfDMatch>();
matchList.add(goodMatchsALl);
Features2d.drawMatches2(srcImage, srcKeyPoints, destImage, destKeyPoints, matchList, outMat, Scalar.all(-1), Scalar.all(-1), matchesMask, Features2d.NOT_DRAW_SINGLE_POINTS);
Highgui.imwrite("e:\\3.jpg", outMat);
相关文章推荐
- 14基于opencv的重映射_SURF特征点检测
- OpenCV中feature2D学习——FAST特征点检测与SIFT/SURF/BRIEF特征提取与匹配
- 15基于opencv的旋转_仿射变换_SURF特征点检测
- opencv图像特征检测及匹配(harris,sift,surf,fast,breif,orb,BFmatch,FlannBasedMatcher)
- [置顶] 基于opencv-3.4.0的图像特征点提取及图像匹配(Java 版)
- OpenCV中基于HOG特征的行人检测
- opencv3中SURF特征点检测
- OpenCV特征点检测匹配图像-----添加包围盒
- OpenCV特征点检测——Surf(特征点篇)&flann
- opencv3.1 surf特征匹配
- OpenCV特征点检测匹配图像-----添加包围盒
- opencv之特征检测与匹配(三)
- 基于SURF特征的目标检测
- OpenCV特征点检测------Surf(特征点篇)
- OpenCV特征点检测匹配图像-----添加包围盒
- OpenCV: Features2D Features FrameWork 图像二维特征检测、描述以及匹配框架的层次解析
- 基于Harris的特征检测与匹配
- OpenCV成长之路(9):特征点检测与图像匹配
- VS2013+opencv2.4.13测试surf特征匹配时报未定义标识符错误
- 【OpenCV入门教程之十七】OpenCV重映射 & SURF特征点检测合辑