布吉做棋牌网站建设哪家技术好,桂林 网,广告制作合同范本,如何打死网站ORB是是ORiented Brief的简称。ORB的描述在下面文章中#xff1a;Ethan Rublee and Vincent Rabaud and Kurt Konolige and Gary Bradski, ORB: an efcient alternative to SIFT or SURF, ICCV 2011没有加上链接是因为作者确实还没有放出论文#xff0c;不过OpenCV2.3RC中已经…ORB是是ORiented Brief的简称。ORB的描述在下面文章中Ethan Rublee and Vincent Rabaud and Kurt Konolige and Gary Bradski, ORB: an efcient alternative to SIFT or SURF, ICCV 2011没有加上链接是因为作者确实还没有放出论文不过OpenCV2.3RC中已经有了实现WillowGarage有一个talk也提到了这个算法因此我不揣浅陋在这里总结一下。Brief是Binary Robust Independent Elementary Features的缩写。这个特征描述子是由EPFL的Calonder在ECCV2010上提出的。主要思路就是在特征点附近随机选取若干点对将这些点对的灰度值的大小组合成一个二进制串并将这个二进制串作为该特征点的特征描述子。详细算法描述参考如下论文注意在BRIEF eccv2010的文章中BRIEF描述子中的每一位是由随机选取的两个像素点做二进制比较得来的。文章同样提到在此之前需要选取合适的gaussian kernel对图像做平滑处理。(为什么要强调这一点因为下述的ORB对此作了改进。)BRIEF的优点在于速度缺点也相当明显1不具备旋转不变性。2对噪声敏感3不具备尺度不变性。ORB就是试图解决上述缺点中的1和2.如何解决旋转不变性在ORB的方案中是采用了FAST作为特征点检测算子。FAST应用的很多了是出名的快以防有人不知道请看这里在Sift的方案中特征点的主方向是由梯度直方图的最大值和次大值所在的bin对应的方向决定的。略嫌耗时。在ORB的方案中特征点的主方向是通过矩(moment)计算而来公式如下有了主方向之后就可以依据该主方向提取BRIEF描述子。但是由此带来的问题是由于主方向会发生变化随机点对的相关性会比较大从而降低描述子的判别性。解决方案也很直接采取贪婪的穷举的方法暴力找到相关性较低的随机点对。如何解决对噪声敏感的问题在前面提到过在最早的eccv2010的文章中BRIEF使用的是pixel跟pixel的大小来构造描述子的每一个bit。这样的后果就是对噪声敏感。因此在ORB的方案中做了这样的改进不再使用pixel-pair而是使用9×9的patch-pair也就是说对比patch的像素值之和。(可以通过积分图快速计算)。关于尺度不变性ORB没有试图解决尺度不变性(因为FAST本身就不具有尺度不变性。)但是这样只求速度的特征描述子一般都是应用在实时的视频处理中的这样的话就可以通过跟踪还有一些启发式的策略来解决尺度不变性的问题。关于计算速度ORB是sift的100倍是surf的10倍。关于性能下面是一个性能对比ORB还是很给力。点击看大图。Related posts看到OpenCV2.3.1里面ORB特征提取算法也在里面了套用给的SURF特征例子程序改为ORB特征一直提示错误类型不匹配神马的由于没有找到示例程序只能自己找答案。(ORB特征论文ORB an efficient alternative to SIFT or SURF.点击下载论文)经过查找发现描述符数据类型有是float的比如说SIFTSURF描述符还有是uchar的比如说有ORBBRIEF对于float 匹配方式有FlannBasedBruteForce BruteForce BruteForce 对于uchar有BruteForceBruteForceBruteForceMatcher L2 matcher;//改动的地方完整代码如下#include #include opencv2/core/core.hpp#include opencv2/features2d/features2d.hpp#include opencv2/highgui/highgui.hpp#include #include using namespace cv;using namespace std;int main(){Mat img_1 imread(D:\\image\\img1.jpg);Mat img_2 imread(D:\\image\\img2.jpg);if (!img_1.data || !img_2.data){cout error reading images endl;return -1;}ORB orb;vector keyPoints_1, keyPoints_2;Mat descriptors_1, descriptors_2;orb(img_1, Mat(), keyPoints_1, descriptors_1);orb(img_2, Mat(), keyPoints_2, descriptors_2);BruteForceMatcher matcher;vector matches;matcher.match(descriptors_1, descriptors_2, matches);double max_dist 0; double min_dist 100;//-- Quick calculation of max and min distances between keypointsfor( int i 0; i descriptors_1.rows; i ){double dist matches[i].distance;if( dist min_dist ) min_dist dist;if( dist max_dist ) max_dist dist;}printf(-- Max dist : %f \n, max_dist );printf(-- Min dist : %f \n, min_dist );//-- Draw only good matches (i.e. whose distance is less than 0.6*max_dist )//-- PS.- radiusMatch can also be used here.std::vector DMatch good_matches;for( int i 0; i descriptors_1.rows; i ){if( matches[i].distance 0.6*max_dist ){good_matches.push_back( matches[i]);}}Mat img_matches;drawMatches(img_1, keyPoints_1, img_2, keyPoints_2,good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),vector(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);imshow( Match, img_matches);cvWaitKey();return 0;}另外: SURF SIFT/*SIFT sift;sift(img_1, Mat(), keyPoints_1, descriptors_1);sift(img_2, Mat(), keyPoints_2, descriptors_2);BruteForceMatcher matcher;*//*SURF surf;surf(img_1, Mat(), keyPoints_1);surf(img_2, Mat(), keyPoints_2);SurfDescriptorExtractor extrator;extrator.compute(img_1, keyPoints_1, descriptors_1);extrator.compute(img_2, keyPoints_2, descriptors_2);BruteForceMatcher matcher;*/效果另外一个是寻找目标匹配在右边的场景图里面寻找左边那幅图的starbucks标志效果如下需要在之前的那个imshow之前加上如下代码即可完成一个简单的功能展示// localize the objectstd::vector obj;std::vector scene;for (size_t i 0; i good_matches.size(); i){// get the keypoints from the good matchesobj.push_back(keyPoints_1[ good_matches[i].queryIdx ].pt);scene.push_back(keyPoints_2[ good_matches[i].trainIdx ].pt);}Mat H findHomography( obj, scene, CV_RANSAC );// get the corners from the image_1std::vector obj_corners(4);obj_corners[0] cvPoint(0,0);obj_corners[1] cvPoint( img_1.cols, 0);obj_corners[2] cvPoint( img_1.cols, img_1.rows);obj_corners[3] cvPoint( 0, img_1.rows);std::vector scene_corners(4);perspectiveTransform( obj_corners, scene_corners, H);// draw lines between the corners (the mapped object in the scene - image_2)line( img_matches, scene_corners[0] Point2f( img_1.cols, 0), scene_corners[1] Point2f( img_1.cols, 0),Scalar(0,255,0));line( img_matches, scene_corners[1] Point2f( img_1.cols, 0), scene_corners[2] Point2f( img_1.cols, 0),Scalar(0,255,0));line( img_matches, scene_corners[2] Point2f( img_1.cols, 0), scene_corners[3] Point2f( img_1.cols, 0),Scalar(0,255,0));line( img_matches, scene_corners[3] Point2f( img_1.cols, 0), scene_corners[0] Point2f( img_1.cols, 0),Scalar(0,255,0));代码片#include opencv2/highgui/highgui.hpp#include opencv2/features2d/features2d.hpp#include int main( ){cv::Ptr:featuredetector detector cv::FeatureDetector::create( SIFT );cv::Ptr:descriptorextractor extractor cv::DescriptorExtractor::create(SIFT );cv::Mat im cv::imread(box.png, CV_LOAD_IMAGE_COLOR );std::vector:keypoint keypoints;cv::Mat descriptors;detector-detect( im, keypoints);extractor-compute( im,keypoints,descriptors);int duplicateNum 0;for (int i0;i{for (int ji1;j{float dist abs((keypoints[i].pt.x-keypoints[j].pt.x))abs((keypoints[i].pt.y-keypoints[j].pt.y));if (dist 0){cv::Mat descriptorDiff descriptors.row(i)-descriptors.row(j);double diffNorm cv::norm(descriptorDiff);std::coutduplicateNum;}}}std::coutreturn 1;}本文同步分享在 博客“shiter”(CSDN)。如有侵权请联系 supportoschina.cn 删除。本文参与“OSC源创计划”欢迎正在阅读的你也加入一起分享。