简体   繁体   中英

Compiling hello world with opencv c++ on mac os x sierra

First time I cannot compile hello world. I've followed tons of tutorials how to install opencv. I just have following example:

#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;
}

from opencv website. Looks straightforward, but it won't compile.

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

Here's the error:

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

And running:

pkg-config --cflags --libs opencv 

return this:

-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 

these files are present.

Running ls /usr/local/Cellar/opencv3/3.2.0/include/opencv2/core | grep core.hpp ls /usr/local/Cellar/opencv3/3.2.0/include/opencv2/core | grep core.hpp Gives the result:

core.hpp

What's the problem?

edit: I've been using following tutorials to install opencv on my machine:

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/

edit:

Even after all these answers I cannot compile a single app. Even if it somehow can find .hpp file directly included in my file it fails finding includes inside.

Probably my configuration is wrong. In /usr/local/Cellar/opencv3 I have 2 directories: 3.2.0 - probably installed binaries HEAD-9053839 - compiled from source

Now I also have opencv.pc file located in /usr/local/lib/pkgconfig:

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

As a prefix I've also tried HEAD-9053839.

I've created even simplier example:

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

It's still telling me that 'opencv2/opencv.hpp' file not found. Then I printed what pkg-config says: 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 

And found out it'd rather should be directly include dir, not opencv/opencv2 subdirectories.

So I've ran g++ like this:

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

Then it told me:

ld: library not found for -lopencv_contrib

After removing it it said:

ld: library not found for -lopencv_legacy

Then I had to remove -l before display_image.cpp, but then I've got another error:

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

This is hell.

I don't have a compilation environment to regenerate your error but I think the problem is about these lines in your code:

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

since the opencv directory is being searched from

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

as your "pkg-config --cflags --libs opencv" implies. So, I suppose, changing the include lines into

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

would help, or you can implicitly declare the directory you want to search like this:

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

In OpenCV 3.x , the layout of the header files has changed and now you pretty much just use:

#include <opencv2/opencv.hpp>

So, in concrete terms, I am suggesting you replace your 2nd and 3rd lines with the above incantation.

See the OpenCV Transition Guide .

Soner's answer should solve the OP's problem. I want to add some other solutions.

If you use CMake to install openCV from source, it will put OpenCV libraries in /usr/local/lib and OpenCV headers in /usr/local/include . Where the headers all go in the subfolder /usr/local/include/opencv . Since they are default library and header directories for most IDE's, all the examples you find will work with that config.

Now, brew does not install OpenCV to the above folders as you already knew. So you have three options:

  1. Change compiler's search paths for OpenCV libraries and headers: g++ -I/usr/local/Cellar/opencv3/3.2.0/include -L/usr/local/Cellar/opencv3/3.2.0/lib

  2. Soft link /usr/local/Cellar/opencv3/3.2.0/include/opencv to /usr/local/include and /usr/local/Cellar/opencv3/3.2.0/lib to /usr/local/lib

  3. Install OpenCV from source with CMake.

I did it! It was a problem with pkg-config. In /usr/local/Cellar/opencv3/3.2.0/lib/pkgconfig I've found opencv.pc, which looks like this:

# 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}

I've replaced old opencv.pc located in: /usr/local/lib/pkgconfig Now I'm not getting any errors.

I also had to use different include file:

#include <opencv2/opencv.hpp>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM