使用CUDA在Visual Studio 2012中构建OpenCV
我需要用Visual Studio 2012编译OpenCV 2.4.5。我特别感兴趣的是用CUDA5.0编译gpu模块 为了在VS2012中启用CUDA编译,我遵循了以下步骤 我使用CMake创建VS2012解决方案,然后针对每个.cu文件,我将元素类型从“自定义构建规则”更改为“CUDA C/C++” 我可以编译大多数项目文件,但在一些文件上我遇到了一个恼人的问题 例如,fgd_bgfg.cu原因 错误C2039:“ParameterType”:不是的成员 'cv::gpu::device::TypeTraits' 但在type_traits.hpp中,我可以读取使用CUDA在Visual Studio 2012中构建OpenCV,opencv,visual-studio-2012,cuda,Opencv,Visual Studio 2012,Cuda,我需要用Visual Studio 2012编译OpenCV 2.4.5。我特别感兴趣的是用CUDA5.0编译gpu模块 为了在VS2012中启用CUDA编译,我遵循了以下步骤 我使用CMake创建VS2012解决方案,然后针对每个.cu文件,我将元素类型从“自定义构建规则”更改为“CUDA C/C++” 我可以编译大多数项目文件,但在一些文件上我遇到了一个恼人的问题 例如,fgd_bgfg.cu原因 错误C2039:“ParameterType”:不是的成员 'cv::gpu::device:
typedef typename type_traits_detail::Select<IsSimpleParameter<UnqualifiedType>::value,
T, typename type_traits_detail::AddParameterType<T>::type>::type ParameterType;
typedef typename type\u traits\u detail::Select::type ParameterType;
这真是一个我无法摆脱的恼人问题
我不敢相信没有人已经用VS2012和GPU构建了opencv,一些建议?看起来CUDA编译器无法处理模板特征技术。一种简单的方法是使用三种基本类型指定TypeTraits模板:double、float、int。我不确定这种方法是否正确,但CUDA编译器不会抱怨 代码在此列出:
template<> struct TypeTraits<double>
{
typedef type_traits_detail::UnConst<double>::type NonConstType;
typedef type_traits_detail::UnVolatile<double>::type NonVolatileType;
typedef type_traits_detail::UnVolatile<typename type_traits_detail::UnConst<double>::type>::type UnqualifiedType;
typedef type_traits_detail::PointerTraits<double>::type PointeeType;
typedef type_traits_detail::ReferenceTraits<double>::type ReferredType;
enum { isConst = type_traits_detail::UnConst<double>::value };
enum { isVolatile = type_traits_detail::UnVolatile<double>::value };
enum { isReference = type_traits_detail::ReferenceTraits<double>::value };
enum { isPointer = type_traits_detail::PointerTraits<typename type_traits_detail::ReferenceTraits<double>::type>::value };
enum { isUnsignedInt = type_traits_detail::IsUnsignedIntegral<double>::value };
enum { isSignedInt = type_traits_detail::IsSignedIntergral<double>::value };
enum { isIntegral = type_traits_detail::IsIntegral<double>::value };
enum { isFloat = type_traits_detail::IsFloat<double>::value };
enum { isArith = isIntegral || isFloat };
enum { isVec = type_traits_detail::IsVec<double>::value };
typedef double ParameterType;
};
template<> struct TypeTraits<float>
{
typedef type_traits_detail::UnConst<float>::type NonConstType;
typedef type_traits_detail::UnVolatile<float>::type NonVolatileType;
typedef type_traits_detail::UnVolatile<typename type_traits_detail::UnConst<float>::type>::type UnqualifiedType;
typedef type_traits_detail::PointerTraits<float>::type PointeeType;
typedef type_traits_detail::ReferenceTraits<float>::type ReferredType;
enum { isConst = type_traits_detail::UnConst<float>::value };
enum { isVolatile = type_traits_detail::UnVolatile<float>::value };
enum { isReference = type_traits_detail::ReferenceTraits<float>::value };
enum { isPointer = type_traits_detail::PointerTraits<typename type_traits_detail::ReferenceTraits<float>::type>::value };
enum { isUnsignedInt = type_traits_detail::IsUnsignedIntegral<float>::value };
enum { isSignedInt = type_traits_detail::IsSignedIntergral<float>::value };
enum { isIntegral = type_traits_detail::IsIntegral<float>::value };
enum { isFloat = type_traits_detail::IsFloat<float>::value };
enum { isArith = isIntegral || isFloat };
enum { isVec = type_traits_detail::IsVec<float>::value };
typedef float ParameterType;
};
template<> struct TypeTraits<int>
{
typedef type_traits_detail::UnConst<int>::type NonConstType;
typedef type_traits_detail::UnVolatile<int>::type NonVolatileType;
typedef type_traits_detail::UnVolatile<typename type_traits_detail::UnConst<int>::type>::type UnqualifiedType;
typedef type_traits_detail::PointerTraits<int>::type PointeeType;
typedef type_traits_detail::ReferenceTraits<int>::type ReferredType;
enum { isConst = type_traits_detail::UnConst<int>::value };
enum { isVolatile = type_traits_detail::UnVolatile<int>::value };
enum { isReference = type_traits_detail::ReferenceTraits<int>::value };
enum { isPointer = type_traits_detail::PointerTraits<typename type_traits_detail::ReferenceTraits<int>::type>::value };
enum { isUnsignedInt = type_traits_detail::IsUnsignedIntegral<int>::value };
enum { isSignedInt = type_traits_detail::IsSignedIntergral<int>::value };
enum { isIntegral = type_traits_detail::IsIntegral<int>::value };
enum { isFloat = type_traits_detail::IsFloat<int>::value };
enum { isArith = isIntegral || isFloat };
enum { isVec = type_traits_detail::IsVec<int>::value };
typedef int ParameterType;
};
模板结构类型特征
{
typedef type_traits_detail::UnConst::type NonConstType;
typedef type_traits_detail::UnVolatile::type NonVolatileType;
typedef type_traits_detail::UnVolatile::type UnqualifiedType;
typedef type_traits_detail::PointerTraits::type PointeeType;
typedef type_traits_detail::ReferenceTraits::type referedType;
枚举{isConst=type_traits_detail::UnConst::value};
枚举{isVolatile=type_traits_detail::UnVolatile::value};
枚举{isReference=type_traits_detail::ReferenceTraits::value};
枚举{isPointer=type_traits_detail::PointerTraits::value};
枚举{isUnsignedInt=type_traits_detail::IsUnsignedIntegral::value};
枚举{isSignedInt=type_traits_detail::IsSignedIntergral::value};
枚举{isIntegral=type_traits_detail::isIntegral::value};
枚举{isFloat=type_traits_detail::isFloat::value};
枚举{isArith=isIntegral | | isFloat};
枚举{isVec=type_traits_detail::isVec::value};
typedef双参数类型;
};
模板结构类型特征
{
typedef type_traits_detail::UnConst::type NonConstType;
typedef type_traits_detail::UnVolatile::type NonVolatileType;
typedef type_traits_detail::UnVolatile::type UnqualifiedType;
typedef type_traits_detail::PointerTraits::type PointeeType;
typedef type_traits_detail::ReferenceTraits::type referedType;
枚举{isConst=type_traits_detail::UnConst::value};
枚举{isVolatile=type_traits_detail::UnVolatile::value};
枚举{isReference=type_traits_detail::ReferenceTraits::value};
枚举{isPointer=type_traits_detail::PointerTraits::value};
枚举{isUnsignedInt=type_traits_detail::IsUnsignedIntegral::value};
枚举{isSignedInt=type_traits_detail::IsSignedIntergral::value};
枚举{isIntegral=type_traits_detail::isIntegral::value};
枚举{isFloat=type_traits_detail::isFloat::value};
枚举{isArith=isIntegral | | isFloat};
枚举{isVec=type_traits_detail::isVec::value};
typedef float参数type;
};
模板结构类型特征
{
typedef type_traits_detail::UnConst::type NonConstType;
typedef type_traits_detail::UnVolatile::type NonVolatileType;
typedef type_traits_detail::UnVolatile::type UnqualifiedType;
typedef type_traits_detail::PointerTraits::type PointeeType;
typedef type_traits_detail::ReferenceTraits::type referedType;
枚举{isConst=type_traits_detail::UnConst::value};
枚举{isVolatile=type_traits_detail::UnVolatile::value};
枚举{isReference=type_traits_detail::ReferenceTraits::value};
枚举{isPointer=type_traits_detail::PointerTraits::value};
枚举{isUnsignedInt=type_traits_detail::IsUnsignedIntegral::value};
枚举{isSignedInt=type_traits_detail::IsSignedIntergral::value};
枚举{isIntegral=type_traits_detail::isIntegral::value};
枚举{isFloat=type_traits_detail::isFloat::value};
枚举{isArith=isIntegral | | isFloat};
枚举{isVec=type_traits_detail::isVec::value};
typedef int参数类型;
};
将type_traits.hpp中的代码复制到原始TypeTraits定义的后面。建造…然后捕食
祝你好运!
:-DCUDA并不正式支持VS2012,因此在VS2012中使用CUDA构建OpenCV不起作用也就不足为奇了。我知道这一点,但很多人已经用一些技巧与CUDA合作,比如我在问题中链接的技巧。此外,OpenCV预构建库已经包含VS2012二进制文件。我觉得很奇怪,没有人尝试用VS2012编译GPU模块。我能够用最新的CUDA 5.5 RC在VS2012中构建OpenCV(该版本正式支持VS2012)。只有一个问题:您应该将CMake变量CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE设置为OFF。我会尽快尝试,您编译了哪个版本的OpenCV?我编译了主分支。但是最新的OpenCV版本(2.4.6)也支持CUDA 5.5,所以它也应该可以工作。使用主分支,我构建了支持VS2012和CUDA的Emgu x64版本。为此,我必须做一些修改:1.修改Build_Binary_x86.bat以启用CUDA mod