2016-11-01 190 views
0

我是C++的新手,嘗試在閾值上實現下面的OpenCV教程。 教程:http://docs.opencv.org/2.4/doc/tutorials/imgproc/threshold/threshold.html#basic-threshold什麼C++ OpenCV庫支持`threshold`函數?

代碼幾乎編譯除2個功能:

  • threshold()
  • cvtColor()

如果這些功能被移除然後我可以編譯和運行,但是kindof擊敗本教程的目的。

錯誤:

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使用文件名在所有庫中獲取所有導出的符號,忽略所有以版本號結尾的符號,因爲它們主要是強制性的牛逼符號鏈接無論如何,他們混淆問題:

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

樣本輸出

libopencv_imgproc.dylib: __ZN2cv9thresholdERKNS_11_InputArrayERKNS_12_OutputArrayEddi T 1861788 0 

所以,告訴我你需要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++中找到未解決的符號,所以我需要在編譯時使用該庫。