在 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 <opencv2/opencv.hpp>
【参考方案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 <opencv2/core/core.hpp>
的形式,这看起来像是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