我需要用Visual 2012编译OpenCV 2.4.5。特别是,我对用Cuda 5.0编译gpu模块很感兴趣。
为了在VS2012中启用CUDA编译,我遵循了本指南。
我使用CMake创建VS2012解决方案,然后对每个.cu文件将元素类型从“自定义构建规则”更改为"CUDA C/C++“
我可以编译大部分的项目文件,但在某些文件上,我遇到了一个恼人的问题。
例如,fgd_bgfg.cu原因
错误C2039:'ParameterType':不是'cv::gpu::device::TypeTraits‘的成员
但在type_traits.hpp里我能读懂
typedef typename type_traits_detail::Select<IsSimpleParameter<UnqualifiedType>::value,
T, typename type_traits_detail::AddParameterType<T>::type>::type ParameterType;这是一个非常烦人的问题,我无法摆脱!
我不敢相信还没有人用VS2012和GPU构建opencv,有什么建议吗?
发布于 2013-07-02 18:52:25
看来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;
};复制type_traits.hpp中的代码,在原始的TypeTraits定义后面。Build...then的猎物。
祝你好运!-D
https://stackoverflow.com/questions/16762822
复制相似问题