在 mac os x sierra 上使用 opencv c++ 编译 hello world

Posted

技术标签:

【中文标题】在 mac os x sierra 上使用 opencv c++ 编译 hello world【英文标题】:Compiling hello world with opencv c++ on mac os x sierra 【发布时间】:2017-02-17 14:46:01 【问题描述】:

我第一次无法编译 hello world。 我已经学习了大量如何安装 opencv 的教程。 我只有以下示例:

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

using namespace std;
using namespace cv;

int main()


    Mat imageMe = imread("test.jpg", 0);
    return 0;

来自 opencv 网站。 看起来很简单,但它不会编译。

g++ display_image.cpp `pkg-config --cflags --libs opencv` -l

这是错误:

display_image.cpp:2:10: fatal error: 'opencv2/core/core.hpp' file not found
#include <opencv2/core/core.hpp>
         ^
1 error generated.

并运行:

pkg-config --cflags --libs opencv 

返回这个:

-I/usr/local/Cellar/opencv3/3.2.0/include/opencv -I/usr/local/Cellar/opencv3/3.2.0/include/opencv2 -L/usr/local/Cellar/opencv3/3.2.0/lib -lopencv_calib3d -lopencv_imgproc -lopencv_contrib -lopencv_legacy -l 

这些文件存在。

正在运行ls /usr/local/Cellar/opencv3/3.2.0/include/opencv2/core | grep core.hpp 给出结果:

core.hpp

有什么问题?

编辑: 我一直在使用以下教程在我的机器上安装 opencv:

http://www.pyimagesearch.com/2016/12/19/install-opencv-3-on-macos-with-homebrew-the-easy-way/

https://www.learnopencv.com/install-opencv-3-on-yosemite-osx-10-10-x/

https://blogs.wcode.org/2014/10/howto-install-build-and-use-opencv-macosx-10-10/

http://seeb0h.github.io/howto/howto-install-homebrew-python-opencv-osx-el-capitan/

编辑:

即使得到所有这些答案,我也无法编译单个应用程序。即使它以某种方式可以找到直接包含在我的文件中的 .hpp 文件,它也无法在其中找到包含。

可能我的配置有误。 在 /usr/local/Cellar/opencv3 我有 2 个目录: 3.2.0 - 可能已安装的二进制文件 HEAD-9053839 - 从源代码编译

现在我在 /usr/local/lib/pkgconfig 中也有 opencv.pc 文件:

prefix=/usr/local/Cellar/opencv3/3.2.0       
exec_prefix=$prefix
includedir=$prefix/include
libdir=$exec_prefix/lib

Name: opencv
Description: The opencv library
Version: 2.x.x
Cflags: -I$includedir/opencv -I$includedir/opencv2
Libs: -L$libdir -lopencv_calib3d -lopencv_imgproc -lopencv_contrib -lopencv_legacy -l

作为前缀,我也尝试过 HEAD-9053839。

我创建了更简单的示例:

#include <opencv2/opencv.hpp>
int main()return 0; 

它仍然告诉我找不到“opencv2/opencv.hpp”文件。 然后我打印了 pkg-config 的内容: pkg-config --cflags --libs opencv

-I/usr/local/Cellar/opencv3/3.2.0/include/opencv -I/usr/local/Cellar/opencv3/3.2.0/include/opencv2 -L/usr/local/Cellar/opencv3/3.2.0/lib -lopencv_calib3d -lopencv_imgproc -lopencv_contrib -lopencv_legacy -l 

发现它宁愿直接包含目录,而不是 opencv/opencv2 子目录。

所以我像这样运行 g++:

g++ -I/usr/local/Cellar/opencv3/3.2.0/include -L/usr/local/Cellar/opencv3/3.2.0/lib -lopencv_calib3d -lopencv_imgproc -lopencv_contrib -lopencv_legacy -l display_image.cpp

然后它告诉我:

ld: library not found for -lopencv_contrib

删除后它说:

ld: library not found for -lopencv_legacy

然后我不得不在 display_image.cpp 之前删除 -l,但是我又遇到了另一个错误:

Undefined symbols for architecture x86_64:
  "cv::String::deallocate()", referenced from:
      cv::String::~String() in display_image-9d8f86.o
      cv::String::operator=(cv::String const&) in display_image-9d8f86.o

这是地狱。

【问题讨论】:

我一般都是在指定源文件前加上-I directives,一直觉得顺序是有意义的,你可以试试吗? 您在包含中使用了opencv2 作为refix...删除它。 在 OpenCV 3.x 中将第 2 行和第 3 行替换为 #include &lt;opencv2/opencv.hpp&gt; 【参考方案1】:

我没有编译环境来重新生成您的错误,但我认为问题在于您的代码中的这些行:

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

因为正在搜索opencv目录

/usr/local/Cellar/opencv3/3.2.0/include/opencv2

正如您的“pkg-config --cflags --libs opencv”所暗示的那样。所以,我想,将包含行更改为

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

