使用 aruco 和 opencv4 的未解析符号

Posted

技术标签:

【中文标题】使用 aruco 和 opencv4 的未解析符号【英文标题】:Unresolved symbol using aruco with opencv4 【发布时间】:2020-06-23 13:47:06 【问题描述】:

我正在尝试使用来自 opencv 的相机姿势。所以我正在关注this series 的教程,它引导我包括这些:

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/aruco.hpp>
#include <opencv2/calib3d.hpp>

一切正常,但 aruco 除外。首先它不在我的 opencv (ver 4.3) 包中,所以我不得不去寻找它并将它放在我的 opencv 包含目录中(我添加了 aruco.hpp 以及 aruco 文件夹包含charuco.hppdictionary.hpp)。我搜索了在我的 opencv lib 目录 (x64) 中添加的 opencv_aruco310d.lib 文件。

我使用this tutorial安装了opencv

但是当我尝试运行我的代码时,它给了我这个错误:

错误 LNK2019 外部符号未解析“void __cdecl cv::aruco::drawMarker(struct cv::Ptr const &,int,int,class cv::debug_build_guard::_OutputArray const &,int)" (?drawMarker@aruco@cv@@YAXAEBU?$Ptr@VDictionary@aruco@cv@@@2@HHAEBV_OutputArray@debug_build_guard@2@H@Z) 在函数“void __cdecl createArucoMarkers(void)”中引用 (?createArucoMarkers@@YAXXZ) ConsoleApplication1

好像和这行代码有关:

aruco::drawMarker(markerDictionary, i, 500, outputMarker, 1);

我知道我这里有版本问题,我想我在某个地方看到 opencv3 之后不支持 aruco 所以我尝试使用 opencv3.4 但它仍然不起作用。

如何解决我的问题?提前谢谢你。

【问题讨论】:

【参考方案1】:

发生这种情况是因为您下载了与您当前版本的 OpenCV 库不兼容的 aruco 模块版本。解决它的最佳方法是编译 OpenCV,指定要添加 opencv_contrib 库。为避免出现问题,让我们对 OpenCV contrib 和 OpenCV 使用相同的版本:例如 4.3.0。

首先,下载OpenCV 4.3.0 source code。

其次,下载OpenCV Contrib 4.3.0 source code。

如果您以 ZIP 格式下载它们,请将它们解压缩到两个不同的文件夹中。

然后您将需要 CMake,下载并为 Windows 配置它(也许this link 可能会有所帮助)。

要使用 OpenCV contrib 编译 OpenCV,您需要通过以下命令使用 CMake:

cmake -DOPENCV_EXTRA_MODULES_PATH=<opencv_contrib>/modules <opencv_source_directory>

如指定here。在 CMake 的 GUI 版本中,您需要使用 OpenCV contrib 源代码中包含的“模块”文件夹的路径指定参数 OPENCV_EXTRA_MODULES_PATH

之后,您只需构建代码(例如,将 Visual Studio 设置为使用 CMake 的编译器,您将拥有可用于构建代码的 sln 解决方案)。

编辑:您可能还需要设置环境变量,您可以按照here 所说的内容执行此操作。

【讨论】:

它解决了我之前遇到的问题,但现在它告诉我opencv_calib3d430d.dll 在我放置它所在的目录时找不到(C:\opencv\builds \bin\Debug) 在包含... 所以程序运行然后停止并出现一个windows错误提示:“无法执行代码,因为找不到opencv_calib3d430d.dll。重新安装程序可能会解决这个问题。” 试试this,如果不行,试试this hack 顺便说一下,我认为是环境变量没有设置造成的,你可以试试this(最后一节)来设置。 感谢您发送的一些答案,这个对我有帮助:***.com/a/37240552/7862279我为opencv创建了一个环境变量,但没有添加到Path

以上是关于使用 aruco 和 opencv4 的未解析符号的主要内容,如果未能解决你的问题,请参考以下文章

ruby 中使用 C++ .so 库的未解析符号

具有菱形结构的未解析外部符号

函数中引用的未解析的外部符号 _wcstok

IAudioClient::Initialize 方法的未解析外部符号。 WASAPI API

C++:错误 LNK2019:函数 _main 中引用的未解析的外部符号

OpenCV4.5.2 无法解析的外部符号 “public: void __cdecl cv::Mat::copyTo, imread失败