哪些c++ OpenCV库支持' threshold '函数?

What C++ OpenCV library supports the `threshold` function?

本文关键字:threshold 函数 c++ OpenCV 支持 哪些      更新时间:2023-10-16

我是c++的新手,并试图实现下面的OpenCV阈值教程。教程:http://docs.opencv.org/2.4/doc/tutorials/imgproc/threshold/threshold.html basic-threshold

代码几乎可以编译除了两个函数:

  • threshold()
  • cvtColor()

如果这些函数被删除,那么我可以编译和运行,但这有点违背了教程的目的。

错误:

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_- lopencv_superres -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背景,那里的库管理要简单得多。如果你能帮我调试这个程序,我将不胜感激。

Edit:我在Mac上使用Eclipse编辑器

我不知道比使用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++中找到未解析的符号,所以我需要在编译时使用该库。