zoukankan      html  css  js  c++  java
  • FlannBasedMatcher 立体匹配

    #include "opencv2/core/core.hpp"
    #include "opencv2/features2d/features2d.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include <opencv2/nonfree/nonfree.hpp>
    #include<opencv2/legacy/legacy.hpp>
    #include <iostream>
    using namespace cv;
    using namespace std;
    
    int main(  )
    {
        //【0】改变console字体颜色    
        system("color 4F");    
    
        //【1】载入源图片
        Mat img_1 = imread("1.jpg", 1 );
        Mat img_2 = imread( "2.jpg", 1 );//【2】利用SURF检测器检测的关键点
        int minHessian = 300;
        SURF detector( minHessian );
        std::vector<KeyPoint> keypoints_1, keypoints_2;
        detector.detect( img_1, keypoints_1 );
        detector.detect( img_2, keypoints_2 );
    
        //【3】计算描述符(特征向量)
        SURF extractor;
        Mat descriptors_1, descriptors_2;
        extractor.compute( img_1, keypoints_1, descriptors_1 );
        extractor.compute( img_2, keypoints_2, descriptors_2 );
    
        //【4】采用FLANN算法匹配描述符向量
        FlannBasedMatcher matcher;
        std::vector< DMatch > matches;
        matcher.match( descriptors_1, descriptors_2, matches );
        double max_dist = 0; double min_dist = 100;
    
        //【5】快速计算关键点之间的最大和最小距离
        for( 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 
    ", max_dist );
        printf("> 最小距离(Min dist) : %f 
    ", min_dist );
    
        //【6】存下符合条件的匹配结果(即其距离小于2* min_dist的),使用radiusMatch同样可行
        std::vector< DMatch > good_matches;
        for( int i = 0; i < descriptors_1.rows; i++ )
        { 
            if( matches[i].distance < 2*min_dist )
            { good_matches.push_back( matches[i]); }
        }
    
        //【7】绘制出符合条件的匹配点
        Mat img_matches;
        drawMatches( img_1, keypoints_1, img_2, keypoints_2,
            good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),
            vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );
    
        //【8】输出相关匹配点信息
        for( int i = 0; i < good_matches.size(); i++ )
        { printf( ">符合条件的匹配点 [%d] 特征点1: %d  -- 特征点2: %d  
    ", i, good_matches[i].queryIdx, good_matches[i].trainIdx ); }
    
        //【9】显示效果图
        imshow( "匹配效果图", img_matches );
    
        //按任意键退出程序
        waitKey(0);
        return 0;
    }
  • 相关阅读:
    09-2:跳台阶
    09:菲波那切数列
    08:旋转数组的最小值
    07:用两个栈实现队列
    06:重建二叉树
    05:从尾到头打印链表
    04:替换字符
    centos7安装Jenkins更改默认端口并配置Ldap服务器进行用户认证
    Jira配置openLdap服务器进行用户认证
    定时自动从FTP服务器取数据脚本
  • 原文地址:https://www.cnblogs.com/hsy1941/p/9858975.html
Copyright © 2011-2022 走看看