哪些c++ OpenCV库支持' threshold '函数?
What C++ OpenCV library supports the `threshold` function?
我是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++
中找到未解析的符号,所以我需要在编译时使用该库。
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 哪些c++ OpenCV库支持' threshold '函数?
- 在 Eclipse 中使用某些 OpenCV 函数时出现链接错误"threshold"