根据前面surf简化版的结构,重新把ORB检测的代码给简化以下,发现虽然速度一样,确实能省好多行代码,关键是有

BruteForceMatcher<HammingLUT>matcher的帮忙,直接省的写了一个函数;

NB类型:class gpu::BruteForceMatcher_GPU

再加上findHomography,之后perspectiveTransform就可以location,但是这样速度很慢;

于是改动一下,求matches的keypoints的x与y坐标和的平均值,基本上就是对象中心!!!

以这个点为中心画与原对象大小相同的矩形框,就可以定位出大概位置,但是肯定不如透视变换准确,而且不具有尺度不变性。

但是鲁棒性应该更好,因为,只要能match成功,基本都能定位中心,但是透视变换有时却因为尺度变换过大等因素,画出很不靠谱的矩形框!

  1. #include "opencv2/objdetect/objdetect.hpp"
  2. #include "opencv2/features2d/features2d.hpp"
  3. #include "opencv2/highgui/highgui.hpp"
  4. #include "opencv2/calib3d/calib3d.hpp"
  5. #include "opencv2/imgproc/imgproc_c.h"
  6. #include "opencv2/imgproc/imgproc.hpp"
  7. #include <string>
  8. #include <vector>
  9. #include <iostream>
  10. using namespace cv;
  11. using namespace std;
  12. char* image_filename1 = "D:/src.jpg";
  13. char* image_filename2 = "D:/Demo.jpg";
  14. int main()
  15. {
  16. Mat img1 = imread( image_filename1, CV_LOAD_IMAGE_GRAYSCALE );
  17. Mat img2 = imread( image_filename2, CV_LOAD_IMAGE_GRAYSCALE );
  18. int64 st,et;
  19. ORB orb1(30,ORB::CommonParams(1.2,1));
  20. ORB orb2(100,ORB::CommonParams(1.2,1));
  21. vector<KeyPoint>keys1,keys2;
  22. Mat descriptor1,descriptor2;
  23. orb1(img1,Mat(),keys1,descriptor1,false);
  24. st=getTickCount();
  25. orb2(img2,Mat(),keys2,descriptor2,false);
  26. et=getTickCount()-st;
  27. et=et*1000/(double)getTickFrequency();
  28. cout<<"extract time:"<<et<<"ms"<<endl;
  29. vector<DMatch> matches;
  30. //<em>class </em><tt class="descclassname">gpu::</tt><tt class="descname"><span class="highlighted">BruteForce</span>Matcher_GPU</tt>
  31. BruteForceMatcher<HammingLUT>matcher;//BruteForceMatcher支持<Hamming> <L1<float>> <L2<float>>
  32. //FlannBasedMatcher matcher;不支持
  33. st=getTickCount();
  34. matcher.match(descriptor1,descriptor2,matches);
  35. et=getTickCount()-st;
  36. et=et*1000/getTickFrequency();
  37. cout<<"match time:"<<et<<"ms"<<endl;
  38. Mat img_matches;
  39. drawMatches( img1, keys1, img2, keys2,
  40. matches, img_matches, Scalar::all(-1), Scalar::all(-1),
  41. vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );
  42. imshow("match",img_matches);
  43. cout<<"match size:"<<matches.size()<<endl;
  44. /*
  45. Mat showImg;
  46. drawMatches(img1,keys1,img2,keys2,matchs,showImg);
  47. imshow( "win", showImg );
  48. */
  49. waitKey(0);
  50. st=getTickCount();
  51. vector<Point2f>pt1;
  52. vector<Point2f>pt2;
  53. float x=0,y=0;
  54. for(size_t i=0;i<matches.size();i++)
  55. {
  56. pt1.push_back(keys1[matches[i].queryIdx].pt);
  57. pt2.push_back(keys2[matches[i].trainIdx].pt);
  58. x+=keys2[matches[i].trainIdx].pt.x;
  59. y+=keys2[matches[i].trainIdx].pt.y;
  60. }
  61. x=x/matches.size();
  62. y=y/matches.size();
  63. Mat homo;
  64. homo=findHomography(pt1,pt2,CV_RANSAC);
  65. vector<Point2f>src_cornor(4);
  66. vector<Point2f>dst_cornor(4);
  67. src_cornor[0]=cvPoint(0,0);
  68. src_cornor[1]=cvPoint(img1.cols,0);
  69. src_cornor[2]=cvPoint(img1.cols,img1.rows);
  70. src_cornor[3]=cvPoint(0,img1.rows);
  71. perspectiveTransform(src_cornor,dst_cornor,homo);
  72. Mat img=imread(image_filename2,1);
  73. line(img,dst_cornor[0],dst_cornor[1],Scalar(255,0,0),2);
  74. line(img,dst_cornor[1],dst_cornor[2],Scalar(255,0,0),2);
  75. line(img,dst_cornor[2],dst_cornor[3],Scalar(255,0,0),2);
  76. line(img,dst_cornor[3],dst_cornor[0],Scalar(255,0,0),2);
  77. /*
  78. line(img,cvPoint((int)dst_cornor[0].x,(int)dst_cornor[0].y),cvPoint((int)dst_cornor[1].x,(int)dst_cornor[1].y),Scalar(255,0,0),2);
  79. line(img,cvPoint((int)dst_cornor[1].x,(int)dst_cornor[1].y),cvPoint((int)dst_cornor[2].x,(int)dst_cornor[2].y),Scalar(255,0,0),2);
  80. line(img,cvPoint((int)dst_cornor[2].x,(int)dst_cornor[2].y),cvPoint((int)dst_cornor[3].x,(int)dst_cornor[3].y),Scalar(255,0,0),2);
  81. line(img,cvPoint((int)dst_cornor[3].x,(int)dst_cornor[3].y),cvPoint((int)dst_cornor[0].x,(int)dst_cornor[0].y),Scalar(255,0,0),2);
  82. */
  83. circle(img,Point(x,y),10,Scalar(0,0,255),3,CV_FILLED);
  84. line(img,Point(x-img1.cols/2,y-img1.rows/2),Point(x+img1.cols/2,y-img1.rows/2),Scalar(0,0,255),2);
  85. line(img,Point(x+img1.cols/2,y-img1.rows/2),Point(x+img1.cols/2,y+img1.rows/2),Scalar(0,0,255),2);
  86. line(img,Point(x+img1.cols/2,y+img1.rows/2),Point(x-img1.cols/2,y+img1.rows/2),Scalar(0,0,255),2);
  87. line(img,Point(x-img1.cols/2,y+img1.rows/2),Point(x-img1.cols/2,y-img1.rows/2),Scalar(0,0,255),2);
  88. imshow("location",img);
  89. et=getTickCount()-st;
  90. et=et*1000/getTickFrequency();
  91. cout<<"location time:"<<et<<"ms"<<endl;
  92. waitKey(0);
  93. }

