OpenCV 4.5.1 - 新版本 中 BEBLID 描述符尝鲜 (基于 ubuntu / c++)

  • 时间:20210222
  • 目录

文章目录

      • 1. OpenCV 4.5.1 发布
        • 1.1 参考资料
        • 1.2 新特性 BEBLID 描述符
      • 2. OpenCV 4.5.1 编译 (Ubuntu 18.04)
        • 2.1 源码和 contrib 模块克隆
        • 2.2 编译
        • 2.3 添加 opencv 4.5.1 的 cmake 样例
      • 3. BEBLID 描述符测试例子
        • 3.1 python 例子
        • 3.2 c++ 例子
        • 3.3 结论

1. OpenCV 4.5.1 发布

1.1 参考资料

  • opencv 源码 - 官方 github - tag 4.5.1 ,opencv_contrib - 官方 github - tag 4.5.1
  • opencv 源码 - gitee镜像 - 国内 clone 快 , opencv_contrib - gitee镜像 - 国内 clone 快
  • opencv - 官方 - 4.5.1 文档
  • 4.5.1 新特性速览
  • BEBLID 描述符的 python 例子 - 内含有 BEBLID 原始文献
  • 编译好的opecv-451
  • 本文提供的 c++ 例子源码

1.2 新特性 BEBLID 描述符

  • BEBLID是通过boosting学习的高效二进制描述符。 只需更改scale_factor参数,就可以描述任何检测器的关键点。 在几个基准测试中,它已被证明可以以相同的效率大大改进其他二进制描述符,例如ORB或BRISK。 BEBLID描述了利用KeyPoint周围图像的不同区域中的平均灰度值之差,该描述符专门针对图像匹配和补丁检索进行了优化,以解决这些问题的不对称性。

2. OpenCV 4.5.1 编译 (Ubuntu 18.04)

2.1 源码和 contrib 模块克隆

  • 由于新的描述符位于 opencv_contrib 中的 xfeatures2d 模块,所以我们在编译源码的时候,要附带 opencv_contrib 一起编译,注意都是 4.5.1 版本。在 ubuntu 下进入你喜欢的文件路径,分别克隆源码和contrib

    git clone https://gitee.com/jqf64078/opencv_4.5.1.git
    git clone https://gitee.com/jqf64078/opencv_contrib_4.5.1.git
    

2.2 编译

  • 进入 opencv_4.5.1 路径,新建 Build 和 Install 文件夹,为了直观方便,可以使用 gui 版本的 cmake 进行参数配置。

    cd opencv_4.5.1
    mkdir build && mkdir install
    sudo apt-get install cmake-qt-gui #没有的话,安装 cmake-qt-gui
    cmake-gui
    
  • 打开 cmkae-gui 界面如下,设置源码 和 Build 的路径,点击 Configure 默认直接 Finish

    OpenCV 4.5.1 - 新版本 中 BEBLID 描述符尝鲜 (基于 ubuntu / c++)_第1张图片

  • 本次 Configure 完成后,会出现一片红色,再次 Configure ,红色没有了,这里如果没有问题的话,cmake 的 log 窗口最后应该显示 Configuring done

  • 由于我们的机器环境可能已经安装了其他版本的 OCV,并且安装在了系统目录下,为了避免冲突和其他库依赖发生变化的问题,我们将 4.5.1 版本编译好的库直接放在我们之前新建的 install 文件夹下,另外 , 使用新特性 BEBLID 描述符需要 opencv_contrib ,因此我们在这里修改 cmake-gui 中的两项配置参数:

    • 第一项,install 路径 ,替换你自己的路径即可。

      在这里插入图片描述

    • 第二项,opencv_contrib 路径 ,找到之前 clone 的源码路径,注意选择 modules 文件夹。

      ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210222163232664.png#pic_center)
      
    • 第三项,NONFREE 打开,勾选 OPENCV_ENABLE_NONFREE 否则不能使用 SURF 等算法。

      在这里插入图片描述

  • 再次 Configure 这时,由于添加了很多新的模块,需要额外下载一些文件,但是由于国内网络的原因,可能会下载失败,解决的版办法可以参考我的博客OpenCV 4.3.0 + opencv_contrib-4.3.0 在VS2017下的编译中的各种 #missing 问题,当然,本着方便大家的原则,我在文末直接提供了编译好的库文件。这一步如果没问题,点击 Generate ,成功后 log 会显示如下:

    OpenCV 4.5.1 - 新版本 中 BEBLID 描述符尝鲜 (基于 ubuntu / c++)_第2张图片

  • 这时,我们的 cmake-gui 就可以关闭了,回到我们 opencv_4.5.1/build 下,右键打开命令行,通过上面几步已经配置好了各项参数,直接编译安装即可,编译时间可能较长,看个人电脑的配置,最终头文件和库文件都生成在了 Install 文件夹下。

    cd <你的路径>/opencv_4.5.1/build
    make
    make install
    
  • 最后在我们的 install 文件夹下有如下四个子文件夹。我将其上传至 码云gitee 可直接使用

    • 克隆后即解压缩即可得到下面的文件

      git clone https://gitee.com/jqf64078/ocv_451_lib_read_for_use.git
      

      OpenCV 4.5.1 - 新版本 中 BEBLID 描述符尝鲜 (基于 ubuntu / c++)_第3张图片

