在 Mac OSX 10.8、XCode 4.6 上,使用 C++
我正在关注opencv_tutorials.pdf
位于/opt/local/share/OpenCV/doc
我的系统中的教程。在第 311 页,我们得到了这个示例(稍作编辑):
#include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
using namespace cv;
int main( int argc, char** argv ) {
Mat img_1 = imread( argv[1], CV_LOAD_IMAGE_GRAYSCALE );
int minHessian = 400;
SurfFeatureDetector detector( minHessian );
std::vector<KeyPoint> keypoints_1;
detector.detect( img_1, keypoints_1 );
}
我不得不将上面的代码修改为#include "opencv2/nonFree/features2d.hpp"
我通过运行找到的文件
find /opt/local/include -name "*.hpp" -exec grep SurfFeatureDetector "{}" ';' -print
代码编译,这意味着detector.detect
在文件中找到符号hpp
并通过 C++ 编译器的类型检查。接下来是尝试查找包含符号的库。
现在,我的发行版中有这些库,位于/opt/local/lib
:
libopencv_calib3d.2.4.3.dylib
libopencv_contrib.2.4.3.dylib
libopencv_core.2.4.3.dylib
libopencv_features2d.2.4.3.dylib
libopencv_flann.2.4.3.dylib
libopencv_gpu.2.4.3.dylib
libopencv_highgui.2.4.3.dylib
libopencv_imgproc.2.4.3.dylib
libopencv_legacy.2.4.3.dylib
libopencv_ml.2.4.3.dylib
libopencv_nonfree.2.4.3.dylib
libopencv_objdetect.2.4.3.dylib
libopencv_photo.2.4.3.dylib
libopencv_stitching.2.4.3.dylib
libopencv_ts.2.4.3.dylib
libopencv_video.2.4.3.dylib
libopencv_videostab.2.4.3.dylib
我发现在nm
这些符号中搜索所需的符号并没有提供任何信息,因为在我的脑海中很难对名称进行反编译。我只是蛮力包含了所有库,但仍然出现链接器错误:
Undefined symbols for architecture x86_64:
"cv::imread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)", referenced from:
_main in main.o
"cv::FeatureDetector::detect(cv::Mat const&, std::__1::vector<cv::KeyPoint, std::__1::allocator<cv::KeyPoint> >&, cv::Mat const&) const", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
从这里开始,我对 OpenCv 参考文档和 wiki 页面进行了一些抽查
http://opencv.willowgarage.com/documentation/cpp/features2d__feature_detection_and_descriptor_extraction.html
但没有成功。
我将不胜感激
- 查找这些 OpenCv API 的具体帮助
- 这种查询的一般策略:“什么库包含我需要链接的符号”。这种问题让我讨厌 C++,因为 5 分钟的编码似乎总是导致数小时的偶然发现库搜索,可能是因为我只是不知道这样做的专业秘密。