【问题标题】:Running OpenCV 3 in Mac Terminal在 Mac 终端中运行 OpenCV 3
【发布时间】:2016-02-28 21:06:47
【问题描述】:

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

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

桌面罗伯特$ g++ loadIMG.cpp 架构 x86_64 的未定义符号: “cv::namedWindow(cv::String const&, int)”,引用自: _main 在 loadIMG-54c517.o “cv::Mat::deallocate()”,引用自: loadIMG-54c517.o 中的 cv::Mat::release() “cv::Mat::copySize(cv::Mat const&)”,引用自: cv::Mat::operator=(cv::Mat const&) 在 loadIMG-54c517.o “cv::String::deallocate()”,引用自: loadIMG-54c517.o 中的 cv::String::~String() “cv::String::allocate(unsigned long)”,引用自: loadIMG-54c517.o 中的 cv::String::String(char const*) “cv::imread(cv::String const&, int)”,引用自: _main 在 loadIMG-54c517.o “cv::imshow(cv::String const&, cv::_InputArray const&)”,引用自: _main 在 loadIMG-54c517.o “cv::waitKey(int)”,引用自: _main 在 loadIMG-54c517.o “cv::fastFree(void*)”,引用自: 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/

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

【问题讨论】:

  • 如果你想安装非 Apple 包,例如 OpenCVImageMagickffmpeggnuplotparallelpandocp7zip,在Mac,你真的会帮自己一个忙,从brew.sh 安装homebrew 作为你的包管理器来下载、安装、更新和删除包。然后OpenCV 就像brew install opencv 一样简单,你就完成了。

标签: c++ macos opencv image-processing


【解决方案1】:

你没有指定:

  1. 包含路径(头搜索路径)使用-I"/path/to/your/include"
  2. 使用 -L"/path/to/libraries" 的库路径
  3. 链接哪些库,在本例中为 core 和 highgui:-lopencv_core -lopencv_highgui

我在/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 安装在 /usr/local 文件夹而不是 /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,您可以使用它来创建命令行工具并指向标题搜索路径和库搜索路径。

【讨论】:

  • 我收到一个错误:'opencv2/opencv.hpp' file not found。我安装的 opencv-3.0.0 目录在我的电脑上必须如何排列?我在哪里可以找到标题和库?我还注意到我的/usr/local/ 目录是空的。
  • 当你按照教程创建 SharedLibs 文件夹,然后使用make 然后make install,你使用了什么文件夹?如果您不确定,请返回 CMake 并向下滚动,直到找到 CMAKE_INSTALL_PREFIX 部分。这应该是编译后共享库和头文件将在编译后复制的路径。
  • 你试过用finder来定位吗?它可能没有正确安装。您可能会发现构建过程中遗留下来的几个版本。您想要的可能在 /opt 或 /usr 中。就我个人而言,我发现使用 mac 端口安装 opencv 比自己构建更容易。 opencv3 的头文件布局也与 2.4 不同,请参阅docs.opencv.org/master/db/dfa/tutorial_transition_guide.html
  • @BobbyL。如果你在终端中运行pkg-config --libs --cflags opencv,你会得到什么输出?
  • 有效! g++ main.cpp pkg-config --libs --cflags opencv` -o main` 是否应该包含所有 OpenCV 3 头文件?例如:&lt;opencv2/highgui/highgui.hpp&gt;
【解决方案2】:

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

我首先使用:

sudo brew install opencv

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

#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).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-02
    • 2013-09-20
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 2020-04-01
    • 2016-01-10
    • 1970-01-01
    相关资源
    最近更新 更多