学习OpenCV——ORB简化版&Location加速版

根据前面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

时间: 2024-10-10 05:06:23

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

学习OpenCV——Surf简化版

之前写过一遍关于学习surf算法的blog:http://blog.csdn.net/sangni007/article/details/7482960 但是代码比较麻烦,而且其中还涉及到flann算法(其中的Random KDTree+KNN),虽然能看明白,但是比较费劲,今天在文档中找到一个简化版本: 1.SurfFeatureDetector detector( minHessian );构造surf检测器: detector.detect( img_1, keypoints_1 ); d

学习Opencv 2.4.9 (一)---Opencv + vs2012环境配置

作者:咕唧咕唧liukun321 来自:http://blog.csdn.net/liukun321 首先获得最新的Opencv 2.4.9源码:opencv源码下载 一.Opencv环境变量配置 1.将源码安装到制定目录: 2.为Opencv 添加环境变量:计算机-->属性 点击高级系统设置 3.出来系统属性对话框后,点击环境变量. 4.弹出如下对话框:选中PATH 单击新建 5.点击新建添加环境变量 6.将opencv2.4.9变量包含到PATH中去 二.然后再看VS2012 的配置. 1.

如何开始学习OpenCV?

OpenCV是什么,相信搞机器视觉的朋友都清楚.但是很多搞机器视觉的朋友却是对他又爱又恨.爱它因为它是免费的,如果能够好好掌握它,并运用到自己的机器视觉项目中,还是可以一定程度上降低项目成本.恨它是因为它不太好学习.原因有以下几个:1.国内有关OpenCV的中文著作太少了,就2本,而且还是1.1版本的,已经和现在最新版本2.4.3差别太大,就算是学习了,过渡到最新版也要花一定的时间和精力.2.直接学习较高版本,可是没有相应的教程可以参考.直接看英文版本的帮助文档吧,对于英文不好的朋友,难度很大.

【从零学习openCV】IOS7人脸识别实战

前言 接着上篇<IOS7下的人脸检測>,我们顺藤摸瓜的学习怎样在IOS7下用openCV的进行人脸识别,实际上非常easy,因为人脸检測部分已经完毕,剩下的无非调用openCV的方法对採集到的人脸样本进行训练,终于得到一个能够预測人脸的模型.可是当中的原理可谓是博大精深,因为快临最近末考试了,没时间去琢磨当中详细的细节,这次就先写个大概的demo,下次更新文章就得到6月20号之后了. 原理: 从OpenCV2.4之后,openCV增加了新的类FaceRecognizer,我们能够使用它便捷地进

python基础学习05(核心编程第二版)部分

# -*- coding: utf-8 -*- # ==================== #File: python #Author: python #Date: 2014 #==================== __author__ = 'Administrator' #dict{键:值} #哈希 #注:字典是无顺序的,所以你懂的 #创建与赋值 dict1={} dict2={'name':'apply','avg':24,'sex':'man'} print dict1,dict2

《学习opencv》笔记——矩阵和图像操作——cvGEMM,cvGetCol,cvGetCols and cvGetDiag

矩阵和图像的操作 (1)cvGEMM函数 其结构 double cvGEMM(//矩阵的广义乘法运算 const CvArr* src1,//乘数矩阵 const CvArr* src2,//乘数矩阵 double alpha,//1号矩阵系数 const CvArr* src3,//加权矩阵 double beta,//2号矩阵系数 CvArr* dst,//结果矩阵 int tABC = 0//变换标记 ); tABC变换标记及其对应的含义 CV_GEMM_A_T 转置 src1 CV_GE

学习OpenCV的学习笔记系列(三)显示图片及视频

OpenCV是计算机视觉库,那么处理的对象无非两个:"图片"及"视频"(其实视频也是被解压成单帧图像来处理的,总的来说,还是处理图像). 那么要想学习OpenCV,第一步必须知道OpenCV是怎么打开"图像"及"视频"文件然后显示的. 如果要想实现这些功能,其实很简单,步骤如下: 1. 新建工程 打开VS2010,新建一个项目,选择"Win32控制台应用程序"(使用控制台可以省掉很多麻烦),取名"

快速学习C++ primer(第四版)第一天

//1.17 //遍历数组a,计算其中负数的个数 int amount=0; for(int i=0;i<strlen(a);i++) if(a[i]<0) ++amount; //1.19 //每隔输10个值 for(int val=lower,count=1;val<=upper;++val,++count) { cout<<val<<" "; if(count%10==0) cout<<endl; } 快速学习C++ prim

学习OpenCV研究报告指出系列(二)源代码被编译并配有实例project

下载并安装CMake3.0.1 要自己编译OpenCV2.4.9的源代码.首先.必须下载编译工具,使用的比較多的编译工具是CMake. 以下摘录一段关于CMake的介绍: CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描写叙述全部平台的安装(编译过程).他可以输出各种各样的makefile或者project文件,能測试编译器所支持的C 特性,类似UNIX下的automake.仅仅是 CMake 的组态档取名为 CmakeLists.txt.Cmake 并不直接建构出终于的软件,而是