opencv的features2d包中提供了surf,sift和orb等特征点算法,用于图像查找图像对象,搜索对象,分析对象,识别对象,合成全景等场合。

研究这些算法的原理和实现,是图像识别基础,OPENCV库使用2.413

通过一些代码研究三种特征点算法,我有意把原始图像转为灰度并放置90与照处中人物比较,以研究三种算法对人脸识别的优点和局限。辅助使用了人脸查找获取待查找图像中人脸子矩阵。上代码。

import java.util.ArrayList;

import java.util.LinkedList;

import java.util.List;

import org.opencv.core.Core;

import org.opencv.core.Mat;

import org.opencv.core.MatOfDMatch;

import org.opencv.core.MatOfKeyPoint;

import org.opencv.core.MatOfRect;

import org.opencv.core.Size;

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.highgui.Highgui;

import org.opencv.imgproc.Imgproc;

import org.opencv.objdetect.CascadeClassifier;

public class ExtractSIFT2 {

public static void main(String[] args) {

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Mat src = Highgui.imread("E:/work/qqq/Y9.jpg");

Mat dst = Highgui.imread("E:/work/qqq/psb.jpg");

MatOfRect mr = getFace(dst);

Mat sub = dst.submat(mr.toArray()[0]);

Highgui.imwrite("E:/work/qqq/Y4.jpg", FeatureSurfBruteforce(src.t(), sub));

Highgui.imwrite("E:/work/qqq/Y5.jpg", FeatureSiftLannbased(src.t(), sub));

Highgui.imwrite("E:/work/qqq/Y6.jpg", FeatureOrbLannbased(src.t(), sub));

}

public static Mat FeatureSurfBruteforce(Mat src, Mat dst){

FeatureDetector fd = FeatureDetector.create(FeatureDetector.SURF);

DescriptorExtractor de = DescriptorExtractor.create(DescriptorExtractor.SURF);

//DescriptorMatcher Matcher = DescriptorMatcher.create(DescriptorMatcher.FLANNBASED);

DescriptorMatcher Matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_L1);

MatOfKeyPoint mkp = new MatOfKeyPoint();

fd.detect(src, mkp);

Mat desc = new Mat();

de.compute(src, mkp, desc);

Features2d.drawKeypoints(src, mkp, src);

MatOfKeyPoint mkp2 = new MatOfKeyPoint();

fd.detect(dst, mkp2);

Mat desc2 = new Mat();

de.compute(dst, mkp2, desc2);

Features2d.drawKeypoints(dst, mkp2, dst);

// Matching features

MatOfDMatch Matches = new MatOfDMatch();

Matcher.match(desc, desc2, Matches);

double maxDist = Double.MIN_VALUE;

double minDist = Double.MAX_VALUE;

DMatch[] mats = Matches.toArray();

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("Min Distance:" + minDist);

System.out.println("Max Distance:" + maxDist);

List goodMatch = new LinkedList<>();

for (int i = 0; i < mats.length; i++) {

double dist = mats[i].distance;

if (dist < 3 * minDist && dist < 0.2f) {

goodMatch.add(mats[i]);

}

}

Matches.fromList(goodMatch);

// Show result

Mat OutImage = new Mat();

Features2d.drawMatches(src, mkp, dst, mkp2, Matches, OutImage);

return OutImage;

}

public static Mat FeatureSiftLannbased(Mat src, Mat dst){

FeatureDetector fd = FeatureDetector.create(FeatureDetector.SIFT);

DescriptorExtractor de = DescriptorExtractor.create(DescriptorExtractor.SIFT);

DescriptorMatcher Matcher = DescriptorMatcher.create(DescriptorMatcher.FLANNBASED);

MatOfKeyPoint mkp = new MatOfKeyPoint();

fd.detect(src, mkp);

Mat desc = new Mat();

de.compute(src, mkp, desc);

Features2d.drawKeypoints(src, mkp, src);

MatOfKeyPoint mkp2 = new MatOfKeyPoint();

fd.detect(dst, mkp2);

Mat desc2 = new Mat();

de.compute(dst, mkp2, desc2);

Features2d.drawKeypoints(dst, mkp2, dst);

// Matching features

MatOfDMatch Matches = new MatOfDMatch();

Matcher.match(desc, desc2, Matches);

List l = Matches.toList();

List goodMatch = new ArrayList();

for (int i = 0; i < l.size(); i++) {

DMatch dmatch = l.get(i);

if (Math.abs(dmatch.queryIdx - dmatch.trainIdx) < 10f) {

goodMatch.add(dmatch);

}

}

Matches.fromList(goodMatch);

// Show result

Mat OutImage = new Mat();

Features2d.drawMatches(src, mkp, dst, mkp2, Matches, OutImage);

return OutImage;

}

