java调用opencv的sift方法

简介: java调用opencv的sift方法

网络异常,图片无法展示
|


代码找了好多,但是没有java版本的


网络异常,图片无法展示
|


网络异常,图片无法展示
|


public static void TestSift(Mat image1,Mat image2) {
Mat clone1=image1.clone();
Mat src1=image1.clone();
Mat clone2=image2.clone();
Mat src2=image2.clone();
Imgproc.GaussianBlur(clone1, clone1, new Size(3, 3), 0, 0);
Imgproc.cvtColor(clone1, clone1,Imgproc.COLOR_BGR2GRAY);
Imgproc.GaussianBlur(clone2, clone2, new Size(3, 3), 0, 0);
Imgproc.cvtColor(clone2, clone2,Imgproc.COLOR_BGR2GRAY);
MatOfKeyPoint keypoints1 = new MatOfKeyPoint();
MatOfKeyPoint keypoints2 = new MatOfKeyPoint();
Mat des1=new Mat();
Mat des2=new Mat();
//  匹配的点数
SIFT sift=SIFT.create(200);
  //提取对象关键点
//  sift.detect(clone1,keypoints1);
//  sift.detect(clone2,keypoints2);
  //提取描述子
//  sift.compute(clone1,keypoints1, des1);
//  sift.compute(clone2,keypoints2, des2);
sift.detectAndCompute(clone1, new Mat(), keypoints1, des1);
sift.detectAndCompute(clone2, new Mat(), keypoints2, des2);
MatOfDMatch md=new  MatOfDMatch();
FlannBasedMatcher matcher=FlannBasedMatcher.create();
matcher.match(des1, des2, md);
double maxDist = 0;
double minDist = 50;
DMatch[] mats = md.toArray();
List<DMatch> bestMatches= new ArrayList<DMatch>();
for (int i = 0; i < mats.length; i++) {
  double dist = mats[i].distance;
  if (dist < minDist) {
    minDist = dist;
  }
  if (dist > maxDist) {
    maxDist = dist;
  }
}
System.out.println("max_dist : "+maxDist);
System.out.println("min_dist : "+minDist);
double threshold = 3 * minDist;
double threshold2 = 2 * minDist;
if (threshold2 >= maxDist){
    threshold = minDist * 1.1;
}
else if (threshold >= maxDist){
    threshold = threshold2 * 1.4;
}
if(0d==threshold) {
  threshold=0.3*maxDist;
}
System.out.println("Threshold : "+threshold);
for (int i = 0; i < mats.length; i++)
{
  //distance越小,代表DMatch的匹配率越高,
    Double dist = (double) mats[i].distance;
    System.out.println(String.format(i + " match distance best : %s", dist));
    if (dist <= threshold)
    {
        bestMatches.add(mats[i]);
        System.out.println(String.format(i + " best match added : %s", dist));
    }
}
md.fromList(bestMatches);
Mat result=new Mat();
Features2d.drawMatches(src1, keypoints1, src2, keypoints2, md, result);
HighGui.imshow("SIFT", result);
}
复制代码


knn写法


