栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

特征点的提取(ORB方法)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

特征点的提取(ORB方法)

特征提取代码 (1)函数介绍

cv::Ptr类就看成一个cv的一个智能指针,在适当的时间能自动删除指向的对象;工作机制很像C++的内置指针

FeatureDetetor(特征点检测)是虚类,通过定义FeatureDetector的对象可以使用多种特征检测方法。通过create()函数调用:

DescriptorExtractor(描述子的获取)和FeatureDetetor一样为虚类。

DescriptorMatcher为特征点的匹配,特征点的匹配有很多方法比如:暴力匹配,FLANN快速近似最近邻法。

使用create来设定检测方法:

static Ptr cv::DescriptorMatcher::create        (        const String &         descriptorMatcherType        )        

BruteForce (it uses L2 )

BruteForce-L1

BruteForce-Hamming

BruteForce-Hamming(2)

FlannBased

virtual void cv::Feature2D::compute        (        InputArrayOfArrays         images,

std::vector< std::vector< KeyPoint > > &         keypoints,

OutputArrayOfArrays         descriptors

)        

FeatureDetetor通过生成的指针调用用来计算出关键点,参数1为输入图像,参数2位建立的关键点,参数为描述子可以直接定位为Mat类

接下来为:

void cv::drawKeypoints

(

InputArray

image,

const std::vector< KeyPoint > & 

keypoints,

InputOutputArray

outImage,

const Scalar & 

color = Scalar::all(-1),

int 

flags = DrawMatchesFlags::DEFAULT 

前面几个参数很简单,为输入图像,关键点位置,输出图像,颜色最后一个为绘制的模式:

  DEFAULT   = 0, 

  DRAW_OVER_OUTIMG = 1,

  NOT_DRAW_SINGLE_POINTS = 2,

  DRAW_RICH_KEYPOINTS = 4

大致的函数已经介绍了接下来直接上代码:

#include 
#include 
#include 
#include 
#include 

using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{
    cv::Mat imag_1=cv::imread("../image1.jpg",CV_LOAD_IMAGE_COLOR);
    cv::Mat imag_2=cv::imread("../image2.jpg",CV_LOAD_IMAGE_COLOR);
    assert(imag_1.data!=nullptr&&imag_2.data!=nullptr);

    //初始化
    std::vector keypoint1,keypoint2;
    Mat descriptors1,descriptors2;
    cv::Ptr detector=cv::ORB::create();
    cv::Ptr descriptor=cv::ORB::create();
    cv::Ptr matcher=cv::DescriptorMatcher::create("BruteForce-Hamming");

    //第一步监测角点
    chrono::steady_clock::time_point t1=chrono::steady_clock::now();
    detector->detect(imag_1,keypoint1);
    detector->detect(imag_2,keypoint2);

    //更具角点位置计算描述子
    descriptor->compute(imag_1,keypoint1,descriptors1);
    descriptor->compute(imag_2,keypoint2,descriptors2);
    chrono::steady_clock::time_point t2=chrono::steady_clock::now();
    chrono::duration time_used=chrono::duration_cast>(t2-t1);
    cout<<"extract ORB cost ="< matches;
    t1=chrono::steady_clock::now();
    matcher->match(descriptors1,descriptors2,matches);
    t2=chrono::steady_clock::now();
    time_used=chrono::duration_cast>(t2-t1);
    cout<<"match ORB cost = "<distance;
    double max_dist=min_max.second->distance;

    printf("--Max dist: %f n",max_dist);
    printf("--Min dist: %f n",min_dist);

    std::vector good_matches;
    for (int i = 0; i < descriptors1.rows; i++)
    {
        if(matches[i].distance<=max(2*min_dist,30.0))
        {
            good_matches.push_back(matches[i]);
        }
    }
    Mat img_match;
    Mat img_goodmatch;
    cv::drawMatches(imag_1,keypoint1,imag_2,keypoint2,good_matches,img_goodmatch);
    cv::drawMatches(imag_1,keypoint1,imag_2,keypoint2,matches,img_match);
    cv::namedWindow("all matches",WINDOW_NORMAL);
    imshow("all matches",img_match);
    cv::waitKey(0);

    cv::namedWindow("good matches",WINDOW_NORMAL);
    imshow("good matches",img_goodmatch);
    cv::waitKey(0);
    return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/983753.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号