2016-11-01 23 views
0

私はC++の新機能で、以下のOpenCVチュートリアルをしきい値で実装しようとしています。 チュートリアル:これらの機能は、その後削除された場合どのようなC++ OpenCVライブラリが `threshold`関数をサポートしていますか?

  • threshold()
  • cvtColor()

私はコンパイルして実行することができますが、それはkindofが敗北:http://docs.opencv.org/2.4/doc/tutorials/imgproc/threshold/threshold.html#basic-threshold

コードは、ほぼ2つの機能を除いてコンパイルしますチュートリアルの目的。

エラー:

Undefined symbols for architecture x86_64: 
    "cv::cvtColor(cv::_InputArray const&, cv::_OutputArray const&, int, int)", referenced from: 
     _main in HelloWorld.o 
    "cv::threshold(cv::_InputArray const&, cv::_OutputArray const&, double, double, int)", referenced from: 
     Threshold_Demo(int, void*) in HelloWorld.o 

マイライブラリpkg-config --libs opencv経由:

-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_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab

チュートリアルコード:

#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include <stdlib.h> 
#include <stdio.h> 

using namespace cv; 

/// Global variables 

int threshold_value = 0; 
int threshold_type = 3;; 
int const max_value = 255; 
int const max_type = 4; 
int const max_BINARY_value = 255; 

Mat src, src_gray, dst; 
char* window_name = "Threshold Demo"; 

char* trackbar_type = "Type: \n 0: Binary \n 1: Binary Inverted \n 2: Truncate \n 3: To Zero \n 4: To Zero Inverted"; 
char* trackbar_value = "Value"; 

/// Function headers 
void Threshold_Demo(int, void*); 

/** 
* @function main 
*/ 
int main(int argc, char** argv) 
{ 
    /// Load an image 
    src = imread(argv[1], 1); 

    /// Convert the image to Gray 
    cvtColor(src, src_gray, CV_BGR2GRAY); 

    /// Create a window to display results 
    namedWindow(window_name, CV_WINDOW_AUTOSIZE); 

    /// Create Trackbar to choose type of Threshold 
    createTrackbar(trackbar_type, 
        window_name, &threshold_type, 
        max_type, Threshold_Demo); 

    createTrackbar(trackbar_value, 
        window_name, &threshold_value, 
        max_value, Threshold_Demo); 

    /// Call the function to initialize 
    Threshold_Demo(0, 0); 

    /// Wait until user finishes program 
    while(true) 
    { 
    int c; 
    c = waitKey(20); 
    if((char)c == 27) 
     { break; } 
    } 

} 


/** 
* @function Threshold_Demo 
*/ 
void Threshold_Demo(int, void*) 
{ 
    /* 0: Binary 
    1: Binary Inverted 
    2: Threshold Truncated 
    3: Threshold to Zero 
    4: Threshold to Zero Inverted 
    */ 

    threshold(src_gray, dst, threshold_value, max_BINARY_value,threshold_type); 

    imshow(window_name, dst); 
} 

私はどこRubyの背景から来ていますライブラリ管理ははるかに簡単です。これをデバッグする助けがあれば、非常に感謝しています。

編集:私はMacでEclipseエディタを使用しています。

答えて

1

nmを使用するよりも、特定の機能に必要なライブラリを簡単に見つける方法がわかりません。ですから、OpenCVライブラリがインストールされている場所、つまりコンパイルコマンドラインの-Lの後ろのビットを見つける必要があります。あなたはpkg-configを持っているとして、あなたが使用することができ、:

pkg-config --libs-only-L opencv 

をサンプル出力

-L/usr/local/Cellar/opencv3/3.1.0_4/lib 

ので、上記の場合には、あなたはどうなる:

cd /usr/local/Cellar/opencv3/3.1.0_4/lib 

は今、あなたは実行したいですnmすべてのライブラリでエクスポートされたすべてのシンボルをファイル名で取得するには、バージョン番号で終わるすべてのライブラリを無視します(主にjusです)。トンのシンボリックリンクとにかく、彼らは問題を混同:

libopencv_imgproc.dylib: __ZN2cv9thresholdERKNS_11_InputArrayERKNS_12_OutputArrayEddi T 1861788 0 

nm -g -APU *[A-Za-z].dylib | grep threshold 

サンプル出力は、だからそれはあなたがimgprocライブラリ必要私に語った - あなたが既に持っています。だから何が起こっているのですか?

OpenCVの構築方法は、リンカがシンボルを解決できるように、リンクする方法と一致しなければならないという問題があります。

OpenCVがclang++ -std=c++11 -stdlib=libstdc++で構築されている場合は、同じ方法でアプリケーションを構築する必要があります。

OpenCVが-stdlib=libc++で構築されている場合は、アプリケーションをリンクするときに同じものを使用する必要があります。

あり(すなわち、それはに対してリンクするライブラリ)何かが構築された方法を指示する簡単な方法でなければならず、多分誰かが私に教えてくれますが、これは動作します:

まず、あなたのlibopencv_imgproc.dylibを見つける:

find /usr /opt -name libopencv_imgproc.dylib 

その後、シンボルが不足している見つけるために、それにnm -mを実行し、それがからそれらを取得したい場所:だから

nm -m libopencv_imgproc.dylib | grep "from libc" 

       (undefined) external __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv (from libc++) 
       (undefined) external __ZNSt3__16__sortIRNS_6__lessIiiEEPiEEvT0_S5_T_ (from libc++) 
       (undefined) external __ZSt9terminatev (from libc++) 
       (undefined) external __ZTVN10__cxxabiv117__class_type_infoE (from libc++) 
       (undefined) external __ZTVN10__cxxabiv120__si_class_type_infoE (from libc++) 
       (undefined) external __ZTVN10__cxxabiv121__vmi_class_type_infoE (from libc++) 
       (undefined) weak external __ZdaPv (from libc++) 
       (undefined) weak external __ZdlPv (from libc++) 
       (undefined) weak external __Znam (from libc++) 
       (undefined) weak external __Znwm (from libc++) 
       (undefined) external ___cxa_begin_catch (from libc++) 
       (undefined) external ___cxa_end_catch (from libc++) 
       (undefined) external ___cxa_guard_acquire (from libc++) 
       (undefined) external ___cxa_guard_release (from libc++) 
       (undefined) external ___cxa_pure_virtual (from libc++) 
       (undefined) external ___cxa_rethrow (from libc++) 
       (undefined) external ___gxx_personality_v0 (from libc++) 

、私は目を見ることができます私の図書館では、未解決のシンボルがlibc++にあると予想しているので、コンパイル時にそのライブラリを使用する必要があります。

関連する問題