如何用 cmake 编译 OpenCV?

Posted

技术标签:

【中文标题】如何用 cmake 编译 OpenCV?【英文标题】:How do you compile OpenCV with cmake? 【发布时间】:2020-07-31 13:34:51 【问题描述】:

我正在尝试编译 OpenCV 以使其具有 sift 模块。

我使用 this tutorial 下载了 CMake。

我还下载并解压了 opencv-4.3.0 和 opencv_contrib。

我创建了一个空文件夹,打开终端,然后使用以下行导航到它:

cd ~/opencvMaster/build

然后,当我在终端的这个空文件夹中时,我运行了以下行:

cmake -DOPENCV_ENABLE_NONFREE:BOOL=ON -DOPENCV_EXTRA_MODULES_PATH= ~/openCVMaster/opencv_contrib-master/modules ~/openCVMaster/opencv-4.3.0

它配置并生成了文件。然后我输入make。得到以下错误:

[ 82%] Building CXX object modules/xfeatures2d/CMakeFiles/opencv_xfeatures2d.dir/src/boostdesc.cpp.o
~/opencvMaster/opencv_contrib-e6f32c6a69043456a806a4e802ee3ce7b7059c93/modules/xfeatures2d/src/boostdesc.cpp:654:20: fatal error: boostdesc_bgm.i: No such file or directory
           #include "boostdesc_bgm.i"
                    ^~~~~~~~~~~~~~~~~
compilation terminated.

我按照here的建议,添加了以下文件:

cd ~/openCVMaster/opencv_contrib-4.3.0/modules/xfeatures2d/src
curl wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_lbgm.i >boostdesc_lbgm.i
curl wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_binboost_256.i >boostdesc_binboost_256.i
curl wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_binboost_128.i >boostdesc_binboost_128.i
curl wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_binboost_064.i >boostdesc_binboost_064.i
curl wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_bgm_hd.i >boostdesc_bgm_hd.i
curl wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_bgm_bi.i >boostdesc_bgm_bi.i
curl wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_bgm.i >boostdesc_bgm.i
curl wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d/vgg_generated_120.i > vgg_generated_120.i
curl wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d/vgg_generated_64.i >vgg_generated_64.i
curl wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d/vgg_generated_48.i >vgg_generated_48.i
curl wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d/vgg_generated_80.i >vgg_generated_80.i

这是向前迈出的一步:不再出现与 vgg 或 boostdesc 相关的错误。出现新错误:opencv_contrib-master/modules/xfeatures2d/test/test_features2d.cpp:51:10: fatal error: features2d/test/test_detectors_regression.impl.hpp: No such file or directory

听从阿妈here的建议,我下载了https://github.com/opencv/opencv/tree/master/modules。下载后,我找到了它的子文件夹“features2d”并将其放入opencv_contrib-master/modules/xfeatures2d/test/

还是报错 -

~/openCVMaster/opencv_contrib-master/modules/xfeatures2d/test/features2d/misc/java/src/cpp/features2d_converters.cpp:2:10: fatal error: common.h: No such file or directory
 #include "common.h"

我添加了以下内容:

cd ~/openCVMaster/opencv_contrib-master/modules/xfeatures2d/test/features2d/misc/java/src/cpp
curl wget https://raw.githubusercontent.com/ray-project/common/master/common.h > common.h

我再次运行make,得到以下错误:

~/openCVMaster/opencv_contrib-master/modules/xfeatures2d/test/features2d/misc/java/src/cpp/features2d_converters.cpp: In function ‘void Mat_to_vector_KeyPoint(cv::Mat&, std::vector<cv::KeyPoint>&)’:
~/openCVMaster/opencv_contrib-master/modules/xfeatures2d/test/features2d/misc/java/src/cpp/features2d_converters.cpp:7:38: error: ‘LOGD’ was not declared in this scope
 #define CHECK_MAT(cond) if(!(cond)) LOGD("FAILED: " #cond); return; 

~/openCVMaster/opencv_contrib-master/modules/xfeatures2d/test/features2d/misc/java/src/cpp/features2d_converters.cpp:14:5: note: in expansion of macro ‘CHECK_MAT’
     CHECK_MAT(mat.type()==CV_32FC(7) && mat.cols==1);
     ^~~~~~~~~