public static Mat FeatureOrbLannbased(Mat src, Mat dst){

FeatureDetector fd = FeatureDetector.create(FeatureDetector.ORB);

DescriptorExtractor de = DescriptorExtractor.create(DescriptorExtractor.ORB);

DescriptorMatcher Matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_L1);

MatOfKeyPoint mkp = new MatOfKeyPoint();

fd.detect(src, mkp);

Mat desc = new Mat();

de.compute(src, mkp, desc);

Features2d.drawKeypoints(src, mkp, src);

MatOfKeyPoint mkp2 = new MatOfKeyPoint();

fd.detect(dst, mkp2);

Mat desc2 = new Mat();

de.compute(dst, mkp2, desc2);

Features2d.drawKeypoints(dst, mkp2, dst);

// Matching features

MatOfDMatch Matches = new MatOfDMatch();

Matcher.match(desc, desc2, Matches);

double maxDist = Double.MIN_VALUE;

double minDist = Double.MAX_VALUE;

DMatch[] mats = Matches.toArray();

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("Min Distance:" + minDist);

System.out.println("Max Distance:" + maxDist);

List goodMatch = new LinkedList<>();

for (int i = 0; i < mats.length; i++) {

double dist = mats[i].distance;

if (dist < 3 * minDist && dist < 0.2f) {

goodMatch.add(mats[i]);

}

}

Matches.fromList(goodMatch);

// Show result

Mat OutImage = new Mat();

Features2d.drawMatches(src, mkp, dst, mkp2, Matches, OutImage);

//Highgui.imwrite("E:/work/qqq/Y4.jpg", OutImage);

return OutImage;

}

public static MatOfRect getFace(Mat src) {

Mat result = src.clone();

if (src.cols() > 1000 || src.rows() > 1000) {

Imgproc.resize(src, result, new Size(src.cols() / 3, src.rows() / 3));

}

CascadeClassifier faceDetector = new CascadeClassifier("./resource/haarcascade_frontalface_alt2.xml");

MatOfRect objDetections = new MatOfRect();

faceDetector.detectMultiScale(result, objDetections);

return objDetections;

}

}

人脸灰度图,待处理的图片和处理后三种方法对比,做了一些简单的取优。结果来看,orb算法似乎优于其他两种。

参考:

http://blog.csdn.net/liufanghuangdi/article/details/52957094?locationNum=2&fps=1

http://blog.csdn.net/shuzhe66/article/details/40824883

