• 时间: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

  • 本次 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 会显示如下:

  • 这时,我们的 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
      

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++)相关推荐

  1. opencv(十八)-关键点和描述符

    索引目录 1.关键点的类cv::KeyPoint 2.cv::Feature2D-查找并计算描述符 3.cv::DMatch对象 4.cv::DescriptorMatcher 关键点匹配类 5.核心 ...

  2. RDKit | 通过Lipinski规则了解如何在RDKit中处理描述符

    以Lipinski的为主题,学习RDKit如何处理表征分子特性的" 描述符 ". 描述符         描述符是确定分子性质的指标.当然,水的性质是水的溶解度和大小的性质,生物活 ...

  3. python中文件描述符_Python中的描述符

    python中文件描述符 In Python, a class that implements a get, set or delete methods for an object is called ...

  4. linux 文件指针,Linux中文件描述符fd与文件指针FILE*互相转换实例解析

    本文研究的主要是Linux中文件描述符fd与文件指针FILE*互相转换的相关内容,具体介绍如下. 1.文件描述符fd的定义:文件描述符在形式上是一个非负整数.实际上,它是一个索引值,指向内核为每一个进 ...

  5. java中的scr是什么意思,javascrpt中属性描述符的理解与使用

    javascrpt中属性描述符的理解与使用 属性描述符是ES5出现的概念.顾名思义:它用于描述对象里面的属性应该是什么样,例如是否只读,能否可枚举,能否可配置等.怎样?好理解吧. 既然是对象里面的属性 ...

  6. linux中文件描述符fd和文件指针flip的理解

    整理自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd(file descriptor)只是一个整数,在ope ...

  7. UNIX中文件描述符和文件指针

    文件描述符 在C程序中,文件由文件指针或者文件描述符表示.ISO C的标准I/0库函数(fopen, fclose, fread, fwrite, fscanf, fprintf等)使用文件指针,UN ...

  8. Linux中文件描述符1,linux内核中的文件描述符(一)--基础知识简介

    原标题:linux内核中的文件描述符(一)--基础知识简介 Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blo ...

  9. 在c语言中文件的指针是什么,C语言中文件描述符和文件指针的本质区别

    1,首先了解进程运行时默认打开的文件指针以及打开的文件 /* Standard streams. / extern struct _IO_FILE stdin; / Standard input st ...

最新文章

  1. python爬虫工程师-Python爬虫工程师
  2. 7600和6500的一些常见问题
  3. java 安卓界面 可视化_Monkey可视化工具开发(android篇)
  4. mysql 高性能压力测试(总结了好久)
  5. jpa使用注解传递对象_注解(下)
  6. mysql crc16_MySQL 5.6 中TIMESTAMP with implicit DEFAULT value is deprecated错误
  7. conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一 次。
  8. 函数式编程会取代GoF设计模式吗?
  9. 1052. Linked List Sorting (25)再
  10. 人工智能AI学习教程
  11. lm75b 读取温度 c语言,STC单片机读取LM75A温度的代码,以及ADC读取电压。给大家分享一下把...
  12. OMA DRM V1.0/2.0学习笔记
  13. 亮宁机器人套件_十大可编程机器人教育套件
  14. 笔记 | 推荐系统 —— lambda架构
  15. 论区块链技术如何赋能社交代币并打造创作者经济新局面
  16. 时滞微分方程求解之三ddesd--变时滞
  17. 深入理解空间金字塔池化(SPP,ASPP)
  18. HDU-2094(产生冠军)
  19. java mybtis关联查询,iBatis/MyBatis 主子表关联查询
  20. Acrgis实例操作11--计算整个栅格区域值的总和、人口密度分布趋势图、点数据批量生成面数据

热门文章

  1. macOS配置java环境
  2. 我们在使用领英时有必要用领英精灵吗?
  3. 会话及会话技术、Cookie对象、Session对象 详解
  4. Gym - 101128H - Sheldon Numbers
  5. 考研英语 长难句训练day33
  6. Python 爬取蜻蜓FM免费音频页面的音频
  7. BZOJ1193 马步距离 (贪心)
  8. 输入9V-12V输出8.4V1.5A双节锂电池充电芯片
  9. NLP学习笔记-FastText文本分类(四)
  10. 二、Nacos下载和安装