2.3 添加 opencv 4.5.1 的 cmake 样例

  • 如果是直接安装到系统目录下的 opencv, cmakelists 中只需要添加这几句即可:

    find_package(OpenCV REQUIRED)
    include_directories( ${OpenCV_INCLUDE_DIRS} )
    target_link_libraries(myproject ${OpenCV_LIBS})
    
  • 但是我们系统中有别的版本的 ocv,而且我们刚才编译安装到了自己建立的 install 文件夹,所以稍微增加几句

    #保证该路径下有OpenCVConfig.cmake、opencv-config.cmake文件
    set(OpenCV_DIR  你的路径/opencv_4.5.1/install/lib/cmake/opencv4)   
    
    find_package(OpenCV 4.5.1 REQUIRED) #限制版本,确保我们引入的是 451 版本
    include_directories( ${OpenCV_INCLUDE_DIRS} ) # 包含文件目录
    
    add_executable(工程名 main.cpp)#main 为主函数,根据自己的主函数名随意更改
    target_link_libraries(工程名 ${OpenCV_LIBS})# 链接库
    

3. BEBLID 描述符测试例子

3.1 python 例子

  • python 例子见参考资料,BEBLID 描述符的 python 例子 - 内含有 BEBLID 原始文献 。

3.2 c++ 例子

  • 图片是OCV自带的,我们编写 c++ 版本的例子,基于 ubuntu 18.04 + Clion,该例子已上传至码云gitee ocv451_beblid-demo,部分源码如下,重点说明,测试的流程:

    • 首先利用 ExtractKeyPoints 来提取两幅图像的特征点,后面的不同描述符用同样的特征点为保持公平。
    • 然后利用 MatchTwoImgsBF 来计算描述符和暴力匹配特征点,主要对比 ORB 和 BEBLID 描述符。
    • 最后利用 FindGoodMatches 来优化匹配,其中利用了 RANSAC 算法,这里不再展开,详见源码。
    • 最终对比输出,在同样的特征点对下,不同的描述符最后能够得到有效匹配的点对数量即耗费时间。
    void ExtractKeyPoints(Mat &img1, Mat &img2,
                          Ptr<FeatureDetector> detector,
                          std::vector<KeyPoint> &kpts1,
                          std::vector<KeyPoint> &kpts2)
    {
        detector->detect(img1, kpts1);
        detector->detect(img2, kpts2);
    }
    
    //find matches by BRUTEFORCE from two imgs with user-defined detector and descriptor
    Mat MatchTwoImgsBF(Mat &img1, Mat &img2,
                       Ptr<DescriptorExtractor> descriptor,
                       std::vector<DMatch> &matches,
                       std::vector<KeyPoint> &kpts1,
                       std::vector<KeyPoint> &kpts2, float &time_cost)
    {
        double t0 = getTickCount();
        Mat descriptors1, descriptors2;
        descriptor->compute(img1, kpts1, descriptors1);
        descriptor->compute(img2, kpts2, descriptors2);
        Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create(DescriptorMatcher::BRUTEFORCE);
        matcher->match(descriptors1, descriptors2, matches);
        double freq = getTickFrequency();
        time_cost = ((double) getTickCount() - t0) / freq;
        Mat img_with_matches;
        drawMatches(img1, kpts1, img2, kpts2, matches, img_with_matches);
        return img_with_matches;
    }
    Mat FindGoodMatches(Mat &img1, Mat &img2,
                        std::vector<DMatch> &bad_matches,
                        std::vector<DMatch> &good_matches,
                        std::vector<KeyPoint> &kpts1,
                        std::vector<KeyPoint> &kpts2)
    {}
    
  • CMakeList.txt 如下,注意更换自己的编译文件的路径。

    cmake_minimum_required(VERSION 3.10)
    project(ocv_451_beblid_demo)
    
    set(CMAKE_CXX_STANDARD 14)
    set(OpenCV_DIR ~/Software/opencv_4.5.1/install/lib/cmake/opencv4)   #保证该路径下有OpenCVConfig.cmake、opencv-config.cmake文件
    
    find_package(OpenCV 4.5.1 REQUIRED)
    include_directories( ${OpenCV_INCLUDE_DIRS} )
    
    add_executable(ocv_451_beblid_demo main.cpp)
    target_link_libraries(ocv_451_beblid_demo ${OpenCV_LIBS})
    

3.3 结论

  • 匹配结果,初始和优化后的匹配点,乍一看是看不出来啥名堂,看下面的数据总结。

  • 与 ORB 描述符对比的结果,在同样的 400 个初始匹配下,BEBLID 能得到更多的有效匹配。且粗略地看,BEBLID 耗时更少。

OpenCV 4.5.1 - 新版本 中 BEBLID 描述符尝鲜 (基于 ubuntu / c++)_第4张图片

你可能感兴趣的:(CV,学习记录,OpenCV,4.5.1,OpenCV,图像匹配,SLAM,BEBLID)