~/openCVMaster/opencv_contrib-master/modules/xfeatures2d/test/features2d/misc/java/src/cpp/features2d_converters.cpp: In function ‘void Mat_to_vector_DMatch(cv::Mat&, std::vector<cv::DMatch>&)’:
~/openCVMaster/opencv_contrib-master/modules/xfeatures2d/test/features2d/misc/java/src/cpp/features2d_converters.cpp:7:38: error: ‘LOGD’ was not declared in this scope
 #define CHECK_MAT(cond) if(!(cond)) LOGD("FAILED: " #cond); return; 

欢迎提出任何建议。

【问题讨论】:

您描述的所有步骤都应由 CMake 处理,包括文件下载。你必须建立java绑定吗?通过cmake -i 浏览您的 OpenCV 选项 @mainactual - 非常感谢您的帮助。要回答您的问题 - 我不需要 java.util.我试图删除 features2d 中名为 java 的文件夹(这引发了与新丢失文件相关的错误),并且我还使用 -D WITH_JAVA=OFF 运行了 cmake(这引发了与上述相同的错误 - features2d_converters.cpp 文件中的 void mat_to_vector )。我会尝试 cmake -i。 更具体地说,这是我上次尝试的实际 cmake: cmake -DBUILD_SHARED_LIBS=OFF -D BUILD_opencv_java=OFF -DCMAKE_BUILD_TYPE=Release -DOPENCV_ENABLE_NONFREE:BOOL=ON -DOPENCV_EXTRA_MODULES_PATH=//home/kate /Documents/openCVMaster/opencv_contrib-master/modules /home/kate/Documents/openCVMaster/opencv-4.3.0 [binary-folder]/modules/core/version_string.inc 列出了构建选项,因此您可以在此处检查或附加。不建议手动定制构建,而是让 CMake 来做。所以我会创建一个干净的文件夹,使用 cmake -i 浏览所有选项,然后让 CMake 下载文件。了解选项后,使用-Ds 构建单行命令。此外,当您添加 contrib-modules 时,它们都默认启用(并且编译起来有些棘手),而您只需要 xfeatures2d。 我想出了我需要在 cmake-gui 中打勾的框(BUILD_opencv_core、BUILD_cv_features2d、BUILD_opencv_flann、BUILD_opencv_imgproc、[名称中包含 python 的所有内容]、ENABLE_CCACHE、OPENCV_ENABLE_NONFREE、ENABLE_PIC),现在有了完整的编译的python模块。非常感谢@mainactual - 我为此工作了大约一个月,但没有成功,即将放弃。明天我将尝试弄清楚如何让 vscode 识别我的新 opencv 模块:-) 【参考方案1】: 下载opencv-4.3.0.zipopencv_contrib-4.3.0.zip.解压。 打开opencv_contrib-4.3.0\modules. 复制显示xfeatures2d 的文件夹。打开opencv-4.3.0\modules,粘贴刚才复制的文件夹(xfeatures2d) 创建一个空文件夹,并将其命名为“Build45”。 打开 cmake-gui。 在显示“在哪里构建二进制文件”的框中,输入代表您的空文件夹的文件路径 (Build45) 在“源代码在哪里”的框中输入代表opencv-4.3.0. 的文件路径