from: http://blog.csdn.net/yangtrees/article/details/7545820

学习OpenCV——ORB简化版&Location加速版的更多相关文章

  1. 学习OpenCV——Surf简化版

    之前写过一遍关于学习surf算法的blog:http://blog.csdn.net/sangni007/article/details/7482960 但是代码比较麻烦,而且其中还涉及到flann算 ...

  2. Keras学习环境配置-GPU加速版(Ubuntu 16.04 + CUDA8.0 + cuDNN6.0 + Tensorflow)

    本文是个人对Keras深度学习框架配置的总结,不周之处请指出,谢谢! 1. 首先,我们需要安装Ubuntu操作系统(Windows下也行),这里使用Ubuntu16.04版本: 2. 安装好Ubunt ...

  3. 转:基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴等)【模式识别中的翘楚】

    文章来自于:http://blog.renren.com/share/246648717/8171467499 基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴 ...

  4. 《学习OpenCV(中文版)》

    <模式识别中文版(希)西奥多里蒂斯> <学习OpenCV(中文版)> 矩阵计算 英文版 第四版 Matrix Computations OpenCV 3.x with Pyth ...

  5. 前端学习 node 快速入门 系列 —— 简易版 Apache

    其他章节请看: 前端学习 node 快速入门 系列 简易版 Apache 我们用 node 来实现一个简易版的 Apache:提供静态资源访问的能力. 实现 直接上代码. - demo - stati ...

  6. 学习opencv之路(一)

    先看一下<学习opencv> 找几个demo 学会相机标定 我做的是单目相机的标定.

  7. 实验楼课程管理程序-深入学习《C++ Primer第五版》实验报告&学习笔记1

    本片博客为实验楼的训练营课程深入学习<C++ Primer第五版>的实验报告和学习笔记. 原课程地址为:https://www.shiyanlou.com/courses/405# 原文出 ...

  8. [纯小白学习OpenCV系列]官方例程00:世界观与方法论

    2015-11-11 ----------------------------------------------------------------------------------- 其实,写博 ...

  9. 《学习OpenCV》中求给定点位置公式

    假设有10个三维的点,使用数组存放它们有四种常见的形式: ①一个二维数组,数组的类型是CV32FC1,有n行,3列(n×3) ②类似①,也可以用一个3行n列(3×n)的二维数组 ③④用一个n行1列(n ...

随机推荐

  1. memcached使用详解

    不错的文章 http://www.ttlsa.com/memcache/memcached-description/

  2. page fault rate

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION A program computes th ...

  3. 在fortran下进行openmp并行计算编程

    最近写水动力的程序,体系太大,必须用并行才能算的动,无奈只好找了并行编程的资料学习了.我想我没有必要在博客里开一个什么并行编程的教程之类,因为网上到处都是,我就随手记点重要的笔记吧.这里主要是open ...

  4. 关于C和C++动态链接库的几个问题

    问题: 1.写一段C++程序,编译成动态链接库后,C程序怎么访问? 2.写一段C程序,编译成动态链接库后,C++程序怎么访问? 3.写一个类,编译成动态链接库后,里面的public变量能否访问? 对于 ...

  5. nginx下php频繁卡死502

    解决:[WARNING] fpm_children_bury(), line 215: child 2736 (pool default) exited on signal 15 SIGTERM af ...

  6. 超简单的处理JSON格式和JSON数组格式的String

    现在网站上有不少处理JSON格式的工具类,但是我找了一天,发现大都是需要编写相应对象类来进行处理,比较麻烦,比如:Gson,json-lib.Gson,json-lib这些处理那些接口之类的参数名字和 ...

  7. Redis学习笔记--五种数据类型的使用场景

    String 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...

  8. php--tp3.2引入sphinx搜索

    1.首先我们把coreseek下载好,命名为coreseek,我们找到coreseek/etc中的csft_mysql.conf修改这个配置文件 #源定义 source lemai { type    ...

  9. Object C语法学习笔记(一)

    1.@property与@synthesize配对使用. @property预编译指令的作用是自动声明属性的setter和getter方法. @synthesize 创建了该属性的访问代码 功能:让编 ...

  10. Nmap 網路診斷工具基本使用技巧與教學

    Nmap 是一個開放原始碼的網路掃描與探測工具,可以讓網路管理者掃描整個子網域或主機的連接埠等,功能非常強大. Nmap(Network Mapper)是一個開放原始碼的網路檢測工具,它的功能非常強大 ...