opencv java 特征提取_OPENCV特征点java提取与匹配与比较相关推荐

  1. opencv曝光算法_OpenCV特征点提取算法对比

    除了我们熟知的SIFT.SURF.ORB等特征点提取算法,OpenCV中还提供了十余种特征点提取算法.最近在整理以往的ppt和报告,看到其中一页ppt,发现已经忘得差不多了,就再写篇博客复习下好了,这 ...

  2. 基于标志点特征高精提取与匹配方法,进行双目、结构光、RGBD相机、单目相机多视拼接

    1. 工作原理 人工张贴标志点 变换位置拍照 相邻照片的公共视野内有相同的标志点群 匹配两张照片对应标志点对 通过三对以上标志点对,实现两张照片间的坐标变换求解 2.标志点特征 圆形 分类: 编码(粘 ...

  3. Java面向对象三大特征---继承

    系列文章目录 Java面向对象三大特征-多态 Java面向对象三大特征-封装 文章目录 系列文章目录 前言 一.概念 二.举例说明 三.语句格式 三.为何要使用继承 四.super与this关键字 五 ...

  4. 特征描述子提取公用接口

    OpenCV封装了一些特征描述子提取算法,使得用户能够解决该问题时候方便使用各种算法.这章用来计算的描述子提取被表达成一个高维空间的向量 vector.所有实现 vector 特征描述子子提取的部分继 ...

  5. 学习LOAM笔记——特征点提取与匹配

    学习LOAM笔记--特征点提取与匹配 学习LOAM笔记--特征点提取与匹配 1. 特征点提取 1.1 对激光点按线束分类 1.2 计算激光点曲率 1.3 根据曲率提取特征点 2. 特征点匹配 2.1 ...

  6. opencv上gpu版surf特征点与orb特征点提取及匹配实例

    opencv上gpu版surf特征点与orb特征点提取及匹配实例 标签: gpu版surfgpu orbsurf和orbgpu surf及orbsurf orb gpu 2016-09-25 23:4 ...

  7. Java实现从Html文本中提取纯文本

    1.应用场景:从一份html文件中或从String(是html内容)中提取纯文本,去掉网页标签: 2.代码一:replaceAll搞定 //从html中提取纯文本public static Strin ...

  8. Java线程新特征——Java并发库

    一.线程池   Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定 ...

  9. 学习OpenCV——BOW特征提取函数(特征点篇)

    没日没夜的改论文生活终于要告一段落了,比起改论文,学OpenCV就是一件幸福的事情.OpenCV的发展越来越完善了,已经可以直接使用BOW函数来进行对象分类了. 简单的通过特征点分类的方法:     ...

  10. java 取文本中间_Java 如何利用正则表达式提取两个指定标记符号之间的字符串内容...

    Java 开发中,我们往往需要从非结构化的文本数据中截取两个特定字符之间的内容,可以利用正则表达式获取其间信息. 解决方法 将正则表达式用 Pattern 类的静态方法 compile 一个对象,该对 ...

最新文章

  1. 【freeCodeCamp】免费晋级前台工程师呦!!!!
  2. mysql 重置id
  3. 025_html表格
  4. 【Asp.Net】:如何处理大量页面的身份验证跳转
  5. JVM—如何利用虚拟机栈进行函数调用?
  6. 计算机绘制轴类零件图,轴类零件工序图自动绘制的方法和系统研究
  7. tomcat配置https_「Java」 - Tomcat amp; 配置HTTPS
  8. python写一个crm系统_用Python打造一个CRM系统(四)
  9. c语言for循环可以初始化多个变量么_C8循环
  10. SQLServer 2012 可视化窗口中,设置“时间”默认值为“当前时间
  11. java linux和windows下文件路径间隔符的写法——解决linux下程序在windows下运行时的上传文件出错问题...
  12. 狂神说shiro案例源码
  13. 打印工资条怎么做到每个人都有表头明细_一键批量生成工资条并群发,操作步骤详解...
  14. delphi微信授权登陆
  15. “繁盛计划”,纾困中国餐饮难题背后的美团式解法
  16. 数学建模——计算机工具的使用(1)——SPSS操作以及在统计分析中的应用
  17. 2019中南大学计算机考研分数线,中南大学2019考研分数线已公布
  18. 对arr与arr的理解
  19. 【Go】基于telegraf进行自定义插件开发(一)
  20. win10如何设置pdf默认打开方式

热门文章

  1. 如何从超级用户进入非超级用户
  2. 内推 |阿里大文娱-数据分析(广州/北京)
  3. 基于ggplot2网络可视化(二)
  4. R for data science 之 stringr包
  5. mysql5.5编译安装_mysql5.5编译安装及配置
  6. MongoDb系列文章
  7. [JSOI2008] 最小生成树计数
  8. NestedScrollView嵌套ListView可行性总结
  9. JavaScript自定义滚动条
  10. 无敌打印(适用各种浏览器自带打印功能)