used new device layer for cv::gpu::addWeighted

This commit is contained in:
Vladislav Vinogradov
2013-08-26 10:30:04 +04:00
parent c7a3a7d4d9
commit e83be009a3
2 changed files with 521 additions and 804 deletions

View File

@@ -449,517 +449,6 @@ void cv::cuda::max(InputArray src1, InputArray src2, OutputArray dst, Stream& st
arithm_op(src1, src2, dst, noArray(), 1.0, -1, stream, minMaxMat, minMaxScalar, MAX_OP);
}
////////////////////////////////////////////////////////////////////////
// addWeighted
namespace arithm
{
template <typename T1, typename T2, typename D>
void addWeighted(PtrStepSzb src1, double alpha, PtrStepSzb src2, double beta, double gamma, PtrStepSzb dst, cudaStream_t stream);
}
void cv::cuda::addWeighted(InputArray _src1, double alpha, InputArray _src2, double beta, double gamma, OutputArray _dst, int ddepth, Stream& stream)
{
typedef void (*func_t)(PtrStepSzb src1, double alpha, PtrStepSzb src2, double beta, double gamma, PtrStepSzb dst, cudaStream_t stream);
static const func_t funcs[7][7][7] =
{
{
{
arithm::addWeighted<unsigned char, unsigned char, unsigned char >,
arithm::addWeighted<unsigned char, unsigned char, signed char >,
arithm::addWeighted<unsigned char, unsigned char, unsigned short>,
arithm::addWeighted<unsigned char, unsigned char, short >,
arithm::addWeighted<unsigned char, unsigned char, int >,
arithm::addWeighted<unsigned char, unsigned char, float >,
arithm::addWeighted<unsigned char, unsigned char, double>
},
{
arithm::addWeighted<unsigned char, signed char, unsigned char >,
arithm::addWeighted<unsigned char, signed char, signed char >,
arithm::addWeighted<unsigned char, signed char, unsigned short>,
arithm::addWeighted<unsigned char, signed char, short >,
arithm::addWeighted<unsigned char, signed char, int >,
arithm::addWeighted<unsigned char, signed char, float >,
arithm::addWeighted<unsigned char, signed char, double>
},
{
arithm::addWeighted<unsigned char, unsigned short, unsigned char >,
arithm::addWeighted<unsigned char, unsigned short, signed char >,
arithm::addWeighted<unsigned char, unsigned short, unsigned short>,
arithm::addWeighted<unsigned char, unsigned short, short >,
arithm::addWeighted<unsigned char, unsigned short, int >,
arithm::addWeighted<unsigned char, unsigned short, float >,
arithm::addWeighted<unsigned char, unsigned short, double>
},
{
arithm::addWeighted<unsigned char, short, unsigned char >,
arithm::addWeighted<unsigned char, short, signed char >,
arithm::addWeighted<unsigned char, short, unsigned short>,
arithm::addWeighted<unsigned char, short, short >,
arithm::addWeighted<unsigned char, short, int >,
arithm::addWeighted<unsigned char, short, float >,
arithm::addWeighted<unsigned char, short, double>
},
{
arithm::addWeighted<unsigned char, int, unsigned char >,
arithm::addWeighted<unsigned char, int, signed char >,
arithm::addWeighted<unsigned char, int, unsigned short>,
arithm::addWeighted<unsigned char, int, short >,
arithm::addWeighted<unsigned char, int, int >,
arithm::addWeighted<unsigned char, int, float >,
arithm::addWeighted<unsigned char, int, double>
},
{
arithm::addWeighted<unsigned char, float, unsigned char >,
arithm::addWeighted<unsigned char, float, signed char >,
arithm::addWeighted<unsigned char, float, unsigned short>,
arithm::addWeighted<unsigned char, float, short >,
arithm::addWeighted<unsigned char, float, int >,
arithm::addWeighted<unsigned char, float, float >,
arithm::addWeighted<unsigned char, float, double>
},
{
arithm::addWeighted<unsigned char, double, unsigned char >,
arithm::addWeighted<unsigned char, double, signed char >,
arithm::addWeighted<unsigned char, double, unsigned short>,
arithm::addWeighted<unsigned char, double, short >,
arithm::addWeighted<unsigned char, double, int >,
arithm::addWeighted<unsigned char, double, float >,
arithm::addWeighted<unsigned char, double, double>
}
},
{
{
0/*arithm::addWeighted<signed char, unsigned char, unsigned char >*/,
0/*arithm::addWeighted<signed char, unsigned char, signed char >*/,
0/*arithm::addWeighted<signed char, unsigned char, unsigned short>*/,
0/*arithm::addWeighted<signed char, unsigned char, short >*/,
0/*arithm::addWeighted<signed char, unsigned char, int >*/,
0/*arithm::addWeighted<signed char, unsigned char, float >*/,
0/*arithm::addWeighted<signed char, unsigned char, double>*/
},
{
arithm::addWeighted<signed char, signed char, unsigned char >,
arithm::addWeighted<signed char, signed char, signed char >,
arithm::addWeighted<signed char, signed char, unsigned short>,
arithm::addWeighted<signed char, signed char, short >,
arithm::addWeighted<signed char, signed char, int >,
arithm::addWeighted<signed char, signed char, float >,
arithm::addWeighted<signed char, signed char, double>
},
{
arithm::addWeighted<signed char, unsigned short, unsigned char >,
arithm::addWeighted<signed char, unsigned short, signed char >,
arithm::addWeighted<signed char, unsigned short, unsigned short>,
arithm::addWeighted<signed char, unsigned short, short >,
arithm::addWeighted<signed char, unsigned short, int >,
arithm::addWeighted<signed char, unsigned short, float >,
arithm::addWeighted<signed char, unsigned short, double>
},
{
arithm::addWeighted<signed char, short, unsigned char >,
arithm::addWeighted<signed char, short, signed char >,
arithm::addWeighted<signed char, short, unsigned short>,
arithm::addWeighted<signed char, short, short >,
arithm::addWeighted<signed char, short, int >,
arithm::addWeighted<signed char, short, float >,
arithm::addWeighted<signed char, short, double>
},
{
arithm::addWeighted<signed char, int, unsigned char >,
arithm::addWeighted<signed char, int, signed char >,
arithm::addWeighted<signed char, int, unsigned short>,
arithm::addWeighted<signed char, int, short >,
arithm::addWeighted<signed char, int, int >,
arithm::addWeighted<signed char, int, float >,
arithm::addWeighted<signed char, int, double>
},
{
arithm::addWeighted<signed char, float, unsigned char >,
arithm::addWeighted<signed char, float, signed char >,
arithm::addWeighted<signed char, float, unsigned short>,
arithm::addWeighted<signed char, float, short >,
arithm::addWeighted<signed char, float, int >,
arithm::addWeighted<signed char, float, float >,
arithm::addWeighted<signed char, float, double>
},
{
arithm::addWeighted<signed char, double, unsigned char >,
arithm::addWeighted<signed char, double, signed char >,
arithm::addWeighted<signed char, double, unsigned short>,
arithm::addWeighted<signed char, double, short >,
arithm::addWeighted<signed char, double, int >,
arithm::addWeighted<signed char, double, float >,
arithm::addWeighted<signed char, double, double>
}
},
{
{
0/*arithm::addWeighted<unsigned short, unsigned char, unsigned char >*/,
0/*arithm::addWeighted<unsigned short, unsigned char, signed char >*/,
0/*arithm::addWeighted<unsigned short, unsigned char, unsigned short>*/,
0/*arithm::addWeighted<unsigned short, unsigned char, short >*/,
0/*arithm::addWeighted<unsigned short, unsigned char, int >*/,
0/*arithm::addWeighted<unsigned short, unsigned char, float >*/,
0/*arithm::addWeighted<unsigned short, unsigned char, double>*/
},
{
0/*arithm::addWeighted<unsigned short, signed char, unsigned char >*/,
0/*arithm::addWeighted<unsigned short, signed char, signed char >*/,
0/*arithm::addWeighted<unsigned short, signed char, unsigned short>*/,
0/*arithm::addWeighted<unsigned short, signed char, short >*/,
0/*arithm::addWeighted<unsigned short, signed char, int >*/,
0/*arithm::addWeighted<unsigned short, signed char, float >*/,
0/*arithm::addWeighted<unsigned short, signed char, double>*/
},
{
arithm::addWeighted<unsigned short, unsigned short, unsigned char >,
arithm::addWeighted<unsigned short, unsigned short, signed char >,
arithm::addWeighted<unsigned short, unsigned short, unsigned short>,
arithm::addWeighted<unsigned short, unsigned short, short >,
arithm::addWeighted<unsigned short, unsigned short, int >,
arithm::addWeighted<unsigned short, unsigned short, float >,
arithm::addWeighted<unsigned short, unsigned short, double>
},
{
arithm::addWeighted<unsigned short, short, unsigned char >,
arithm::addWeighted<unsigned short, short, signed char >,
arithm::addWeighted<unsigned short, short, unsigned short>,
arithm::addWeighted<unsigned short, short, short >,
arithm::addWeighted<unsigned short, short, int >,
arithm::addWeighted<unsigned short, short, float >,
arithm::addWeighted<unsigned short, short, double>
},
{
arithm::addWeighted<unsigned short, int, unsigned char >,
arithm::addWeighted<unsigned short, int, signed char >,
arithm::addWeighted<unsigned short, int, unsigned short>,
arithm::addWeighted<unsigned short, int, short >,
arithm::addWeighted<unsigned short, int, int >,
arithm::addWeighted<unsigned short, int, float >,
arithm::addWeighted<unsigned short, int, double>
},
{
arithm::addWeighted<unsigned short, float, unsigned char >,
arithm::addWeighted<unsigned short, float, signed char >,
arithm::addWeighted<unsigned short, float, unsigned short>,
arithm::addWeighted<unsigned short, float, short >,
arithm::addWeighted<unsigned short, float, int >,
arithm::addWeighted<unsigned short, float, float >,
arithm::addWeighted<unsigned short, float, double>
},
{
arithm::addWeighted<unsigned short, double, unsigned char >,
arithm::addWeighted<unsigned short, double, signed char >,
arithm::addWeighted<unsigned short, double, unsigned short>,
arithm::addWeighted<unsigned short, double, short >,
arithm::addWeighted<unsigned short, double, int >,
arithm::addWeighted<unsigned short, double, float >,
arithm::addWeighted<unsigned short, double, double>
}
},
{
{
0/*arithm::addWeighted<short, unsigned char, unsigned char >*/,
0/*arithm::addWeighted<short, unsigned char, signed char >*/,
0/*arithm::addWeighted<short, unsigned char, unsigned short>*/,
0/*arithm::addWeighted<short, unsigned char, short >*/,
0/*arithm::addWeighted<short, unsigned char, int >*/,
0/*arithm::addWeighted<short, unsigned char, float >*/,
0/*arithm::addWeighted<short, unsigned char, double>*/
},
{
0/*arithm::addWeighted<short, signed char, unsigned char >*/,
0/*arithm::addWeighted<short, signed char, signed char >*/,
0/*arithm::addWeighted<short, signed char, unsigned short>*/,
0/*arithm::addWeighted<short, signed char, short >*/,
0/*arithm::addWeighted<short, signed char, int >*/,
0/*arithm::addWeighted<short, signed char, float >*/,
0/*arithm::addWeighted<short, signed char, double>*/
},
{
0/*arithm::addWeighted<short, unsigned short, unsigned char >*/,
0/*arithm::addWeighted<short, unsigned short, signed char >*/,
0/*arithm::addWeighted<short, unsigned short, unsigned short>*/,
0/*arithm::addWeighted<short, unsigned short, short >*/,
0/*arithm::addWeighted<short, unsigned short, int >*/,
0/*arithm::addWeighted<short, unsigned short, float >*/,
0/*arithm::addWeighted<short, unsigned short, double>*/
},
{
arithm::addWeighted<short, short, unsigned char >,
arithm::addWeighted<short, short, signed char >,
arithm::addWeighted<short, short, unsigned short>,
arithm::addWeighted<short, short, short >,
arithm::addWeighted<short, short, int >,
arithm::addWeighted<short, short, float >,
arithm::addWeighted<short, short, double>
},
{
arithm::addWeighted<short, int, unsigned char >,
arithm::addWeighted<short, int, signed char >,
arithm::addWeighted<short, int, unsigned short>,
arithm::addWeighted<short, int, short >,
arithm::addWeighted<short, int, int >,
arithm::addWeighted<short, int, float >,
arithm::addWeighted<short, int, double>
},
{
arithm::addWeighted<short, float, unsigned char >,
arithm::addWeighted<short, float, signed char >,
arithm::addWeighted<short, float, unsigned short>,
arithm::addWeighted<short, float, short >,
arithm::addWeighted<short, float, int >,
arithm::addWeighted<short, float, float >,
arithm::addWeighted<short, float, double>
},
{
arithm::addWeighted<short, double, unsigned char >,
arithm::addWeighted<short, double, signed char >,
arithm::addWeighted<short, double, unsigned short>,
arithm::addWeighted<short, double, short >,
arithm::addWeighted<short, double, int >,
arithm::addWeighted<short, double, float >,
arithm::addWeighted<short, double, double>
}
},
{
{
0/*arithm::addWeighted<int, unsigned char, unsigned char >*/,
0/*arithm::addWeighted<int, unsigned char, signed char >*/,
0/*arithm::addWeighted<int, unsigned char, unsigned short>*/,
0/*arithm::addWeighted<int, unsigned char, short >*/,
0/*arithm::addWeighted<int, unsigned char, int >*/,
0/*arithm::addWeighted<int, unsigned char, float >*/,
0/*arithm::addWeighted<int, unsigned char, double>*/
},
{
0/*arithm::addWeighted<int, signed char, unsigned char >*/,
0/*arithm::addWeighted<int, signed char, signed char >*/,
0/*arithm::addWeighted<int, signed char, unsigned short>*/,
0/*arithm::addWeighted<int, signed char, short >*/,
0/*arithm::addWeighted<int, signed char, int >*/,
0/*arithm::addWeighted<int, signed char, float >*/,
0/*arithm::addWeighted<int, signed char, double>*/
},
{
0/*arithm::addWeighted<int, unsigned short, unsigned char >*/,
0/*arithm::addWeighted<int, unsigned short, signed char >*/,
0/*arithm::addWeighted<int, unsigned short, unsigned short>*/,
0/*arithm::addWeighted<int, unsigned short, short >*/,
0/*arithm::addWeighted<int, unsigned short, int >*/,
0/*arithm::addWeighted<int, unsigned short, float >*/,
0/*arithm::addWeighted<int, unsigned short, double>*/
},
{
0/*arithm::addWeighted<int, short, unsigned char >*/,
0/*arithm::addWeighted<int, short, signed char >*/,
0/*arithm::addWeighted<int, short, unsigned short>*/,
0/*arithm::addWeighted<int, short, short >*/,
0/*arithm::addWeighted<int, short, int >*/,
0/*arithm::addWeighted<int, short, float >*/,
0/*arithm::addWeighted<int, short, double>*/
},
{
arithm::addWeighted<int, int, unsigned char >,
arithm::addWeighted<int, int, signed char >,
arithm::addWeighted<int, int, unsigned short>,
arithm::addWeighted<int, int, short >,
arithm::addWeighted<int, int, int >,
arithm::addWeighted<int, int, float >,
arithm::addWeighted<int, int, double>
},
{
arithm::addWeighted<int, float, unsigned char >,
arithm::addWeighted<int, float, signed char >,
arithm::addWeighted<int, float, unsigned short>,
arithm::addWeighted<int, float, short >,
arithm::addWeighted<int, float, int >,
arithm::addWeighted<int, float, float >,
arithm::addWeighted<int, float, double>
},
{
arithm::addWeighted<int, double, unsigned char >,
arithm::addWeighted<int, double, signed char >,
arithm::addWeighted<int, double, unsigned short>,
arithm::addWeighted<int, double, short >,
arithm::addWeighted<int, double, int >,
arithm::addWeighted<int, double, float >,
arithm::addWeighted<int, double, double>
}
},
{
{
0/*arithm::addWeighted<float, unsigned char, unsigned char >*/,
0/*arithm::addWeighted<float, unsigned char, signed char >*/,
0/*arithm::addWeighted<float, unsigned char, unsigned short>*/,
0/*arithm::addWeighted<float, unsigned char, short >*/,
0/*arithm::addWeighted<float, unsigned char, int >*/,
0/*arithm::addWeighted<float, unsigned char, float >*/,
0/*arithm::addWeighted<float, unsigned char, double>*/
},
{
0/*arithm::addWeighted<float, signed char, unsigned char >*/,
0/*arithm::addWeighted<float, signed char, signed char >*/,
0/*arithm::addWeighted<float, signed char, unsigned short>*/,
0/*arithm::addWeighted<float, signed char, short >*/,
0/*arithm::addWeighted<float, signed char, int >*/,
0/*arithm::addWeighted<float, signed char, float >*/,
0/*arithm::addWeighted<float, signed char, double>*/
},
{
0/*arithm::addWeighted<float, unsigned short, unsigned char >*/,
0/*arithm::addWeighted<float, unsigned short, signed char >*/,
0/*arithm::addWeighted<float, unsigned short, unsigned short>*/,
0/*arithm::addWeighted<float, unsigned short, short >*/,
0/*arithm::addWeighted<float, unsigned short, int >*/,
0/*arithm::addWeighted<float, unsigned short, float >*/,
0/*arithm::addWeighted<float, unsigned short, double>*/
},
{
0/*arithm::addWeighted<float, short, unsigned char >*/,
0/*arithm::addWeighted<float, short, signed char >*/,
0/*arithm::addWeighted<float, short, unsigned short>*/,
0/*arithm::addWeighted<float, short, short >*/,
0/*arithm::addWeighted<float, short, int >*/,
0/*arithm::addWeighted<float, short, float >*/,
0/*arithm::addWeighted<float, short, double>*/
},
{
0/*arithm::addWeighted<float, int, unsigned char >*/,
0/*arithm::addWeighted<float, int, signed char >*/,
0/*arithm::addWeighted<float, int, unsigned short>*/,
0/*arithm::addWeighted<float, int, short >*/,
0/*arithm::addWeighted<float, int, int >*/,
0/*arithm::addWeighted<float, int, float >*/,
0/*arithm::addWeighted<float, int, double>*/
},
{
arithm::addWeighted<float, float, unsigned char >,
arithm::addWeighted<float, float, signed char >,
arithm::addWeighted<float, float, unsigned short>,
arithm::addWeighted<float, float, short >,
arithm::addWeighted<float, float, int >,
arithm::addWeighted<float, float, float >,
arithm::addWeighted<float, float, double>
},
{
arithm::addWeighted<float, double, unsigned char >,
arithm::addWeighted<float, double, signed char >,
arithm::addWeighted<float, double, unsigned short>,
arithm::addWeighted<float, double, short >,
arithm::addWeighted<float, double, int >,
arithm::addWeighted<float, double, float >,
arithm::addWeighted<float, double, double>
}
},
{
{
0/*arithm::addWeighted<double, unsigned char, unsigned char >*/,
0/*arithm::addWeighted<double, unsigned char, signed char >*/,
0/*arithm::addWeighted<double, unsigned char, unsigned short>*/,
0/*arithm::addWeighted<double, unsigned char, short >*/,
0/*arithm::addWeighted<double, unsigned char, int >*/,
0/*arithm::addWeighted<double, unsigned char, float >*/,
0/*arithm::addWeighted<double, unsigned char, double>*/
},
{
0/*arithm::addWeighted<double, signed char, unsigned char >*/,
0/*arithm::addWeighted<double, signed char, signed char >*/,
0/*arithm::addWeighted<double, signed char, unsigned short>*/,
0/*arithm::addWeighted<double, signed char, short >*/,
0/*arithm::addWeighted<double, signed char, int >*/,
0/*arithm::addWeighted<double, signed char, float >*/,
0/*arithm::addWeighted<double, signed char, double>*/
},
{
0/*arithm::addWeighted<double, unsigned short, unsigned char >*/,
0/*arithm::addWeighted<double, unsigned short, signed char >*/,
0/*arithm::addWeighted<double, unsigned short, unsigned short>*/,
0/*arithm::addWeighted<double, unsigned short, short >*/,
0/*arithm::addWeighted<double, unsigned short, int >*/,
0/*arithm::addWeighted<double, unsigned short, float >*/,
0/*arithm::addWeighted<double, unsigned short, double>*/
},
{
0/*arithm::addWeighted<double, short, unsigned char >*/,
0/*arithm::addWeighted<double, short, signed char >*/,
0/*arithm::addWeighted<double, short, unsigned short>*/,
0/*arithm::addWeighted<double, short, short >*/,
0/*arithm::addWeighted<double, short, int >*/,
0/*arithm::addWeighted<double, short, float >*/,
0/*arithm::addWeighted<double, short, double>*/
},
{
0/*arithm::addWeighted<double, int, unsigned char >*/,
0/*arithm::addWeighted<double, int, signed char >*/,
0/*arithm::addWeighted<double, int, unsigned short>*/,
0/*arithm::addWeighted<double, int, short >*/,
0/*arithm::addWeighted<double, int, int >*/,
0/*arithm::addWeighted<double, int, float >*/,
0/*arithm::addWeighted<double, int, double>*/
},
{
0/*arithm::addWeighted<double, float, unsigned char >*/,
0/*arithm::addWeighted<double, float, signed char >*/,
0/*arithm::addWeighted<double, float, unsigned short>*/,
0/*arithm::addWeighted<double, float, short >*/,
0/*arithm::addWeighted<double, float, int >*/,
0/*arithm::addWeighted<double, float, float >*/,
0/*arithm::addWeighted<double, float, double>*/
},
{
arithm::addWeighted<double, double, unsigned char >,
arithm::addWeighted<double, double, signed char >,
arithm::addWeighted<double, double, unsigned short>,
arithm::addWeighted<double, double, short >,
arithm::addWeighted<double, double, int >,
arithm::addWeighted<double, double, float >,
arithm::addWeighted<double, double, double>
}
}
};
GpuMat src1 = _src1.getGpuMat();
GpuMat src2 = _src2.getGpuMat();
int sdepth1 = src1.depth();
int sdepth2 = src2.depth();
ddepth = ddepth >= 0 ? CV_MAT_DEPTH(ddepth) : std::max(sdepth1, sdepth2);
const int cn = src1.channels();
CV_Assert( src2.size() == src1.size() && src2.channels() == cn );
CV_Assert( sdepth1 <= CV_64F && sdepth2 <= CV_64F && ddepth <= CV_64F );
if (sdepth1 == CV_64F || sdepth2 == CV_64F || ddepth == CV_64F)
{
if (!deviceSupports(NATIVE_DOUBLE))
CV_Error(cv::Error::StsUnsupportedFormat, "The device doesn't support double");
}
_dst.create(src1.size(), CV_MAKE_TYPE(ddepth, cn));
GpuMat dst = _dst.getGpuMat();
PtrStepSzb src1_(src1.rows, src1.cols * cn, src1.data, src1.step);
PtrStepSzb src2_(src1.rows, src1.cols * cn, src2.data, src2.step);
PtrStepSzb dst_(src1.rows, src1.cols * cn, dst.data, dst.step);
if (sdepth1 > sdepth2)
{
std::swap(src1_.data, src2_.data);
std::swap(src1_.step, src2_.step);
std::swap(alpha, beta);
std::swap(sdepth1, sdepth2);
}
const func_t func = funcs[sdepth1][sdepth2][ddepth];
if (!func)
CV_Error(cv::Error::StsUnsupportedFormat, "Unsupported combination of source and destination types");
func(src1_, alpha, src2_, beta, gamma, dst_, StreamAccessor::getStream(stream));
}
////////////////////////////////////////////////////////////////////////
// threshold