在Mac终端中运行OpenCV 3

时间:2015-11-25 22:11:46

标签: c++ macos opencv image-processing

过去一周,我一直在尝试使用终端运行一些简单的OpenCV程序。我已尝试过各种论坛的许多教程和建议,但收效甚微。尝试将OpenCV头文件链接到我的OpenCV主程序时出现问题。对于一个简单的c ++程序,我只需执行g++ main.cpp header.hpp来生成可执行的程序。如何链接必要的OpenCV头文件,例如<opencv2/highgui/highgui.hpp>&amp; <opencv2/core/core.hpp>

例如,当尝试从http://docs.opencv.org/2.4/doc/tutorials/introduction/display_image/display_image.html执行示例程序时,会发生以下情况:

  

桌面Robert $ g ++ loadIMG.cpp   架构x86_64的未定义符号:   &#34; cv :: namedWindow(cv :: String const&amp;,int)&#34;,引自:      _main in loadIMG-54c517.o   &#34; cv :: Mat :: deallocate()&#34;,引自:      loadIMG-54c517.o中的cv :: Mat :: release()   &#34; cv :: Mat :: copySize(cv :: Mat const&amp;)&#34;,引自:      loadIMG-54c517.o中的cv :: Mat :: operator =(cv :: Mat const&amp;)   &#34; cv :: String :: deallocate()&#34;,引自:      loadIMG-54c517.o中的cv :: String :: ~String()   &#34; cv :: String :: allocate(unsigned long)&#34;,引自:      loadIMG-54c517.o中的cv :: String :: String(char const *)   &#34; cv :: imread(cv :: String const&amp;,int)&#34;,引自:      _main in loadIMG-54c517.o   &#34; cv :: imshow(cv :: String const&amp;,cv :: _ InputArray const&amp;)&#34;,引自:      _main in loadIMG-54c517.o   &#34; cv :: waitKey(int)&#34;,引自:      _main in loadIMG-54c517.o   &#34; cv :: fastFree(void *)&#34;,引自:       loadIMG-54c517.o中的cv :: Mat :: ~Mat()   ld:找不到架构x86_64的符号   clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

请注意:OpenCV已经使用以下教程构建:http://blogs.wcode.org/2014/10/howto-install-build-and-use-opencv-macosx-10-10/

任何帮助或指示都将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:3)

您还没有指定:

  1. 使用-I"/path/to/your/include"
  2. 的包含路径(标题搜索路径)
  3. 使用-L&#34; / path / to / libraries&#34;
  4. 的库路径
  5. 要链接的库,在本例中为core和highgui:-lopencv_core -lopencv_highgui
  6. 我在/opt/local/include中有opencv标头,在/opt/local/lib中有图书馆, 所以编译一个这样的基本程序:

    #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++ main.cpp -I"/opt/local/include/" -L"/opt/local/lib/" -lopencv_core -lopencv_highgui -o main
    

    然后运行./main

    opencv test

    请记住,您可能在/usr/local文件夹中安装了opencv而不是/opt/local,具体取决于您编译/安装OpenCV的方式。

    此外,您可能安装了pkg-config,当您需要链接更多库时,它可以派上用场。

    例如,您可以运行:

    pkg-config --libs --cflags opencv
    

    在我的案例中输出:

    -I/opt/local/include/opencv -I/opt/local/include -L/opt/local/lib -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab 
    

    但在您的情况下,它应该输出您的特定OpenCV路径。

    这将简化编译:

    g++ main.cpp `pkg-config --libs --cflags opencv` -o main
    

    您链接的指南使用cmake为您生成Makefile。 这是另一个不错的选择。此外,基于相同的指南,您应该安装XCode,您可以使用它来创建命令行工具并指向标题搜索路径和库搜索路径。

    Xcode Command Line Tool project creation

答案 1 :(得分:0)

我创建了一个类似的文件,可以帮助你。

首先我使用:

sudo brew install opencv

然后根据终端提供的提示安装opencv.3.0。然后在需要来自.cpp的API的opencv文件中,我使用:

#include "opencv2/opencv.hpp"

作为我唯一包含opencv的文件。实际上,在该项目中,我使用highguicoreimgprog。但不用担心,我会告诉你如何在链接部分解决它们。

完成项目后,您将在终端上编译项目。

因为我也使用了JNI接口,所以我仍然需要链接 jni.h

我们走了:

g++   xxxx.cpp xxx.cpp -lstdc++ -fPIC -shared (to create a shared object)  
-I/absolute path/ (we can use -I  to be followed with  the absolute path of the library you need to use )
-I/Users/yuanzhan/Downloads/OpenCV-2.0.0/src/
-I /Users/yuanzhan/Downloads/OpenCV-2.0.0/include/opencv/ -I/usr/local/Cellar/opencv3/3.1.0_3/lib   -lopencv_core (open the library for use if you use the API fro here)-lopencv_highgui -lopencv_imgproc -L.(i put the cv2. on local otherwise you can add the absolute path here) -lcv2(use the package)  -v -o libopenCvSDK.so(generate my .so package).