From 53c0189ed7efe52ad65c38cac04181155e320ca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20W=C3=BCrtz?= Date: Tue, 4 Feb 2020 18:25:48 +0100 Subject: [PATCH] Allow access to CUDA memory and stream pointers for interoperability. --- modules/core/include/opencv2/core/cuda.hpp | 6 ++++++ modules/core/include/opencv2/core/cuda.inl.hpp | 6 ++++++ modules/core/src/cuda_stream.cpp | 9 +++++++++ modules/python/test/test_cuda.py | 8 ++++++++ 4 files changed, 29 insertions(+) diff --git a/modules/core/include/opencv2/core/cuda.hpp b/modules/core/include/opencv2/core/cuda.hpp index 99819d75cc..5fa09682e3 100644 --- a/modules/core/include/opencv2/core/cuda.hpp +++ b/modules/core/include/opencv2/core/cuda.hpp @@ -305,6 +305,9 @@ public: //! returns true if GpuMat data is NULL CV_WRAP bool empty() const; + // returns pointer to cuda memory + CV_WRAP void* cudaPtr() const; + //! internal use method: updates the continuity flag CV_WRAP void updateContinuityFlag(); @@ -681,6 +684,9 @@ public: //! returns true if stream object is not default (!= 0) operator bool_type() const; + //! return Pointer to CUDA stream + CV_WRAP void* cudaPtr() const; + class Impl; private: diff --git a/modules/core/include/opencv2/core/cuda.inl.hpp b/modules/core/include/opencv2/core/cuda.inl.hpp index 35ae2e49d7..30fc0aee22 100644 --- a/modules/core/include/opencv2/core/cuda.inl.hpp +++ b/modules/core/include/opencv2/core/cuda.inl.hpp @@ -343,6 +343,12 @@ bool GpuMat::empty() const return data == 0; } +inline +void* GpuMat::cudaPtr() const +{ + return data; +} + static inline GpuMat createContinuous(int rows, int cols, int type) { diff --git a/modules/core/src/cuda_stream.cpp b/modules/core/src/cuda_stream.cpp index 79d7477220..5fb873a369 100644 --- a/modules/core/src/cuda_stream.cpp +++ b/modules/core/src/cuda_stream.cpp @@ -535,6 +535,15 @@ Stream& cv::cuda::Stream::Null() #endif } +void* cv::cuda::Stream::cudaPtr() const +{ +#ifndef HAVE_CUDA + return nullptr; +#else + return impl_->stream; +#endif +} + cv::cuda::Stream::operator bool_type() const { #ifndef HAVE_CUDA diff --git a/modules/python/test/test_cuda.py b/modules/python/test/test_cuda.py index 5c4d9606dd..8eba9076a2 100644 --- a/modules/python/test/test_cuda.py +++ b/modules/python/test/test_cuda.py @@ -26,5 +26,13 @@ class cuda_test(NewOpenCVTests): self.assertTrue(np.allclose(cuMat.download(), npMat)) + def test_cuda_interop(self): + npMat = (np.random.random((128, 128, 3)) * 255).astype(np.uint8) + cuMat = cv.cuda_GpuMat() + cuMat.upload(npMat) + self.assertTrue(cuMat.cudaPtr() != 0) + stream = cv.cuda_Stream() + self.assertTrue(stream.cudaPtr() != 0) + if __name__ == '__main__': NewOpenCVTests.bootstrap()