会有所帮助,或者您可以像这样隐式声明要搜索的目录:

g++ -I/usr/local/Cellar/opencv3/3.2.0/include display_image.cpp ...

【讨论】:

考虑到绝大多数 OpenCV 代码都包含#include &lt;opencv2/core/core.hpp&gt; 的形式,这看起来像是pkg-config 的一些问题。因此,我更喜欢您的第二种方法(或者更好的是,找出 pkg-config 的问题并修复它)。 在 display_image.cpp:2 包含的文件中:/usr/local/Cellar/opencv3/3.2.0/include/opencv2/core/core.hpp:48:10:致命错误:'opencv2 /core.hpp' 文件未找到 好吧,您的 pkg-config 似乎有问题。包含语句并不像您想象的那样复杂。尝试使用终端定位库并检查那里是否真的有 core.hpp。如果没有,你应该检查你的 opencv 安装。如果你有正确的库,那么这意味着你没有正确地告诉编译器在哪里检查。【参考方案2】:

OpenCV 3.x 中,头文件的布局发生了变化,现在您几乎只需使用:

#include <opencv2/opencv.hpp>

因此,具体而言,我建议您将第二行和第三行替换为上述咒语。

请参阅OpenCV Transition Guide。

【讨论】:

同样适用于 Opencv 4。在头文件 opencv.hpp 中,它们只包含所有其他头文件。所以理论上,不需要包含其他的OpenCV头文件。【参考方案3】:

Soner 的回答应该可以解决 OP 的问题。我想添加一些其他解决方案。

如果您使用 CMake 从源代码安装 openCV,它将把 OpenCV 库放在 /usr/local/lib 中,并将 OpenCV 头文件放在 /usr/local/include 中。标题都放在子文件夹/usr/local/include/opencv 中。由于它们是大多数 IDE 的默认库和头目录,因此您找到的所有示例都可以使用该配置。

现在,brew 不会将 OpenCV 安装到您已经知道的上述文件夹中。所以你有三个选择:

    更改编译器对 OpenCV 库和头文件的搜索路径:g++ -I/usr/local/Cellar/opencv3/3.2.0/include -L/usr/local/Cellar/opencv3/3.2.0/lib

    软链接/usr/local/Cellar/opencv3/3.2.0/include/opencv/usr/local/include/usr/local/Cellar/opencv3/3.2.0/lib/usr/local/lib

    使用 CMake 从源代码安装 OpenCV。

【讨论】:

【参考方案4】:

我做到了! 这是 pkg-config 的问题。 在/usr/local/Cellar/opencv3/3.2.0/lib/pkgconfig我找到了opencv.pc,它看起来像这样:

# Package Information for pkg-config

prefix=/usr/local/Cellar/opencv3/3.2.0
exec_prefix=$prefix
libdir=$exec_prefix/lib
includedir_old=$prefix/include/opencv
includedir_new=$prefix/include

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 3.2.0
Libs: -L$exec_prefix/lib -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core
Libs.private: -framework OpenCL -L/usr/local/opt/jpeg/lib -ljpeg -L/usr/local/lib -lpng -ltiff -lImath -lIlmImf -lIex -lHalf -lIlmThread -L/usr/lib -lz -framework Cocoa -framework AVFoundation -framework CoreGraphics -framework CoreMedia -framework CoreVideo -framework QuartzCore -framework Accelerate
Cflags: -I$includedir_old -I$includedir_new

我已替换旧的 opencv.pc 位于:/usr/local/lib/pkgconfig 现在我没有收到任何错误。

我还必须使用不同的包含文件:

#include <opencv2/opencv.hpp>

【讨论】:

在此之后我仍然有错误。我需要关注 ***.com/questions/24985713/…@ 的 Mark Setchell 的回答 brew install pkg-config 。然后 brew 重新安装 opencv 。然后 pkg-config --cflags --libs opencv 看看那里有什么。然后 g++ @pkg-config --cflags --libs opencv@ display_image.cpp -o display_image (注意替换@ w/键盘左上角的反引号)。 在opencv2/opencv.hpp的#include之后,上面安装pkg-config,重新安装opencv,使用pkg-config正确加载库,我成功了。

以上是关于在 mac os x sierra 上使用 opencv c++ 编译 hello world的主要内容,如果未能解决你的问题,请参考以下文章

在 Mac OS X Sierra 上为 Django Python 安装 mysqlclient

在 Mac OS X (sierra & Mojave) 中启用 OpenMP 支持

sh Mac OS X High Sierra / PHP Apache httpd配置节点NPM

如何在 Mac OS Sierra 上使用 Python3.5 绝对安装 virtualenvwrapper?

为啥mac升级之后,升级成mac OS Sierra 10.12.1,我的parallels Desktop就启动不了,需要重新安装吗?

Mac git pull失败,最新操作系统导致 SSH issues with Mac OS X High Sierra