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. 修改IDEA项目的JDK应用路径
  2. SAP RETAIL 特征参数文件(Characteristic Profile) II
  3. android camera2获取摄像头支持的分辨率
  4. IDEA快捷键拆解系列(五):Navigate篇
  5. TCP协议三次握手连接四次握手断开和DOS攻击
  6. Spring快速入门及深入
  7. 云开发系列课程让你从入门到精通快速上手Serverless和云开发技术
  8. mysql innodb id_MySQL InnoDB row_id边界溢出验证的方法步骤
  9. WinForm控件开发总结(五)-----为控件的复杂属性提供类型转换器
  10. 【小白的刷题之路】字符统计
  11. 集中式还是分布式?账务类数据库架构的选型
  12. JavaScript 虽火,但不要轻易去追随!
  13. python的文件夹_Python文件夹与文件的操作
  14. iOS 证书, provision profile作用
  15. Nginx 配置文件 nginx.conf 说明、内置变量、常用命令
  16. api-ms-win-crt-runtime-l1-1-0.dll丢失问题
  17. 解决GLIDE4.0和圆角裁剪CENTERCROP冲突
  18. 如何查看计算机的硬盘序列号,电脑硬盘序列号怎么查?一招查看硬盘序列号的简单方法...
  19. CryptoJS加密库使用及bug解决
  20. 北京家庭摇号积分计算方式

热门文章

  1. Microsoft Security Essentials升级到2.0测试版 失败时的解决办法
  2. ORACLE11G常用函数
  3. Python pip windows安装
  4. 【算法与数据结构】哈希表-链地址法
  5. php 获取客户端的ip、地理信息、浏览器信息、本地真实ip
  6. 用户控件中复杂属性的设计时支持
  7. 浏览器往返缓存(Back/Forward cache)问题的分析与解决
  8. Kongzue的APP拍照相册选择工具
  9. 详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
  10. 基于react/vue的移动端终极适配方案(更新css-modules配置)