失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > OpenCV 4.5.1 - 新版本 中 BEBLID 描述符尝鲜 (基于 ubuntu / c++)

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

时间:2023-01-07 23:15:25

相关推荐

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

时间:0222目录

文章目录

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.1opencv 源码 - 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 /jqf64078/opencv_4.5.1.gitgit clone /jqf64078/opencv_contrib_4.5.1.git

2.2 编译

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

cd opencv_4.5.1mkdir build && mkdir installsudo apt-get install cmake-qt-gui #没有的话,安装 cmake-qt-guicmake-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-/0222163232664.png#pic_center)

第三项,NONFREE打开,勾选 OPENCV_ENABLE_NONFREE 否则不能使用 SURF 等算法。

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

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

cd <你的路径>/opencv_4.5.1/buildmakemake install

最后在我们的 install 文件夹下有如下四个子文件夹。我将其上传至 码云gitee 可直接使用

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

git clone /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 descriptorMat 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++)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。