public static void TestSiftKnn(Mat image1,Mat image2) {
  //FastFeatureDetector detector = FastFeatureDetector.create(FastFeatureDetector.FAST_N);
  Mat clone1=image1.clone();
  Mat src1=image1.clone();
  Mat clone2=image2.clone();
  Mat src2=image2.clone();
  Imgproc.GaussianBlur(clone1, clone1, new Size(3, 3), 0, 0);
  Imgproc.cvtColor(clone1, clone1,Imgproc.COLOR_BGR2GRAY);
  Imgproc.GaussianBlur(clone2, clone2, new Size(3, 3), 0, 0);
  Imgproc.cvtColor(clone2, clone2,Imgproc.COLOR_BGR2GRAY);
  MatOfKeyPoint keypoints1 = new MatOfKeyPoint();
  MatOfKeyPoint keypoints2 = new MatOfKeyPoint();
  Mat des1=new Mat();
  Mat des2=new Mat();
  SIFT sift=SIFT.create(200);
  //提取对象关键点
//  sift.detect(clone1,keypoints1);
//  sift.detect(clone2,keypoints2);
  //提取描述子
//  sift.compute(clone1,keypoints1, des1);
//  sift.compute(clone2,keypoints2, des2);
  sift.detectAndCompute(clone1, new Mat(), keypoints1, des1);
  sift.detectAndCompute(clone2, new Mat(), keypoints2, des2);
  MatOfDMatch md=new  MatOfDMatch();
  FlannBasedMatcher matcher=FlannBasedMatcher.create();
  //matcher.match(des1, des2, md);
  List<Mat> matList=new ArrayList<Mat>();
  List<MatOfDMatch> mdList=new ArrayList<MatOfDMatch>();
  matList.add(des1);
    matcher.add(matList);
    matcher.train();
    matcher.knnMatch(des2, mdList, 2);
    List<DMatch> dMatchList = new ArrayList<DMatch>();
    Iterator<MatOfDMatch> ite=mdList.iterator();
    while(ite.hasNext()) {
      MatOfDMatch next=ite.next();
      if (next.toArray()[0].distance < 0.2 * next.toArray()[1].distance) {
        System.out.println(next.toArray()[0].distance+"->"+next.toArray()[1].distance);
        dMatchList.add(next.toArray()[0]);
      }else {
        ite.remove();
      }
    }
   md.fromList(dMatchList);
  Mat result=new Mat();
//  Features2d.drawMatches(src1, keypoints1, src2, keypoints2, md, result);
  Features2d.drawMatchesKnn(src1, keypoints1, src2, keypoints2, mdList, result);
  HighGui.imshow("SIFT", result);
}


相关文章
|
3月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
3月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
107 9
|
14天前
|
存储 Java 索引
Java快速入门之数组、方法
### Java快速入门之数组与方法简介 #### 一、数组 数组是一种容器,用于存储同种数据类型的多个值。定义数组时需指定数据类型,如`int[]`只能存储整数。数组的初始化分为静态和动态两种: - **静态初始化**:直接指定元素,系统自动计算长度,如`int[] arr = {1, 2, 3};` - **动态初始化**:手动指定长度,系统给定默认值,如`int[] arr = new int[3];` 数组访问通过索引完成,索引从0开始,最大索引为`数组.length - 1`。遍历数组常用`for`循环。常见操作包括求和、找最值、统计特定条件元素等。
|
10天前
|
Java
Java快速入门之类、对象、方法
本文简要介绍了Java快速入门中的类、对象和方法。首先,解释了类和对象的概念,类是对象的抽象,对象是类的具体实例。接着,阐述了类的定义和组成,包括属性和行为,并展示了如何创建和使用对象。然后,讨论了成员变量与局部变量的区别,强调了封装的重要性,通过`private`关键字隐藏数据并提供`get/set`方法访问。最后,介绍了构造方法的定义和重载,以及标准类的制作规范,帮助初学者理解如何构建完整的Java类。
|
6天前
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
37 9
|
12天前
|
安全 Java 程序员
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
43 12
|
13天前
|
算法 Java API
Java 方法注释:规范、实用和高质量的写法
本文深入探讨了如何编写高质量的 Java 方法注释
40 11
|
13天前
|
SQL Java 数据库连接
【潜意识Java】Java中JDBC过时方法的替代方案以及JDBC为什么过时详细分析
本文介绍了JDBC中一些常见过时方法及其替代方案。
35 5
|
3月前
|
安全 Java 开发者
Java中WAIT和NOTIFY方法必须在同步块中调用的原因
在Java多线程编程中,`wait()`和`notify()`方法是实现线程间协作的关键。这两个方法必须在同步块或同步方法中调用,这一要求背后有着深刻的原因。本文将深入探讨为什么`wait()`和`notify()`方法必须在同步块中调用,以及这一机制如何确保线程安全和避免死锁。
69 4
|
3月前
|
Java
深入探讨Java中的中断机制:INTERRUPTED和ISINTERRUPTED方法详解
在Java多线程编程中,中断机制是协调线程行为的重要手段。了解和正确使用中断机制对于编写高效、可靠的并发程序至关重要。本文将深入探讨Java中的`Thread.interrupted()`和`Thread.isInterrupted()`方法的区别及其应用场景。
98 4