使用 opencv_contrib 在 Mac OS 终端中运行 OpenCV

Posted

技术标签:

【中文标题】使用 opencv_contrib 在 Mac OS 终端中运行 OpenCV【英文标题】:Running OpenCV in Mac OS terminal with opencv_contrib 【发布时间】:2018-06-19 12:01:27 【问题描述】:

我正在尝试通过命令行编译和运行 OpenCV。我可以让主要的 Open CV 库正常工作,但我认为我的问题在于使用 opencv_contrib 库。

我已经用 home brew 安装了 Open CV。

我可以从另一个SO question 编译和运行以下代码:

#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main( int argc, char** argv )

        Mat src = Mat(Size(320,240),CV_64F);;
        namedWindow("test");

        cout << "press any key to close" << endl;

        while(true)
                randn(src,0,1.0);
                imshow("test",src);
                if(waitKey() > 0) break;
        

这是这样编译的:

g++ cv.cpp -I"/usr/local/Cellar/opencv/3.4.1_5/include" -L"/usr/local/Cellar/opencv/3.4.1_5/lib/" -lopencv_core -lopencv_highgui -o cv

然后运行 ​​./main

但是,当我尝试使用 opencv_contrib 库运行任何东西时,我会在像这样编译时出现此错误:

g++ cv.cpp -I"/usr/local/Cellar/opencv/3.4.1_5/include" -L"/usr/local/Cellar/opencv/3.4.1_5/lib/" -I/usr/local/include/opencv -I/usr/local/include -L/usr/local/lib -lopencv_dnn -lopencv_ml -lopencv_objdetect -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_core -o cv

错误:

    Undefined symbols for architecture x86_64:
  "cv::xfeatures2d::SURF::create(double, int, int, bool, bool)", referenced from:
      _main in cv-f48298.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我相信这可能是由于没有指定 opencv_contrib 库。我知道它们是随自制软件一起安装的。在我的地窖目录中,我有一个 opencv 和 opencv_contrib 目录。我不确定 opencv_contrib 目录是否需要位于 opencv 目录中。

但我相信一切都像这样:

pkg-config --libs --cflags opencv

它输出:

-I/usr/local/include/opencv -I/usr/local/include -L/usr/local/lib -lopencv_dnn -lopencv_ml -lopencv_objdetect -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_core

但是,如果我将其添加到我的命令中,例如:

g++ cv.cpp -I"/usr/local/Cellar/opencv/3.4.1_5/include" -L"/usr/local/Cellar/opencv/3.4.1_5/lib/" pkg-config --libs --cflags opencv -o cv

我明白了:

clang: error: unsupported option '--libs'
clang: error: unsupported option '--cflags'
clang: error: no such file or directory: 'pkg-config'
clang: error: no such file or directory: 'opencv'

我可以在 Xcode 中编译相同的代码,我只需要添加 openCV 目录的搜索路径并在其中添加库。我可以通过在 finder 中打开产品文件夹并使用传入的图像运行 ./cv 来运行代码。但我正在努力通过命令行来完成这一切。

任何帮助都会很棒!

【问题讨论】:

当你用 homebrew 安装 opencv 时,你是否使用了--with-contrib 选项? 是的。我也可以通过链接其他链接器标志在 Xcode 中正常编译。链接 -I/usr/local/Cellar/opencv/3.4.1_5/include/opencv-L/usr/local/Cellar/opencv/3.4.1_5/lib-I/usr/local/Cellar/opencv/3.4.1_5/include 并在 /usr/local/Cellar/opencv/3.4.1_5/lib 中添加所有 3.41 库文件 对我来说效果很好,使用 cmake 使用命令find_package(OpenCV REQUIRED) 和后来的target_link_libraries(myproject $OpenCV_LIBS) 进行构建 【参考方案1】:

您想将pkgconfig 工具(您在上面列出的:-I/usr/local/include/opencv ...)的输出添加到您的编译命令行以正确编译。

您可以手动将此输出文本复制到编译器调用命令中:

g++ cv.cpp -I"/usr/local/Cellar/opencv/3.4.1_5/include" -L"/usr/local/Cellar/opencv/3.4.1_5/lib/" -I/usr/local/include/opencv -I/usr/local/include -L/usr/local/lib -lopencv_dnn -lopencv_ml -lopencv_objdetect -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_core -o cv

这通常是通过调用 pkgconfig inline 自动完成的:

g++ cv.cpp -I"/usr/local/Cellar/opencv/3.4.1_5/include" -L"/usr/local/Cellar/opencv/3.4.1_5/lib/" `pkg-config --libs --cflags opencv` -o cv

请注意这里的反引号 - 它们在您的命令行中丢失。使用反引号 pkgconfig 将被执行,并且输出(你知道它的样子)将被插入到命令行中。

【讨论】:

如果我运行:g++ cv.cpp -I"/usr/local/Cellar/opencv/3.4.1_5/include" -L"/usr/local/Cellar/opencv/3.4.1_5/lib/" pkg-config --libs --cflags opencv` -o cv. I get: clang: error: unsupported option '--libs' clang: error: unsupported option '--cflags' clang: error: no such file or directory: 'pkg-config' clang: error: no such file or directory: 'opencv@987654329 @ 或者如果我使用g++ cv.cpp -I"/usr/local/Cellar/opencv/3.4.1_5/include" -L"/usr/local/Cellar/opencv/3.4.1_5/lib/" -I/usr/local/include/opencv -I/usr/local/include -L/usr/local/lib -lopencv_dnn -lopencv_ml -lopencv_objdetect -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_core -o cv,我会收到上面与"cv::xfeatures2d::SURF相关的错误 对于 SURF 功能,您需要 OpenCV contrib 包,它通过使用 --with-contrib 标志与 homebrew 一起安装,参见例如pyimagesearch.com/2016/12/19/… 我已经有了 OpenCV contrib 包。如上所述,我的酒窖目录中有两个目录。我也可以在 Xcode 中编译。所以我有 SURF 功能。他们是否会在不同的位置,因此必须以不同的方式链接? 您似乎安装了多个 OpenCV 版本。 /usr/local/Cellar/opencv 的自制软件(你说它有 xfeatures_2d)。但我刚刚注意到pkgconfig 的输出在/usr/local/include 找到了另一个OpenCV 安装。通过手动将-lopencv_xfeatures2d 添加到命令行来解决链接问题,或者卸载全局 OpenCV 版本,以便您的 pkgconfig 找到自制软件。

以上是关于使用 opencv_contrib 在 Mac OS 终端中运行 OpenCV的主要内容,如果未能解决你的问题,请参考以下文章

opencv3.0配置opencv_contrib

mac下使用opencv编译安装新模块contrib

opencv_contrib 编译错误:类没有成员

编译 opencv_contrib 时出现很多错误

在Windows下编译扩展OpenCV 3.1.0 + opencv_contrib

在ubuntu18.04中安装opencv_contrib-3.2.0采坑教程