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

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

NB类型:class gpu::BruteForceMatcher_GPU

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

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

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

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

[cpp] view plain copy  print?
  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 第二版1-4:The Origin of OpenCV

    大家可以到这里下载英文原版:http://download.csdn.net/download/zleisure/7451051(下载时请看下资源简介) OpenCV起源 OpenCV诞生于Intel ...

  2. 跟着小琼琼学习opencv~

    楼楼最近整理笔记,发现了自己学习Opencv时候的码的代码和简单介绍,现贴上来~主调用方法在最下方.转载请注明出处~ #include <opencv2\xfeatures2d\nonfree. ...

  3. 快速系统从零学习OpenCV 4路线图

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 转眼间,小白学视觉就要成立三周年了,小白一直是很感谢小伙伴们的支持 ...

  4. 【从零学习OpenCV 4】了解OpenCV的模块架构

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门 ...

  5. 【从零学习OpenCV 4】opencv_contrib扩展模块的安装

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门 ...

  6. C# 学习笔记(10)加速球

    C# 学习笔记(10)加速球 利用窗体透明和GIF透明背景,实现加速球类似效果(QQ宠物,老年人大概也知道) 本文参考C#仿PS异形启动界面设计https://www.bilibili.com/vid ...

  7. VUE项目学习(三):win10版nginx部署vue项目

    VUE项目学习(三):win10版nginx部署vue项目 niginx的安装和启停操作参照博客:https://blog.csdn.net/qq_26666947/article/details/1 ...

  8. PCL(Point Cloud Library)学习指南资料推荐(2021版)

    PCL(Point Cloud Library)学习指南&资料推荐(2021版) 版权 双愚 https://zhuanlan.zhihu.com/p/268524083?utm_source ...

  9. 在pycharm2021.2中学习opencv图像处理,基于python3.9.7、pycharm完成配置

    在pycharm中学习opencv图像处理 安装python 下载python安装包 开始安装 安装pycharm社区版 下载pycharm安装包 开始安装 启动pycharm创建第一个项目 创建第一 ...

最新文章

  1. 范围规则的简短描述?
  2. DevOps笔记-01:软件交付面临的问题、软件工程的三个发展阶段、什么是DevOps?
  3. linux shell 计算器 除0,用shell写一个简易计算器,可以实现加、减、乘、除运算,假如脚本名字为1.sh,执行示例:./1....
  4. Eclipse、NetBeans、IntelliJ集成开发工具 Java IDE
  5. 全球及中国橡胶行业盈利状况及十四五竞争前景展望报告2021版
  6. 给网游写一个挂吧(三) – 启动外挂下
  7. C#抓取网页HTML内容
  8. 在建工地扬尘在线监控系统推荐_配电室为何需要安装蓄电池在线监控系统?保定钰鑫电气...
  9. 170819-关于JSTL的知识点
  10. jdk基础之Object类getClass()方法
  11. 阿牛的EOF牛肉串(递推dp)
  12. [Xcode]XcodeGhost问题的检查和验证
  13. ThinkPHP 汉字转成多种形式拼音
  14. UiAutomator2—By、BySelector
  15. 计算机cpu的字母,笔记本计算机CPU型号后缀字母HQ,U,Y的详细说明
  16. 你这简历一看就是包装过的
  17. Google Maps嵌入参数
  18. 装配连接示意图-萨姆森3730-4型PROFIBUS-PA数字式电气阀门定位器
  19. Waymo向左,霉运向右
  20. mock-随机生成数据工具

热门文章

  1. python时间的转换及比较
  2. Netty构建游戏服务器(一)--基本概念与原理
  3. Python 新式类与经典类
  4. fun(int **p)的使用
  5. php.ini 中文详解
  6. Node.js开发之Express框架安装
  7. HDFS分布式文件系统设计思想
  8. 修改默认python版本
  9. [zz]母牛生牛问题解析
  10. CP-ABE公式推导笔记