diff --git a/modules/gpu/src/graphcuts.cpp b/modules/gpu/src/graphcuts.cpp index aba9ee340a..0546ce3ad9 100644 --- a/modules/gpu/src/graphcuts.cpp +++ b/modules/gpu/src/graphcuts.cpp @@ -71,24 +71,32 @@ namespace return pState; } - private: + private: NppiGraphcutState* pState; }; } void cv::gpu::graphcut(GpuMat& terminals, GpuMat& leftTransp, GpuMat& rightTransp, GpuMat& top, GpuMat& bottom, GpuMat& labels, GpuMat& buf, Stream& s) { +#if (CUDA_VERSION < 5000) + CV_Assert(terminals.type() == CV_32S); +#else + CV_Assert(terminals.type() == CV_32S || terminals.type() == CV_32F); +#endif + Size src_size = terminals.size(); - CV_Assert(terminals.type() == CV_32S); CV_Assert(leftTransp.size() == Size(src_size.height, src_size.width)); - CV_Assert(leftTransp.type() == CV_32S); + CV_Assert(leftTransp.type() == terminals.type()); + CV_Assert(rightTransp.size() == Size(src_size.height, src_size.width)); - CV_Assert(rightTransp.type() == CV_32S); + CV_Assert(rightTransp.type() == terminals.type()); + CV_Assert(top.size() == src_size); - CV_Assert(top.type() == CV_32S); + CV_Assert(top.type() == terminals.type()); + CV_Assert(bottom.size() == src_size); - CV_Assert(bottom.type() == CV_32S); + CV_Assert(bottom.type() == terminals.type()); labels.create(src_size, CV_8U); @@ -106,44 +114,61 @@ void cv::gpu::graphcut(GpuMat& terminals, GpuMat& leftTransp, GpuMat& rightTrans NppStreamHandler h(stream); NppiGraphcutStateHandler state(sznpp, buf.ptr(), nppiGraphcutInitAlloc); - + +#if (CUDA_VERSION < 5000) nppSafeCall( nppiGraphcut_32s8u(terminals.ptr(), leftTransp.ptr(), rightTransp.ptr(), top.ptr(), bottom.ptr(), static_cast(terminals.step), static_cast(leftTransp.step), sznpp, labels.ptr(), static_cast(labels.step), state) ); +#else + if (terminals.type() == CV_32S) + { + nppSafeCall( nppiGraphcut_32s8u(terminals.ptr(), leftTransp.ptr(), rightTransp.ptr(), top.ptr(), bottom.ptr(), + static_cast(terminals.step), static_cast(leftTransp.step), sznpp, labels.ptr(), static_cast(labels.step), state) ); + } + else + { + nppSafeCall( nppiGraphcut_32f8u(terminals.ptr(), leftTransp.ptr(), rightTransp.ptr(), top.ptr(), bottom.ptr(), + static_cast(terminals.step), static_cast(leftTransp.step), sznpp, labels.ptr(), static_cast(labels.step), state) ); + } +#endif if (stream == 0) cudaSafeCall( cudaDeviceSynchronize() ); } -void cv::gpu::graphcut(GpuMat& terminals, GpuMat& leftTransp, GpuMat& rightTransp, GpuMat& top, GpuMat& topLeft, GpuMat& topRight, +void cv::gpu::graphcut(GpuMat& terminals, GpuMat& leftTransp, GpuMat& rightTransp, GpuMat& top, GpuMat& topLeft, GpuMat& topRight, GpuMat& bottom, GpuMat& bottomLeft, GpuMat& bottomRight, GpuMat& labels, GpuMat& buf, Stream& s) { +#if (CUDA_VERSION < 5000) + CV_Assert(terminals.type() == CV_32S); +#else + CV_Assert(terminals.type() == CV_32S || terminals.type() == CV_32F); +#endif + Size src_size = terminals.size(); - CV_Assert(terminals.type() == CV_32S); - CV_Assert(leftTransp.size() == Size(src_size.height, src_size.width)); - CV_Assert(leftTransp.type() == CV_32S); + CV_Assert(leftTransp.type() == terminals.type()); CV_Assert(rightTransp.size() == Size(src_size.height, src_size.width)); - CV_Assert(rightTransp.type() == CV_32S); + CV_Assert(rightTransp.type() == terminals.type()); CV_Assert(top.size() == src_size); - CV_Assert(top.type() == CV_32S); + CV_Assert(top.type() == terminals.type()); CV_Assert(topLeft.size() == src_size); - CV_Assert(topLeft.type() == CV_32S); + CV_Assert(topLeft.type() == terminals.type()); CV_Assert(topRight.size() == src_size); - CV_Assert(topRight.type() == CV_32S); + CV_Assert(topRight.type() == terminals.type()); CV_Assert(bottom.size() == src_size); - CV_Assert(bottom.type() == CV_32S); + CV_Assert(bottom.type() == terminals.type()); CV_Assert(bottomLeft.size() == src_size); - CV_Assert(bottomLeft.type() == CV_32S); + CV_Assert(bottomLeft.type() == terminals.type()); CV_Assert(bottomRight.size() == src_size); - CV_Assert(bottomRight.type() == CV_32S); + CV_Assert(bottomRight.type() == terminals.type()); labels.create(src_size, CV_8U); @@ -161,11 +186,28 @@ void cv::gpu::graphcut(GpuMat& terminals, GpuMat& leftTransp, GpuMat& rightTrans NppStreamHandler h(stream); NppiGraphcutStateHandler state(sznpp, buf.ptr(), nppiGraphcut8InitAlloc); - - nppSafeCall( nppiGraphcut8_32s8u(terminals.ptr(), leftTransp.ptr(), rightTransp.ptr(), + +#if (CUDA_VERSION < 5000) + nppSafeCall( nppiGraphcut8_32s8u(terminals.ptr(), leftTransp.ptr(), rightTransp.ptr(), top.ptr(), topLeft.ptr(), topRight.ptr(), bottom.ptr(), bottomLeft.ptr(), bottomRight.ptr(), static_cast(terminals.step), static_cast(leftTransp.step), sznpp, labels.ptr(), static_cast(labels.step), state) ); +#else + if (terminals.type() == CV_32S) + { + nppSafeCall( nppiGraphcut8_32s8u(terminals.ptr(), leftTransp.ptr(), rightTransp.ptr(), + top.ptr(), topLeft.ptr(), topRight.ptr(), + bottom.ptr(), bottomLeft.ptr(), bottomRight.ptr(), + static_cast(terminals.step), static_cast(leftTransp.step), sznpp, labels.ptr(), static_cast(labels.step), state) ); + } + else + { + nppSafeCall( nppiGraphcut8_32f8u(terminals.ptr(), leftTransp.ptr(), rightTransp.ptr(), + top.ptr(), topLeft.ptr(), topRight.ptr(), + bottom.ptr(), bottomLeft.ptr(), bottomRight.ptr(), + static_cast(terminals.step), static_cast(leftTransp.step), sznpp, labels.ptr(), static_cast(labels.step), state) ); + } +#endif if (stream == 0) cudaSafeCall( cudaDeviceSynchronize() );