Opencv学习之ORB算法

Opencv学习之ORB算法
ORB是ORiented Brief的简称,是brief算法的改进版,算法效率比SIFT高两个数量级,在计算速度上,ORB是SIFT的100倍,是SURF的10倍。
Brief描述子:Brief是Binary Robust Independent Elementary Features的缩写,主要思路就是在特征点附近随机选取若干点对,将这些点对的灰度值的大小,组合成一个二进制串,并将这个二进制串作为该特征点的特征描述子。
BRIEF的有点在于速度,缺点也很明显
*不具备旋转不变性
*对噪声敏感
*不具备尺度不变性
而ORB算法就是试图解决上述缺点中的1和2,对于3,在OPENCV中用了图像金字塔来进行改善。
与SURF类似,用了OrbFeatureDetector来提取关键点,用OrbDescriptorExtractor来提取特征向量。

 #include<opencv2/opencv.hpp>
#include<opencv2/nonfree/nonfree.hpp>

int main()
{
//载入原始图像和模版图像
    cv::Mat srcImage=cv::imread("/Users/new/Desktop/3.jpg");
    cv::Mat templaImage=cv::imread("/Users/new/Desktop/4.jpg");
//灰度化
cv::Mat dstImage,grayImage1,grayImage2;
    cv::cvtColor(srcImage, grayImage1, CV_BGR2GRAY);

    cv::cvtColor(templaImage, grayImage2, CV_BGR2GRAY);



//***************检测ORB特征点并在图像中提取物体的描述符***************8
//定义参数
cv::OrbFeatureDetector featureDetector;
std::vector<cv::KeyPoint>keyPoints,keyPoints_templ;
cv::Mat descriptors,descriptors_templ;

//调用detect函数检测出特征关键点,保存在vector容器中
featureDetector.detect(grayImage1, keyPoints);
featureDetector.detect(grayImage2, keyPoints_templ);
//计算描述符(特征向量)
cv::OrbDescriptorExtractor featureExtractor;
featureExtractor.compute(grayImage1, keyPoints, descriptors);
featureExtractor.compute(grayImage2, keyPoints_templ, descriptors_templ);
//匹配和测试描述符,获取两个最近邻的描述符
cv::Mat matchIndex(descriptors.rows,2,CV_32SC1),matchDistance(descriptors.rows,2,CV_32FC1);
//基于FLANN的描述符对象匹配
cv::flann::Index flannIndex(descriptors_templ,cv::flann::LshIndexParams(12,20,2),cvflann::FLANN_DIST_HAMMING);
flannIndex.knnSearch(descriptors, matchIndex, matchDistance, 2,cv::flann::SearchParams());//调用k近邻算法
//根据劳氏算法,选出优秀的匹配
std::vector<cv::DMatch>goodMatches;
for(int i=0;i<matchDistance.rows;++i)
{
    if(matchDistance.at<float>(i,0)<0.6 * matchDistance.at<float>(i,1))
    {
        cv::DMatch dmatches(i,matchIndex.at<int>(i,0),matchDistance.at<float>(i,0));
        goodMatches.push_back(dmatches);

    }
}
//绘制并显示匹配窗口
cv::Mat resultImage;
drawMatches(srcImage,keyPoints,templaImage,keyPoints_templ,goodMatches,dstImage);
imshow("image[Orb]",dstImage);
    cv::waitKey(0);
    return 0;

}

这里写图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值