add auxiliary functions to work with Input/Output arrays:
they allow to perform asynchronous upload/download into temporary buffer to get valid GpuMat object
This commit is contained in:
		@@ -106,6 +106,16 @@ namespace cv { namespace cuda
 | 
			
		||||
        GpuMat::Allocator* allocator_;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    CV_EXPORTS GpuMat getInputMat(InputArray _src, Stream& stream);
 | 
			
		||||
 | 
			
		||||
    CV_EXPORTS GpuMat getOutputMat(OutputArray _dst, int rows, int cols, int type, Stream& stream);
 | 
			
		||||
    static inline GpuMat getOutputMat(OutputArray _dst, Size size, int type, Stream& stream)
 | 
			
		||||
    {
 | 
			
		||||
        return getOutputMat(_dst, size.height, size.width, type, stream);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    CV_EXPORTS void syncOutput(const GpuMat& dst, OutputArray _dst, Stream& stream);
 | 
			
		||||
 | 
			
		||||
    static inline void checkNppError(int code, const char* file, const int line, const char* func)
 | 
			
		||||
    {
 | 
			
		||||
        if (code < 0)
 | 
			
		||||
 
 | 
			
		||||
@@ -342,6 +342,53 @@ void cv::cuda::ensureSizeIsEnough(int rows, int cols, int type, OutputArray arr)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GpuMat cv::cuda::getInputMat(InputArray _src, Stream& stream)
 | 
			
		||||
{
 | 
			
		||||
    GpuMat src;
 | 
			
		||||
 | 
			
		||||
    if (_src.kind() == _InputArray::CUDA_GPU_MAT)
 | 
			
		||||
    {
 | 
			
		||||
        src = _src.getGpuMat();
 | 
			
		||||
    }
 | 
			
		||||
    else if (!_src.empty())
 | 
			
		||||
    {
 | 
			
		||||
        BufferPool pool(stream);
 | 
			
		||||
        src = pool.getBuffer(_src.size(), _src.type());
 | 
			
		||||
        src.upload(_src, stream);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return src;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GpuMat cv::cuda::getOutputMat(OutputArray _dst, int rows, int cols, int type, Stream& stream)
 | 
			
		||||
{
 | 
			
		||||
    GpuMat dst;
 | 
			
		||||
 | 
			
		||||
    if (_dst.kind() == _InputArray::CUDA_GPU_MAT)
 | 
			
		||||
    {
 | 
			
		||||
        _dst.create(rows, cols, type);
 | 
			
		||||
        dst = _dst.getGpuMat();
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        BufferPool pool(stream);
 | 
			
		||||
        dst = pool.getBuffer(rows, cols, type);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return dst;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cv::cuda::syncOutput(const GpuMat& dst, OutputArray _dst, Stream& stream)
 | 
			
		||||
{
 | 
			
		||||
    if (_dst.kind() != _InputArray::CUDA_GPU_MAT)
 | 
			
		||||
    {
 | 
			
		||||
        if (stream)
 | 
			
		||||
            dst.download(_dst, stream);
 | 
			
		||||
        else
 | 
			
		||||
            dst.download(_dst);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifndef HAVE_CUDA
 | 
			
		||||
 | 
			
		||||
GpuMat::Allocator* cv::cuda::GpuMat::defaultAllocator()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user