1、
编译opencv_gpu出现下列问题
1> graphcuts.cpp
1>D:\opencv-2.4.11\modules\gpu\src\graphcuts.cpp(124): error C2061: 语法错误: 标识符“NppiGraphcutState”
1>D:\opencv-2.4.11\modules\gpu\src\graphcuts.cpp(139): error C2833: “operator NppiGraphcutState”不是可识别的运算符或类型
1>D:\opencv-2.4.11\modules\gpu\src\graphcuts.cpp(139): error C2059: 语法错误:“newline”
1>D:\opencv-2.4.11\modules\gpu\src\graphcuts.cpp(140): error C2334: “{”的前面有意外标记;跳过明显的函数体
1>D:\opencv-2.4.11\modules\gpu\src\graphcuts.cpp(145): error C2143: 语法错误: 缺少“;”(在“*”的前面)
1>D:\opencv-2.4.11\modules\gpu\src\graphcuts.cpp(145): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>D:\opencv-2.4.11\modules\gpu\src\graphcuts.cpp(145): error C2238: 意外的标记位于“;”之前
1>D:\opencv-2.4.11\modules\gpu\src\graphcuts.cpp(131): error C2065: “pState”: 未声明的标识符
1>D:\opencv-2.4.11\modules\gpu\src\graphcuts.cpp(136): error C2065: “pState”: 未声明的标识符
1>D:\opencv-2.4.11\modules\gpu\src\graphcuts.cpp(136): error C3861: “nppiGraphcutFree”: 找不到标识符
1>D:\opencv-2.4.11\modules\gpu\src\graphcuts.cpp(178): error C3861: “nppiGraphcutGetSize”: 找不到标识符
1>D:\opencv-2.4.11\modules\gpu\src\graphcuts.cpp(186): error C2065: “nppiGraphcutInitAlloc”: 未声明的标识符
1>D:\opencv-2.4.11\modules\gpu\src\graphcuts.cpp(194): error C3861: “nppiGraphcut_32s8u”: 找不到标识符
1>D:\opencv-2.4.11\modules\gpu\src\graphcuts.cpp(199): error C3861: “nppiGraphcut_32f8u”: 找不到标识符
1>D:\opencv-2.4.11\modules\gpu\src\graphcuts.cpp(250): error C3861: “nppiGraphcut8GetSize”: 找不到标识符
1>D:\opencv-2.4.11\modules\gpu\src\graphcuts.cpp(258): error C2065: “nppiGraphcut8InitAlloc”: 未声明的标识符
1>D:\opencv-2.4.11\modules\gpu\src\graphcuts.cpp(268): error C3861: “nppiGraphcut8_32s8u”: 找不到标识符
1>D:\opencv-2.4.11\modules\gpu\src\graphcuts.cpp(275): error C3861: “nppiGraphcut8_32f8u”: 找不到标识符
问题原因:
这是因为opencv 2.4.11不兼容CUDA 8.0,opencv 2.4.11在cuda 8.0之前发布的,opencv还来不及适配。
cuda 8.0中缺少了NppiGraphcutState的声明,而在cuda 6.5中是有该结构体的声明,具体查看 NVIDIA GPU Computing Toolkit\CUDA\v6.5\include\nppi_computer_vision.h, cuda 8.0中也有该文件,但里面是空的,而且CUDA7.5中也是空的。
解决办法:
将graphcuts.cpp文件中的声明
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER)
修改为
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) || (CUDART_VERSION >= 8000)
2、
error C2382: “std::tuple<cv::Size,perf::`anonymous-namespace'::MatDepth,perf::`anonymous-namespace'::MatCn>::operator =”: 重定义
解决办法:
在cmake的时候就将BUILD_PERF_TESTS改成非勾选即不生成就可以解决问题。即改成如图所示: