【问题标题】:OpenCV via NuGet packages with Visual Studio 2015, how to configure?OpenCV 通过 NuGet 包与 Visual Studio 2015,如何配置?
【发布时间】:2017-07-08 03:05:38
【问题描述】:

我正在尝试通过 NuGet 包将 OpenCV 与 Visual Studio 2015 一起使用,但我似乎无法配置所有内容。我不确定我是否在某个地方犯了错误,或者我正在尝试的内容不受支持。

一点背景知识,我不久前制作了这个教程:

https://www.youtube.com/watch?v=7SM5OD2pZKY https://github.com/MicrocontrollersAndMore/OpenCV_3_Windows_10_Installation_Tutorial

如果可能的话,我想更新它以使用 NuGet。我每天都在工作中使用 NuGet,因此我对这个概念很熟悉,但我以前只在 .Net(Visual Basic 或 C#)应用程序中使用过 NuGet。

我正在尝试使用平面 jane C++ OpenCV 来完成这项工作,而不是在 .NET 或 UWP 应用程序中。

作为记录,在一个单独的 .Net 测试项目中,我尝试了 EmguCV NuGet 包:

使用 Visual Studio 2015,一切都按预期工作(对于那些不熟悉的人,Emgu CV 可能是 OpenCV 最古老/最知名/最稳定的 .Net 包装器)

以下是我尝试使用 NuGet 让常规 C++ OpenCV 在 Visual Studio 2015 中工作的步骤:

启动 Visual Studio 2015,创建一个空项目:

调出 NuGet 包管理器:

我选择了 OpenCV.Win.ImgProc,因为它似乎是唯一可用的 OpenCV 3.x NuGet,这也是按预期自动导入的核心:

然后我添加了一个 .cpp 文件并复制/粘贴到已知良好的 OpenCV 代码中,OpenCV 库无法识别:

我试过 Build -> Clean,Build -> Build,同样的问题。我还尝试将“解决方案配置”和“解决方案平台”设置为 Debug / Release / x86 / x64,同样的问题。

我在这里错过了一步吗? NuGet 是否仅在 .Net 或 UWP 等托管环境中工作,或者它们也可以与常规 C++ 一起工作?我确实注意到描述中提到了 UWP:

但我没有使用 VideoIO,所以我不确定这是否重要。

有人在这方面取得了成功吗?我总是可以回到“老派”方式直接引用 Project -> (project name) Properties 中的库,如上面链接到的教程中所示,但如果可能的话,我想使用 NuGets。

----------- 编辑---------------

我必须将我对 Leo-MSFT 的回复放在此处,以便有足够的字符和屏幕截图。感谢 Leo-MSFT 的建议,但有两个问题。一方面,该软件包是 OpenCV 2.4.10,现在已经非常过时了:

第二,如果我使用该包,红色下划线消失了,但是当我尝试构建和运行时出现以下链接器错误:

1>----- 构建开始:项目:Test2,配置:Debug x64 ------ 1> 测试.cpp 1>test.obj: 错误 LNK2019: 函数“public: __cdecl cv::Mat::~Mat”中引用的未解析外部符号“void __cdecl cv::fastFree(void *)”(?fastFree@cv@@YAXPEAX@Z) (void)" (??1Mat@cv@@QEAA@XZ) 1>test.obj : 错误 LNK2019: 无法解析的外部符号“public: __cdecl cv::_InputArray::_InputArray(class cv::Mat const &)” (??0_InputArray@cv@@QEAA@AEBVMat@1@@Z)在函数 main 中引用 1>test.obj:错误LNK2019:引用了未解析的外部符号“public:__cdecl cv::_OutputArray::_OutputArray(class cv::Mat &)”(??0_OutputArray@cv@@QEAA@AEAVMat@1@@Z)在功能主 1>test.obj : 错误 LNK2019: 未解析的外部符号“public: void __cdecl cv::Mat::deallocate(void)” (?deallocate@Mat@cv@@QEAAXXZ) 在函数“public: void __cdecl cv:: Mat::release(void)" (?release@Mat@cv@@QEAAXXZ) 1>test.obj : 错误 LNK2019: 未解析的外部符号“public: void __cdecl cv::Mat::copySize(class cv::Mat const &)” (?copySize@Mat@cv@@QEAAXAEBV12@@Z) 中引用函数“公共:类 cv::Mat & __cdecl cv::Mat::operator=(类 cv::Mat const &)”(??4Mat@cv@@QEAAAAEAV01@AEBV01@@Z) 1>test.obj:错误 LNK2019:未解析的外部符号“int __cdecl cv::_interlockedExchangeAdd(int *,int)”(?_interlockedExchangeAdd@cv@@YAHPEAHH@Z) 在函数“public: class cv::Mat & __cdecl”中引用cv::Mat::operator=(class cv::Mat const &)" (??4Mat@cv@@QEAAAAEAV01@AEBV01@@Z) 1>test.obj:错误 LNK2019:无法解析的外部符号“void __cdecl cv::namedWindow(class std::basic_string,class std::allocator > const &,int)”(?namedWindow@cv@@YAXAEBV?$basic_string@ DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z) 在函数 main 中引用 1>test.obj:错误 LNK2019:函数 main 中引用的未解析外部符号“int __cdecl cv::waitKey(int)”(?waitKey@cv@@YAHH@Z) 1>test.obj:错误 LNK2019:无法解析的外部符号“void __cdecl cv::imshow(class std::basic_string,class std::allocator > const &,class cv::_InputArray const &)”(?imshow@cv@ @YAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBV_InputArray@1@@Z) 在函数 main 中引用 1>test.obj : 错误 LNK2019: 无法解析的外部符号 "class cv::Mat __cdecl cv::imread(class std::basic_string,class std::allocator > const &,int)" (?imread@cv@@YA ?AVMat@1@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z) 在函数 main 中引用 1>test.obj : error LNK2019: unresolved external symbol "void __cdecl cv::GaussianBlur(class cv::_InputArray const &,class cv::OutputArray const &,class cv::Size,double ,double,int)" (?GaussianBlur@cv@@YAXAEBV_InputArray@1@AEBV_OutputArray@1@V?$Size_@H@1@NNH@Z) 在函数 main 中引用 1>test.obj:错误 LNK2019:无法解析的外部符号“void __cdecl cv::Canny(class cv::_InputArray const &,class cv::_OutputArray const &,double,double,int,bool)”(?Canny@cv @@YAXAEBV_InputArray@1@AEBV_OutputArray@1@NNH_N@Z) 在函数 main 中引用 1>test.obj:错误 LNK2019:无法解析的外部符号“void __cdecl cv::cvtColor(class cv::_InputArray const &,class cv::_OutputArray const &,int,int)”(?cvtColor@cv@@YAXAEBV_InputArray@ 1@AEBV_OutputArray@1@HH@Z) 在函数 main 中引用 1>C:\Users\cdahms\Documents\Test2\x64\Debug\Test2.exe : 致命错误 LNK1120: 13 unresolved externals ========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========

在尝试了各种选择之后,我选择了这个包:

这似乎可行,尽管它被明确标记为“不是官方软件包”并且有点过时(然而从 OpenCV 3.1.0 到 3.2.0 的变化并不多)并不是很有信心。我想在发布适当的更新包之前我会使用它。

【问题讨论】:

    标签: c++ visual-studio opencv nuget


    【解决方案1】:

    OpenCV 库包是 OpenCV3.1 而不是 OpenCV.Win.ImgProc 用于您的测试 OpenCV 代码。

    下面是我的测试结果,所以你只需要为那个 OpenCV 代码安装 OpenCV3.1 NuGet 包而不是 OpenCV.Win.ImgProc。

    注意:OpenCV3.1 不是官方包。

    【讨论】:

    • @cdahms,感谢您的编辑。我已根据您的编辑更新了我的答案。您能否将其标记为答案或写下您的答案并标记它,这对其他有同样问题的社区有好处。谢谢。
    • 我很高兴为您的答案投票,但我不想将其标记为已接受的答案 b/c 我想在没有接受答案的情况下留下问题,直到有人在OpenCV 组织产生了一个官方的和最新的(现在是 s/b 3.2.0)和工作的 NuGet 包。
    • 我做了上面描述的事情并且遇到了很多错误,就像我手动添加 openCV 作为依赖项时遇到的错误一样——你碰巧知道可能是什么原因吗? :) stackoverflow.com/questions/43018537/…
    • @Lech Migdal,您是否尝试过使用 OpenCV3.1 而不是 OpenCV3.2?
    • @Leo-MSFT 直接添加依赖项时我使用openCV3.2,但按照您上面的描述,我已经为OpenCV3.1 添加了nuget ...
    猜你喜欢
    • 2016-09-02
    • 1970-01-01
    • 2016-12-10
    • 2014-06-30
    • 2015-03-23
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多