【问题标题】:Error when building OpenCV 3 for Mac OS X为 Mac OS X 构建 OpenCV 3 时出错
【发布时间】:2015-09-02 23:02:43
【问题描述】:

我正在尝试为 Mac OS X 构建 OpenCV 3。我正在按照 http://www.pyimagesearch.com/2015/06/15/install-opencv-3-0-and-python-2-7-on-osx/ 的说明进行操作

我得到以下输出:

...
[ 50%] Linking CXX executable ../../bin/opencv_test_latentsvm
[ 50%] Built target opencv_test_latentsvm
[ 50%] Building CXX object modules/features2d/CMakeFiles/opencv_perf_features2d.dir/perf/perf_main.cpp.o
[ 50%] Building CXX object modules/line_descriptor/CMakeFiles/opencv_line_descriptor.dir/src/binary_descriptor_matcher.cpp.o
[ 50%] Building CXX object modules/features2d/CMakeFiles/opencv_test_features2d.dir/test/test_keypoints.cpp.o
[ 50%] Building CXX object modules/features2d/CMakeFiles/opencv_perf_features2d.dir/perf/perf_orb.cpp.o
Scanning dependencies of target opencv_saliency
[ 50%] Building CXX object modules/saliency/CMakeFiles/opencv_saliency.dir/src/BING/CmFile.cpp.o
[ 50%] Building CXX object modules/line_descriptor/CMakeFiles/opencv_line_descriptor.dir/src/draw.cpp.o
[ 50%] Building CXX object modules/features2d/CMakeFiles/opencv_test_features2d.dir/test/test_main.cpp.o
[ 50%] Building CXX object modules/saliency/CMakeFiles/opencv_saliency.dir/src/BING/CmShow.cpp.o
[ 50%] Building CXX object modules/line_descriptor/CMakeFiles/opencv_line_descriptor.dir/src/LSDDetector.cpp.o
[ 50%] Linking CXX executable ../../bin/opencv_perf_features2d
[ 50%] Built target opencv_perf_features2d
[ 50%] Building CXX object modules/features2d/CMakeFiles/opencv_test_features2d.dir/test/test_matchers_algorithmic.cpp.o
[ 50%] Building CXX object modules/saliency/CMakeFiles/opencv_saliency.dir/src/BING/FilterTIG.cpp.o
Scanning dependencies of target opencv_text
[ 50%] Building CXX object modules/text/CMakeFiles/opencv_text.dir/src/erfilter.cpp.o
/Users/samadwara/opencv_contrib/modules/line_descriptor/src/LSDDetector.cpp:182:37: error: call to 'pow' is ambiguous
      kl.lineLength = (float) sqrt( pow( extremes[0] - extremes[2], 2 ) + pow( extremes[1] - extremes[3], 2 ) );
                                    ^~~
/usr/include/c++/4.2.1/cmath:364:3: note: candidate function
  pow(double __x, int __i)
  ^
/usr/include/c++/4.2.1/cmath:368:3: note: candidate function
  pow(float __x, int __n)
  ^
/usr/include/c++/4.2.1/cmath:372:3: note: candidate function
  pow(long double __x, int __n)
  ^
/usr/include/math.h:436:15: note: candidate function
extern double pow(double, double);
              ^
/usr/include/c++/4.2.1/cmath:356:3: note: candidate function
  pow(float __x, float __y)
  ^
/usr/include/c++/4.2.1/cmath:360:3: note: candidate function
  pow(long double __x, long double __y)
  ^
/Users/samadwara/opencv_contrib/modules/line_descriptor/src/LSDDetector.cpp:182:75: error: call to 'pow' is ambiguous
      kl.lineLength = (float) sqrt( pow( extremes[0] - extremes[2], 2 ) + pow( extremes[1] - extremes[3], 2 ) );
                                                                          ^~~
/usr/include/c++/4.2.1/cmath:364:3: note: candidate function
  pow(double __x, int __i)
  ^
/usr/include/c++/4.2.1/cmath:368:3: note: candidate function
  pow(float __x, int __n)
  ^
/usr/include/c++/4.2.1/cmath:372:3: note: candidate function
  pow(long double __x, int __n)
  ^
/usr/include/math.h:436:15: note: candidate function
extern double pow(double, double);
              ^
/usr/include/c++/4.2.1/cmath:356:3: note: candidate function
  pow(float __x, float __y)
  ^
/usr/include/c++/4.2.1/cmath:360:3: note: candidate function
  pow(long double __x, long double __y)
  ^
