void cv::gpu::reduce(const GpuMat& src, GpuMat& dst, int dim, int reduceOp, int dtype, Stream& stream) { using namespace ::cv::gpu::device::matrix_reductions; CV_Assert(src.depth() <= CV_32F && src.channels() <= 4 && dtype <= CV_32F); CV_Assert(dim == 0 || dim == 1); CV_Assert(reduceOp == CV_REDUCE_SUM || reduceOp == CV_REDUCE_AVG || reduceOp == CV_REDUCE_MAX || reduceOp == CV_REDUCE_MIN); if (dtype < 0) dtype = src.depth(); dst.create(1, dim == 0 ? src.cols : src.rows, CV_MAKETYPE(dtype, src.channels())); if (dim == 0) { typedef void (*caller_t)(const PtrStepSzb& src, const PtrStepSzb& dst, int reduceOp, cudaStream_t stream); static const caller_t callers[6][6] = { { reduceRows_gpu<unsigned char, int, unsigned char>, 0/*reduceRows_gpu<unsigned char, int, signed char>*/, 0/*reduceRows_gpu<unsigned char, int, unsigned short>*/, 0/*reduceRows_gpu<unsigned char, int, short>*/, reduceRows_gpu<unsigned char, int, int>, reduceRows_gpu<unsigned char, int, float> }, { 0/*reduceRows_gpu<signed char, int, unsigned char>*/, 0/*reduceRows_gpu<signed char, int, signed char>*/, 0/*reduceRows_gpu<signed char, int, unsigned short>*/, 0/*reduceRows_gpu<signed char, int, short>*/, 0/*reduceRows_gpu<signed char, int, int>*/, 0/*reduceRows_gpu<signed char, int, float>*/ }, { 0/*reduceRows_gpu<unsigned short, int, unsigned char>*/, 0/*reduceRows_gpu<unsigned short, int, signed char>*/, reduceRows_gpu<unsigned short, int, unsigned short>, 0/*reduceRows_gpu<unsigned short, int, short>*/, reduceRows_gpu<unsigned short, int, int>, reduceRows_gpu<unsigned short, int, float> }, { 0/*reduceRows_gpu<short, int, unsigned char>*/, 0/*reduceRows_gpu<short, int, signed char>*/, 0/*reduceRows_gpu<short, int, unsigned short>*/, reduceRows_gpu<short, int, short>, reduceRows_gpu<short, int, int>, reduceRows_gpu<short, int, float> }, { 0/*reduceRows_gpu<int, int, unsigned char>*/, 0/*reduceRows_gpu<int, int, signed char>*/, 0/*reduceRows_gpu<int, int, unsigned short>*/, 0/*reduceRows_gpu<int, int, short>*/, reduceRows_gpu<int, int, int>, reduceRows_gpu<int, int, float> }, { 0/*reduceRows_gpu<float, float, unsigned char>*/, 0/*reduceRows_gpu<float, float, signed char>*/, 0/*reduceRows_gpu<float, float, unsigned short>*/, 0/*reduceRows_gpu<float, float, short>*/, 0/*reduceRows_gpu<float, float, int>*/, reduceRows_gpu<float, float, float> } }; const caller_t func = callers[src.depth()][dst.depth()]; if (!func) CV_Error(CV_StsUnsupportedFormat, "Unsupported combination of input and output array formats"); func(src.reshape(1), dst.reshape(1), reduceOp, StreamAccessor::getStream(stream)); } else { typedef void (*caller_t)(const PtrStepSzb& src, int cn, const PtrStepSzb& dst, int reduceOp, cudaStream_t stream); static const caller_t callers[6][6] = { { reduceCols_gpu<unsigned char, int, unsigned char>, 0/*reduceCols_gpu<unsigned char, int, signed char>*/, 0/*reduceCols_gpu<unsigned char, int, unsigned short>*/, 0/*reduceCols_gpu<unsigned char, int, short>*/, reduceCols_gpu<unsigned char, int, int>, reduceCols_gpu<unsigned char, int, float> }, { 0/*reduceCols_gpu<signed char, int, unsigned char>*/, 0/*reduceCols_gpu<signed char, int, signed char>*/, 0/*reduceCols_gpu<signed char, int, unsigned short>*/, 0/*reduceCols_gpu<signed char, int, short>*/, 0/*reduceCols_gpu<signed char, int, int>*/, 0/*reduceCols_gpu<signed char, int, float>*/ }, { 0/*reduceCols_gpu<unsigned short, int, unsigned char>*/, 0/*reduceCols_gpu<unsigned short, int, signed char>*/, reduceCols_gpu<unsigned short, int, unsigned short>, 0/*reduceCols_gpu<unsigned short, int, short>*/, reduceCols_gpu<unsigned short, int, int>, reduceCols_gpu<unsigned short, int, float> }, { 0/*reduceCols_gpu<short, int, unsigned char>*/, 0/*reduceCols_gpu<short, int, signed char>*/, 0/*reduceCols_gpu<short, int, unsigned short>*/, reduceCols_gpu<short, int, short>, reduceCols_gpu<short, int, int>, reduceCols_gpu<short, int, float> }, { 0/*reduceCols_gpu<int, int, unsigned char>*/, 0/*reduceCols_gpu<int, int, signed char>*/, 0/*reduceCols_gpu<int, int, unsigned short>*/, 0/*reduceCols_gpu<int, int, short>*/, reduceCols_gpu<int, int, int>, reduceCols_gpu<int, int, float> }, { 0/*reduceCols_gpu<float, unsigned char>*/, 0/*reduceCols_gpu<float, signed char>*/, 0/*reduceCols_gpu<float, unsigned short>*/, 0/*reduceCols_gpu<float, short>*/, 0/*reduceCols_gpu<float, int>*/, reduceCols_gpu<float, float, float> } }; const caller_t func = callers[src.depth()][dst.depth()]; if (!func) CV_Error(CV_StsUnsupportedFormat, "Unsupported combination of input and output array formats"); func(src, src.channels(), dst, reduceOp, StreamAccessor::getStream(stream)); } }
void cv::gpu::reduce(const GpuMat& src, GpuMat& dst, int dim, int reduceOp, int dtype, Stream& stream) { CV_Assert( src.channels() <= 4 ); CV_Assert( dim == 0 || dim == 1 ); CV_Assert( reduceOp == CV_REDUCE_SUM || reduceOp == CV_REDUCE_AVG || reduceOp == CV_REDUCE_MAX || reduceOp == CV_REDUCE_MIN ); if (dtype < 0) dtype = src.depth(); dst.create(1, dim == 0 ? src.cols : src.rows, CV_MAKE_TYPE(CV_MAT_DEPTH(dtype), src.channels())); if (dim == 0) { typedef void (*func_t)(PtrStepSzb src, void* dst, int op, cudaStream_t stream); static const func_t funcs[7][7] = { { ::reduce::rows<unsigned char, int, unsigned char>, 0/*::reduce::rows<unsigned char, int, signed char>*/, 0/*::reduce::rows<unsigned char, int, unsigned short>*/, 0/*::reduce::rows<unsigned char, int, short>*/, ::reduce::rows<unsigned char, int, int>, ::reduce::rows<unsigned char, float, float>, ::reduce::rows<unsigned char, double, double> }, { 0/*::reduce::rows<signed char, int, unsigned char>*/, 0/*::reduce::rows<signed char, int, signed char>*/, 0/*::reduce::rows<signed char, int, unsigned short>*/, 0/*::reduce::rows<signed char, int, short>*/, 0/*::reduce::rows<signed char, int, int>*/, 0/*::reduce::rows<signed char, float, float>*/, 0/*::reduce::rows<signed char, double, double>*/ }, { 0/*::reduce::rows<unsigned short, int, unsigned char>*/, 0/*::reduce::rows<unsigned short, int, signed char>*/, ::reduce::rows<unsigned short, int, unsigned short>, 0/*::reduce::rows<unsigned short, int, short>*/, ::reduce::rows<unsigned short, int, int>, ::reduce::rows<unsigned short, float, float>, ::reduce::rows<unsigned short, double, double> }, { 0/*::reduce::rows<short, int, unsigned char>*/, 0/*::reduce::rows<short, int, signed char>*/, 0/*::reduce::rows<short, int, unsigned short>*/, ::reduce::rows<short, int, short>, ::reduce::rows<short, int, int>, ::reduce::rows<short, float, float>, ::reduce::rows<short, double, double> }, { 0/*::reduce::rows<int, int, unsigned char>*/, 0/*::reduce::rows<int, int, signed char>*/, 0/*::reduce::rows<int, int, unsigned short>*/, 0/*::reduce::rows<int, int, short>*/, ::reduce::rows<int, int, int>, ::reduce::rows<int, float, float>, ::reduce::rows<int, double, double> }, { 0/*::reduce::rows<float, float, unsigned char>*/, 0/*::reduce::rows<float, float, signed char>*/, 0/*::reduce::rows<float, float, unsigned short>*/, 0/*::reduce::rows<float, float, short>*/, 0/*::reduce::rows<float, float, int>*/, ::reduce::rows<float, float, float>, ::reduce::rows<float, double, double> }, { 0/*::reduce::rows<double, double, unsigned char>*/, 0/*::reduce::rows<double, double, signed char>*/, 0/*::reduce::rows<double, double, unsigned short>*/, 0/*::reduce::rows<double, double, short>*/, 0/*::reduce::rows<double, double, int>*/, 0/*::reduce::rows<double, double, float>*/, ::reduce::rows<double, double, double> } }; const func_t func = funcs[src.depth()][dst.depth()]; if (!func) CV_Error(CV_StsUnsupportedFormat, "Unsupported combination of input and output array formats"); func(src.reshape(1), dst.data, reduceOp, StreamAccessor::getStream(stream)); } else { typedef void (*func_t)(PtrStepSzb src, void* dst, int cn, int op, cudaStream_t stream); static const func_t funcs[7][7] = { { ::reduce::cols<unsigned char, int, unsigned char>, 0/*::reduce::cols<unsigned char, int, signed char>*/, 0/*::reduce::cols<unsigned char, int, unsigned short>*/, 0/*::reduce::cols<unsigned char, int, short>*/, ::reduce::cols<unsigned char, int, int>, ::reduce::cols<unsigned char, float, float>, ::reduce::cols<unsigned char, double, double> }, { 0/*::reduce::cols<signed char, int, unsigned char>*/, 0/*::reduce::cols<signed char, int, signed char>*/, 0/*::reduce::cols<signed char, int, unsigned short>*/, 0/*::reduce::cols<signed char, int, short>*/, 0/*::reduce::cols<signed char, int, int>*/, 0/*::reduce::cols<signed char, float, float>*/, 0/*::reduce::cols<signed char, double, double>*/ }, { 0/*::reduce::cols<unsigned short, int, unsigned char>*/, 0/*::reduce::cols<unsigned short, int, signed char>*/, ::reduce::cols<unsigned short, int, unsigned short>, 0/*::reduce::cols<unsigned short, int, short>*/, ::reduce::cols<unsigned short, int, int>, ::reduce::cols<unsigned short, float, float>, ::reduce::cols<unsigned short, double, double> }, { 0/*::reduce::cols<short, int, unsigned char>*/, 0/*::reduce::cols<short, int, signed char>*/, 0/*::reduce::cols<short, int, unsigned short>*/, ::reduce::cols<short, int, short>, ::reduce::cols<short, int, int>, ::reduce::cols<short, float, float>, ::reduce::cols<short, double, double> }, { 0/*::reduce::cols<int, int, unsigned char>*/, 0/*::reduce::cols<int, int, signed char>*/, 0/*::reduce::cols<int, int, unsigned short>*/, 0/*::reduce::cols<int, int, short>*/, ::reduce::cols<int, int, int>, ::reduce::cols<int, float, float>, ::reduce::cols<int, double, double> }, { 0/*::reduce::cols<float, float, unsigned char>*/, 0/*::reduce::cols<float, float, signed char>*/, 0/*::reduce::cols<float, float, unsigned short>*/, 0/*::reduce::cols<float, float, short>*/, 0/*::reduce::cols<float, float, int>*/, ::reduce::cols<float, float, float>, ::reduce::cols<float, double, double> }, { 0/*::reduce::cols<double, double, unsigned char>*/, 0/*::reduce::cols<double, double, signed char>*/, 0/*::reduce::cols<double, double, unsigned short>*/, 0/*::reduce::cols<double, double, short>*/, 0/*::reduce::cols<double, double, int>*/, 0/*::reduce::cols<double, double, float>*/, ::reduce::cols<double, double, double> } }; const func_t func = funcs[src.depth()][dst.depth()]; if (!func) CV_Error(CV_StsUnsupportedFormat, "Unsupported combination of input and output array formats"); func(src, dst.data, src.channels(), reduceOp, StreamAccessor::getStream(stream)); } }