点击configure.会出现选项。 在搜索框中输入“免费”并选中显示 OPENCV_ENABLE_NONFREE 的框。 输入 xfeatures2d 并选中“Build_opencv_xfeatures2d`”框 再次单击configure。 (仔细检查您是否正确:cmake gui 中有第二个框提供构建详细信息。您应该看到 Non-free algorithms: YES。 点击Generate。 检查 build45 文件夹现在是否充满了东西。 打开终端并导航到 build45 文件夹 (cd ~/opencv-master/build45) 输入cmake . 输入make 注意:* 编译需要几个小时。给自己泡杯茶*。 输入sudo make install 检查它是否有效:在您的终端中,输入python3 输入import cv2 输入sift = cv2.xfeatures2d.SIFT_create() 您应该没有错误。如果您确实遇到错误,以下故障排除工具可能会有所帮助:
import cv2
print cv2.getBuildInformation()
import cv2
funcs = dir(cv2)
for f in funcs:
...     print(f)

另外,如果您担心侵犯专利,请点击此处进行讨论:https://www.reddit.com/r/computervision/comments/ba1l8g/according_to_this_the_patent_on_sift_was_due_to/

【讨论】:

【参考方案2】:
# Step 1: Install VS 2017 for cmake 
 # Step 2: Install CMake

从https://cmake.org/download/ 下载并安装 CMake v3.10.0。

在安装过程中选择“将 CMake 添加到系统路径”

# step 3: install Anaconda
# step 4: Download and extract opencv-3.3.1 and opencv_contrib-3.3.1
Go to https://github.com/opencv/opencv/releases and download opencv-3.3.1 source code zip

去https://github.com/opencv/opencv_contrib/releases下载opencv_contrib-3.3.1源码zip

解压缩两个 zip 文件。尽管您可以将 opencv 和 opencv_contrib 文件夹保存在任何地方,但我建议您应该将它们保存在同一目录中。我已将这两个文件夹放在“我的文档”目录中。

注意:从这里开始,我们将 opencv-3.3.1 文件夹的路径称为 OPENCV_PATH。例如,在我的情况下 OPENCV_PATH 是 C:/Users/Vaibhaw Chandel/Documents/opencv-3.3.1

根据您保存 opencv-3.3.1 文件夹的位置,此路径会有所不同。

第 5 步:使用 CMake 生成 Visual Studio 项目

运行 Cmake,在“源代码在哪里”框中写入 OPENCV_PATH 的值(即 opencv-3.3.1 文件夹的路径)和构建目录的路径。我们将选择构建目录作为 OPENCV_PATH/build

现在点击配置。 系统将询问您创建构建文件夹的权限。单击是

当提示选择编译器时,选择 Visual Studio 14 2015 Win64。

单击完成并在下一个窗口中保持默认参数选中。

点击完成。现在 CMake 将查看系统目录并生成 makefile。

步骤 5.1:对 CMake 配置的其他更改

我们将对 CMake 生成的默认配置进行少量更改。点击图片查看大图。

检查“INSTALL_C_EXAMPLES”和“INSTALL_PYTHON_EXAMPLES” 在标志“OPENCV_EXTRA_MODULES_PATH”中,给出 opencv_contrib-3.3.1 中模块目录的路径。在我们的例子中,我们将 opencv_contrib-3.3.1 保存在 Documents 文件夹中,因此路径是“C:/Users/Vaibhaw Chandel/Documents/opencv_contrib-3.3.1/modules” 现在单击配置以应用这些更改。

在 Windows 10 上,opencv_saliency 模块无法构建。所以我们将禁用它。取消选中 BUILD_opencv_saliency 现在再次单击配置以包含此更改。

步骤 5.2:为 Python2 和 Python3 添加 Python 路径(可选)

本节仅适用于希望为 Python2 和 Python 3 生成 OpenCV 二进制文件的人。如果您打算只使用一个 Python 2 或 3,则应跳过本节。

CMake 无法找到我的 Python3 文件的路径。

所以我手动为 Python3 添加了路径 现在再次单击配置。配置完成后,在搜索栏搜索opencv_python,BUILD_opencv_python2和BUILD_opencv_python3都会自动勾选。现在我们确定 Python2 和 Python 3 的 OpenCV 二进制文件将在编译后生成。

步骤 5.3:生成构建文件

如果 CMake 能够在没有任何错误的情况下进行配置,则应显示“配置完成”。 点击生成。

注意:每当您对 CMake 生成的配置进行任何更改(选中/取消选中复选框或更改路径)时,请始终单击配置并生成。

第 6 步:编译 OpenCV

步骤6.1:在Release模式下编译opencv

打开 Windows 命令提示符 (cmd)。 转到 OPENCV_PATH/build 目录并运行此命令 1

cmake.exe --build . --config Release --target INSTALL

步骤 6.2:在 Debug 模式下编译 opencv

如第 5 步所述再次打开 CMake GUI。

在搜索框中搜索“python” 取消选中 INSTALL_PYTHON_EXAMPLES、BUILD_opencv_python3 和 BUILD_opencv_python2 点击配置 点击生成 现在在 windows 命令提示符下 转到 OPENCV_PATH/build 目录并运行此命令

1

cmake.exe --build . --config Debug --target INSTALL

现在我们已经编译了 OpenCV,我们将了解如何使用 CMake 测试 OpenCV 项目。

第 7 步:更新系统环境变量

步骤 7.1:更新环境变量 - PATH

步骤 7.2:更新用户环境变量 - OPENCV_DIR

【讨论】:

如果你正确阅读了这个问题,你会注意到,他已经可以使用 cmake 构建了。但我想你还是很高兴记录整个步骤。

以上是关于如何用 cmake 编译 OpenCV?的主要内容,如果未能解决你的问题,请参考以下文章

如何用cmake搭建ros工程,make编译而不是catkin_make

Cmake是啥?有啥用?在WINDOWS下如何用

opencv+Qt+cmake安装配置

如何用Visual Studio 2010编译boost1.42库

CMake编译OpenCV

cmake编译opencv总是出错 求助啊