VC2010下编译OpenCV3.2问题记录

来源:互联网 发布:java md5 32大加密 编辑:程序博客网 时间:2024/06/13 16:06
工作需要编译OpenCV3.2的tracking库,这是一个扩展库,整个过程遇到一些问题,记录如下:

1、使用CMAKE配置时,有几处提示错误。如download_protobuf.cmake出错。可能是文件下载地址的问题,从网上搜索对应的文件,手动下载。通过。此外工程路径要避免中文,否则会有意外的错误,提示某些变量未找到。

2、产生的sln文件在VC2010下编译,出现dll和exe共100个(92成功,未成功的是exe,路径设置问题),没有出现contrib扩展库。后来重新检查CMAKE配置,在OPENCV_EXTRA_MOUDLES_PATH 项里添加opencv_contrib-master的moudles路径,重新生成sln,编译出现contrib扩展项目。
 
3、重新编译OpenCV,出现错误:
error C2668: "sqrt": 对重载函数的调用不明确
原因:VC++2010对sqrt函数有两个重载;float sqrt(float)和double sqrt(double),如果传入int型则无法明确转换类型,需要加类型转换。

4、继续编译OpenCV,出现如下error:
VS2010 error C3416:“cv::dnn::createLayerFromCaffe”: 显式专用化可能无法显式实例化。导致cv:dnn和tracking项目编译失败。
解决办法:
OpenCV3.2官方要求VC2013编译,VC2013基本支持C++11标准,对函数模板的显式实例化、显式具体化可以同时存在,但显式实例化不起作用。VC2010使用的是C++03标准,两者不能同时进行,所以在VC2010中注掉冲突的显式实例化代码即可。
示例代码(注掉后者):
//Explicit specialization 
template<>
Ptr<Layer> createLayerFromCaffe<ConvolutionLayer>(LayerParams &params)
{
    Ptr<BaseConvolutionLayer> l = ConvolutionLayer::create();
    initConvDeconvLayerFromCaffe(l, params);
    return Ptr<Layer>(l);
}
 
//Explicit instantiation
template Ptr<Layer> createLayerFromCaffe<ConvolutionLayer>(LayerParams&);