2 errors generated.
make[2]: *** [modules/line_descriptor/CMakeFiles/opencv_line_descriptor.dir/src/LSDDetector.cpp.o] Error 1
make[1]: *** [modules/line_descriptor/CMakeFiles/opencv_line_descriptor.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
[ 50%] Building CXX object modules/features2d/CMakeFiles/opencv_test_features2d.dir/test/test_mser.cpp.o
[ 51%] Building CXX object modules/saliency/CMakeFiles/opencv_saliency.dir/src/BING/objectnessBING.cpp.o
[ 51%] Building CXX object modules/text/CMakeFiles/opencv_text.dir/src/ocr_hmm_decoder.cpp.o
[ 51%] Building CXX object modules/features2d/CMakeFiles/opencv_test_features2d.dir/test/test_nearestneighbors.cpp.o
[ 51%] Building CXX object modules/saliency/CMakeFiles/opencv_saliency.dir/src/BING/ValStructVec.cpp.o
[ 51%] Building CXX object modules/saliency/CMakeFiles/opencv_saliency.dir/src/motionSaliency.cpp.o
[ 51%] Building CXX object modules/text/CMakeFiles/opencv_text.dir/src/ocr_tesseract.cpp.o
[ 51%] Building CXX object modules/features2d/CMakeFiles/opencv_test_features2d.dir/test/test_orb.cpp.o
[ 51%] Building CXX object modules/saliency/CMakeFiles/opencv_saliency.dir/src/motionSaliencyBinWangApr2014.cpp.o
[ 51%] Building CXX object modules/saliency/CMakeFiles/opencv_saliency.dir/src/objectness.cpp.o
[ 51%] Linking CXX shared library ../../lib/libopencv_text.dylib
[ 51%] Built target opencv_text
[ 51%] Building CXX object modules/features2d/CMakeFiles/opencv_test_features2d.dir/test/test_rotation_and_scale_invariance.cpp.o
[ 51%] Building CXX object modules/saliency/CMakeFiles/opencv_saliency.dir/src/saliency.cpp.o
[ 51%] Building CXX object modules/saliency/CMakeFiles/opencv_saliency.dir/src/staticSaliency.cpp.o
[ 51%] Building CXX object modules/saliency/CMakeFiles/opencv_saliency.dir/src/staticSaliencySpectralResidual.cpp.o
[ 51%] Linking CXX shared library ../../lib/libopencv_saliency.dylib
[ 51%] Linking CXX executable ../../bin/opencv_test_features2d
[ 51%] Built target opencv_saliency
[ 51%] Built target opencv_test_features2d
make: *** [all] Error 2
 ~/opencv/build $

关于如何解决此问题的任何想法?如果一切都失败了,我将安装一个 Linux VM 并使用它。

【问题讨论】:

  • 您应该将此报告给 OpenCV 3 开发人员,并检查您的编译器是否受支持。从您的错误消息/usr/include/c++/4.2.1 我推测您使用的是 gcc 4.2.1 版之类的东西?那太旧了,您可能需要升级。
  • 我将如何更新它?我下载了 gcc 5.2.0 并替换了 /usr/bin/gcc(这可能是个坏主意),但它仍然尝试使用 /usr/include/c++/4.2.1。
  • 我不知道你是如何下载它的......也许你应该使用自制软件或其他东西从源代码构建它以获得最佳效果。并且您需要确保在构建 OpenCV 时告诉它使用较新的版本
  • 我使用 brew 下载了它,然后将文件从我的 homebrew 目录复制到 /usr/bin/gcc。我如何告诉 OpenCV 使用哪个?
  • (1) 不要从 brew 复制东西,只要在 brew 放置它们的地方使用它们 (2) 阅读一些关于 cmake 的文档,这样你就可以学习如何使用构建系统并告诉它什么编译器使用

标签: python macos opencv


【解决方案1】:

我在这个过程中遇到了同样的问题。由于某种原因,该版本的 cmath 不包括处理整数的方法,用于幂函数的整数参数(extremes 是该部分代码的整数向量)。我添加了一个新函数来处理它,我在下面包含了代码。如果在对整数、浮点数或整数、双精度参数应用电源时继续编译,则会引发其他一些问题。对于这些,您可以只使用现有的内置方法来实现幂函数。

调整 cmath 并继续安装后,我没有遇到其他问题。

幂(integer, integer) 的 C++ 代码改编自*上的 Exponentiation by Squaring 文章:

inline double 
pow(int __x, int __n)
{
    double myx = __x, myn = __n;
    if (__n<0){
        myx = 1.0/ __x;
        myn = -__n;
    } 
    if(__n==0){
        return 1; 
    }
    double myy=1;
    while(myn > 1){
       if (((int)myn)%2==0){
           myx = myx * myx;
           myn = myn / 2;
       }else{
           myy = myx * myy;
           myx = myx * myx;
           myn = (myn - 1) / 2;
       }
    }
    return myx*myy;
}

【讨论】:

    【解决方案2】:

    谢谢你的夏皮罗姆。由于您的解决方案,我可以解决这个问题。为此,我修改了 cmath 源,如下所示。

      inline double
      pow(int __x, int __y)
      { return __builtin_powf(__x, __y); } 
    

    【讨论】: