Qt+CMake+opencv经验总结——关于nonfree.hpp和legacy.hpp

本文讲述了在使用Qt5.12.9+CMake与不同OpenCV版本(4.5.1和opencv-contrib)配合时,遇到nonfree.hpp和legacy.hpp头文件问题的解决过程。作者建议针对特定需求选择OpenCV2或包含相应模块的opencv-contrib,并提供了相关链接和路径配置技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说结论:

如果代码中需要用到nonfree.hpp和legacy.hpp,不要考虑装opencv3及以上版本!直接装opencv2!
下文中有opencv和opencv-contrib的下载链接,由于当时只保存了下载网址,没留下原博csdn地址,如果原博能看到的话请留言,我再添加~

参考的优秀博主链接:
qt+opencv2.4.16.3

进一步,回顾一下之前的曲折历程以及过程中领悟的小细节:

1. Qt5.12.9+CMake+OpenCV4.5.1

编译、安装、加环境变量,运行demo后,

#include <opencv2/core/core.hpp>
#include "opencv2/highgui/highgui.hpp"

头文件编译无误,但是

#include "opencv2/nonfree/nonfree.hpp"
#include "opencv2/legacy/legacy.hpp"

这两个头文件找不到。直接进行查询也没有这两个.hpp。

2. Qt5.12.9+CMake+OpenCV4.5.1+OpenCV-contrib 4.5.1

进一步查找,发现是opencv3及以上久直接没有这两个内容(这里本人用于提取特征点的方法),3以上部分移动到了扩展包—opencv-contrib,因此就准备变动小一点,加个补丁,准备加安装opencv-contrib

参考的优秀博主链接:
opencv opencv-contrib下载国内镜像
Qt Creator5.12配置OpenCV4.3.0和opencv_contrib扩展包

安装中在powershell编译时,出现了报错,找不到.dll文件,查找文件夹后发现有对应名称的.dll.a文件,只是.dll文件缺失。查找发现解决方法如下:

  • 直接找名称对应的dll文件并下载,放到路径内;
  • 特别问题特别分析,有的文件缺失有经验贴,可以通过其它文件的修改补足;
  • (在我的问题不但查不到而且下不到的情况下)尝试了直接把.dll.a文件后缀改掉,变成.dll`文件,再编译时确实不报错了。但是不知道后面有没有坑

注意opencv-contrib要安装与opencv对应的版本。安装完毕后发现,运行时

#include "opencv2/nonfree/nonfree.hpp"
#include "opencv2/legacy/legacy.hpp"

这两个头文件依然找不到。
通过查找之后发现,opencv-contrib4.5.1中含有nonfree.hpp,但是其路径不再是opencv2/nonfree/nonfree.hpp,因此需要自己查找一下,更改路径;legacy.hpp是完全找不到

进一步,下载了opencv-contrib3.1,来查看是否含有legacy.hpp。下载完之后发现opencv-contrib3.1也没有legacy.hpp…

结论

至此大概可以得出结论:
如果程序中需要用到legacy.hpp,那直接选择opencv2;
如果程序中需要用到nonfree.hpp,可以选择使用opencv2,或者opencv3以上+对应版本的ooencv-contrib,但注意修改nonfree.hpp的路径。

tips

另外tips:
使用cmake编译opencv3及以上的版本和opencv2略微有区别,主要在于cmake的文件夹路径(opencv2进去之后没有分开的build和sources文件夹,直接自己新建build,整体路径为sources)以及.pro文件中的内容:

  • opencv2的路径添加:
    opencv2的路径添加
  • opencv4的添加:
INCLUDEPATH += D:\OpenCV4.5.1\opencv\opencv-build\install\include
LIBS += D:\OpenCV4.5.1\opencv\opencv-build\lib\libopencv_*.a

### 问题分析 `opencv2/nonfree/nonfree.hpp` 文件的缺失通常是因为 OpenCV 版本不兼容或者特定模块未正确安装所致。根据提供的引用内容,可以总结如下: 1. **OpenCV 版本差异**:在 OpenCV 3.x 更高版本中,SIFT SURF 等算法已经被移到 `opencv_contrib` 模块中[^1]。然而,在 OpenCV 4 中,这些功能进一步调整甚至可能完全移除。 2. **依赖冲突**:尝试通过 `sudo apt-get install libopencv-nonfree-dev` 安装相关库时可能出现依赖关系错误,尤其是在不同发行版之间存在版本冲突的情况下[^3]。 3. **解决方案方向**: - 如果需要使用 SIFT 或其他非自由版权算法,建议降级至支持这些特性的旧版本(如 OpenCV 2.4.x 或部分配置好的 OpenCV 3.x)[^2]。 - 需要注意多版本 OpenCV 共存的情况以及 CMakeLists.txt 的正确编写方式。 --- ### 解决方案 #### 方法一:安装 OpenCV 2.4.x 并启用 Non-Free 模块 对于需要使用 `nonfree.hpp` 的场景,推荐安装 OpenCV 2.4.x 版本并手动编译源码以确保包含所需头文件库函数。 1. 下载 OpenCV 2.4.13.5 源码: ```bash wget https://github.com/opencv/opencv/archive/2.4.13.5.zip unzip 2.4.13.5.zip cd opencv-2.4.13.5/ ``` 2. 编译并安装: ```bash mkdir build && cd build cmake .. make -j$(nproc) sudo make install ``` 3. 修改项目代码中的头文件路径: 替换原有的 `#include <opencv2/nonfree/nonfree.hpp>` 为实际存在的路径,并确认链接器已指向正确的库文件。 --- #### 方法二:切换到 OpenCV 3.x + opencv_contrib 如果希望继续使用较新的 OpenCV 版本,则需重新构建带有 `opencv_contrib` 支持的环境。 1. 安装必要的依赖项: ```bash sudo apt-get update sudo apt-get install build-essential cmake git pkg-config \ libjpeg8-dev libtiff5-dev libjasper-dev libpng12-dev \ libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \ libxvidcore-dev libx264-dev libgtk-3-dev libatlas-base-dev gfortran ``` 2. 下载 OpenCV 3.x opencv_contrib: ```bash git clone https://github.com/opencv/opencv.git git clone https://github.com/opencv/opencv_contrib.git cd opencv git checkout 3.4.17 # 根据需求选择稳定分支 cd ../opencv_contrib git checkout 3.4 # 对应于 OpenCV 主仓库的分支 ``` 3. 构建带贡献模块的支持: ```bash cd ../opencv mkdir build && cd build cmake -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules .. make -j$(nproc) sudo make install ``` 4. 更新项目的 CMakeLists.txt: 添加以下内容以显式指定所需的模块: ```cmake find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) target_link_libraries(your_target_name ${OpenCV_LIBRARIES}) ``` --- #### 方法三:禁用 SIFT/SURF 转而使用 ORB/BRIEF 由于 SIFT SURF 属于专利保护范围内的算法,现代开发更倾向于采用开源替代品(如 ORB、BRISK)。以下是简单实现示例: ```cpp #include <opencv2/core.hpp> #include <opencv2/features2d.hpp> int main() { cv::Ptr<cv::FeatureDetector> detector = cv::ORB::create(); // 加载图像 cv::Mat img = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE); std::vector<cv::KeyPoint> keypoints; detector->detect(img, keypoints); // 绘制特征点 cv::drawKeypoints(img, keypoints, img, cv::Scalar::all(-1), cv::DrawMatchesFlags::DEFAULT); cv::imshow("Features", img); cv::waitKey(0); return 0; } ``` 此方法无需额外安装任何专有模块即可运行[^4]。 --- ### 注意事项 - 若系统中同时存在多个版本的 OpenCV,请务必清理残留配置或明确指定使用的版本号。 - 在 Ubuntu Noetic 上,默认预装的是 OpenCV 4.x;因此即使完成上述操作也可能因默认加载高版本而导致失败。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值