首页 > 解决方案 > 如何用 cmake 编译 OpenCV?

问题描述

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

我使用本教程下载了 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.

我按照在这里找到的建议,并添加了以下文件:

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

按照 ah-ma 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; }

欢迎任何建议。

标签: opencvcmake

解决方案


  • 下载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/


推荐阅读