mirror of
https://github.com/opencv/opencv.git
synced 2024-11-28 05:06:29 +08:00
Merge pull request #7221 from terfendail:sepfilter_vec_kernel
This commit is contained in:
commit
c16f96cb5b
18
3rdparty/carotene/hal/tegra_hal.hpp
vendored
18
3rdparty/carotene/hal/tegra_hal.hpp
vendored
@ -1178,12 +1178,12 @@ struct SepFilterCtx
|
|||||||
CAROTENE_NS::BORDER_MODE border;
|
CAROTENE_NS::BORDER_MODE border;
|
||||||
};
|
};
|
||||||
inline int TEGRA_SEPFILTERINIT(cvhalFilter2D **context, int src_type, int dst_type, int kernel_type,
|
inline int TEGRA_SEPFILTERINIT(cvhalFilter2D **context, int src_type, int dst_type, int kernel_type,
|
||||||
uchar *kernelx_data, size_t , int kernelx_width, int kernelx_height,
|
uchar *kernelx_data, int kernelx_length,
|
||||||
uchar *kernely_data, size_t kernely_step, int kernely_width, int kernely_height,
|
uchar *kernely_data, int kernely_length,
|
||||||
int anchor_x, int anchor_y, double delta, int borderType)
|
int anchor_x, int anchor_y, double delta, int borderType)
|
||||||
{
|
{
|
||||||
if(!context || !kernelx_data || !kernely_data || src_type != CV_8UC1 || dst_type != CV_16SC1 ||
|
if(!context || !kernelx_data || !kernely_data || src_type != CV_8UC1 || dst_type != CV_16SC1 ||
|
||||||
!(kernelx_width == 3 && kernelx_height == 1) || !(kernely_width == 1 && kernely_height == 3) ||
|
kernelx_length != 3 || kernely_length != 3 ||
|
||||||
delta != 0 || anchor_x != 1 || anchor_y != 1)
|
delta != 0 || anchor_x != 1 || anchor_y != 1)
|
||||||
return CV_HAL_ERROR_NOT_IMPLEMENTED;
|
return CV_HAL_ERROR_NOT_IMPLEMENTED;
|
||||||
|
|
||||||
@ -1225,24 +1225,24 @@ inline int TEGRA_SEPFILTERINIT(cvhalFilter2D **context, int src_type, int dst_ty
|
|||||||
ctx->kernelx_data[1]=kernelx_data[1];
|
ctx->kernelx_data[1]=kernelx_data[1];
|
||||||
ctx->kernelx_data[2]=kernelx_data[2];
|
ctx->kernelx_data[2]=kernelx_data[2];
|
||||||
ctx->kernely_data[0]=kernely_data[0];
|
ctx->kernely_data[0]=kernely_data[0];
|
||||||
ctx->kernely_data[1]=kernely_data[kernely_step];
|
ctx->kernely_data[1]=kernely_data[1];
|
||||||
ctx->kernely_data[2]=kernely_data[2*kernely_step];
|
ctx->kernely_data[2]=kernely_data[2];
|
||||||
break;
|
break;
|
||||||
case CV_8SC1:
|
case CV_8SC1:
|
||||||
ctx->kernelx_data[0]=((char*)kernelx_data)[0];
|
ctx->kernelx_data[0]=((char*)kernelx_data)[0];
|
||||||
ctx->kernelx_data[1]=((char*)kernelx_data)[1];
|
ctx->kernelx_data[1]=((char*)kernelx_data)[1];
|
||||||
ctx->kernelx_data[2]=((char*)kernelx_data)[2];
|
ctx->kernelx_data[2]=((char*)kernelx_data)[2];
|
||||||
ctx->kernely_data[0]=((char*)kernely_data)[0];
|
ctx->kernely_data[0]=((char*)kernely_data)[0];
|
||||||
ctx->kernely_data[1]=((char*)(kernely_data+kernely_step))[0];
|
ctx->kernely_data[1]=((char*)kernely_data)[1];
|
||||||
ctx->kernely_data[2]=((char*)(kernely_data+2*kernely_step))[0];
|
ctx->kernely_data[2]=((char*)kernely_data)[2];
|
||||||
break;
|
break;
|
||||||
case CV_16UC1:
|
case CV_16UC1:
|
||||||
ctx->kernelx_data[0]=((int16_t*)kernelx_data)[0];
|
ctx->kernelx_data[0]=((int16_t*)kernelx_data)[0];
|
||||||
ctx->kernelx_data[1]=((int16_t*)kernelx_data)[1];
|
ctx->kernelx_data[1]=((int16_t*)kernelx_data)[1];
|
||||||
ctx->kernelx_data[2]=((int16_t*)kernelx_data)[2];
|
ctx->kernelx_data[2]=((int16_t*)kernelx_data)[2];
|
||||||
ctx->kernely_data[0]=((int16_t*)kernely_data)[0];
|
ctx->kernely_data[0]=((int16_t*)kernely_data)[0];
|
||||||
ctx->kernely_data[1]=((int16_t*)(kernely_data+kernely_step))[0];
|
ctx->kernely_data[1]=((int16_t*)kernely_data)[1];
|
||||||
ctx->kernely_data[2]=((int16_t*)(kernely_data+2*kernely_step))[0];
|
ctx->kernely_data[2]=((int16_t*)kernely_data)[2];
|
||||||
default:
|
default:
|
||||||
delete ctx;
|
delete ctx;
|
||||||
return CV_HAL_ERROR_NOT_IMPLEMENTED;
|
return CV_HAL_ERROR_NOT_IMPLEMENTED;
|
||||||
|
@ -30,10 +30,8 @@ struct CV_EXPORTS Filter2D
|
|||||||
struct CV_EXPORTS SepFilter2D
|
struct CV_EXPORTS SepFilter2D
|
||||||
{
|
{
|
||||||
static Ptr<hal::SepFilter2D> create(int stype, int dtype, int ktype,
|
static Ptr<hal::SepFilter2D> create(int stype, int dtype, int ktype,
|
||||||
uchar * kernelx_data, size_t kernelx_step,
|
uchar * kernelx_data, int kernelx_len,
|
||||||
int kernelx_width, int kernelx_height,
|
uchar * kernely_data, int kernely_len,
|
||||||
uchar * kernely_data, size_t kernely_step,
|
|
||||||
int kernely_width, int kernely_height,
|
|
||||||
int anchor_x, int anchor_y,
|
int anchor_x, int anchor_y,
|
||||||
double delta, int borderType);
|
double delta, int borderType);
|
||||||
virtual void apply(uchar * src_data, size_t src_step,
|
virtual void apply(uchar * src_data, size_t src_step,
|
||||||
|
@ -4823,13 +4823,13 @@ struct ReplacementSepFilter : public hal::SepFilter2D
|
|||||||
bool isInitialized;
|
bool isInitialized;
|
||||||
ReplacementSepFilter() : ctx(0), isInitialized(false) {}
|
ReplacementSepFilter() : ctx(0), isInitialized(false) {}
|
||||||
bool init(int stype, int dtype, int ktype,
|
bool init(int stype, int dtype, int ktype,
|
||||||
uchar * kernelx_data, size_t kernelx_step, int kernelx_width, int kernelx_height,
|
uchar * kernelx_data, int kernelx_len,
|
||||||
uchar * kernely_data, size_t kernely_step, int kernely_width, int kernely_height,
|
uchar * kernely_data, int kernely_len,
|
||||||
int anchor_x, int anchor_y, double delta, int borderType)
|
int anchor_x, int anchor_y, double delta, int borderType)
|
||||||
{
|
{
|
||||||
int res = cv_hal_sepFilterInit(&ctx, stype, dtype, ktype,
|
int res = cv_hal_sepFilterInit(&ctx, stype, dtype, ktype,
|
||||||
kernelx_data, kernelx_step, kernelx_width, kernelx_height,
|
kernelx_data, kernelx_len,
|
||||||
kernely_data, kernely_step, kernely_width, kernely_height,
|
kernely_data, kernely_len,
|
||||||
anchor_x, anchor_y, delta, borderType);
|
anchor_x, anchor_y, delta, borderType);
|
||||||
isInitialized = (res == CV_HAL_ERROR_OK);
|
isInitialized = (res == CV_HAL_ERROR_OK);
|
||||||
return isInitialized;
|
return isInitialized;
|
||||||
@ -4862,14 +4862,14 @@ struct OcvSepFilter : public hal::SepFilter2D
|
|||||||
int src_type;
|
int src_type;
|
||||||
int dst_type;
|
int dst_type;
|
||||||
bool init(int stype, int dtype, int ktype,
|
bool init(int stype, int dtype, int ktype,
|
||||||
uchar * kernelx_data, size_t kernelx_step, int kernelx_width, int kernelx_height,
|
uchar * kernelx_data, int kernelx_len,
|
||||||
uchar * kernely_data, size_t kernely_step, int kernely_width, int kernely_height,
|
uchar * kernely_data, int kernely_len,
|
||||||
int anchor_x, int anchor_y, double delta, int borderType)
|
int anchor_x, int anchor_y, double delta, int borderType)
|
||||||
{
|
{
|
||||||
src_type = stype;
|
src_type = stype;
|
||||||
dst_type = dtype;
|
dst_type = dtype;
|
||||||
Mat kernelX(Size(kernelx_width, kernelx_height), ktype, kernelx_data, kernelx_step);
|
Mat kernelX(Size(kernelx_len, 1), ktype, kernelx_data);
|
||||||
Mat kernelY(Size(kernely_width, kernely_height), ktype, kernely_data, kernely_step);
|
Mat kernelY(Size(kernely_len, 1), ktype, kernely_data);
|
||||||
|
|
||||||
f = createSeparableLinearFilter( stype, dtype, kernelX, kernelY,
|
f = createSeparableLinearFilter( stype, dtype, kernelX, kernelY,
|
||||||
Point(anchor_x, anchor_y),
|
Point(anchor_x, anchor_y),
|
||||||
@ -4958,15 +4958,15 @@ Ptr<hal::Filter2D> Filter2D::create(uchar* kernel_data, size_t kernel_step, int
|
|||||||
//---------------------------------------------------------------
|
//---------------------------------------------------------------
|
||||||
|
|
||||||
Ptr<SepFilter2D> SepFilter2D::create(int stype, int dtype, int ktype,
|
Ptr<SepFilter2D> SepFilter2D::create(int stype, int dtype, int ktype,
|
||||||
uchar * kernelx_data, size_t kernelx_step, int kernelx_width, int kernelx_height,
|
uchar * kernelx_data, int kernelx_len,
|
||||||
uchar * kernely_data, size_t kernely_step, int kernely_width, int kernely_height,
|
uchar * kernely_data, int kernely_len,
|
||||||
int anchor_x, int anchor_y, double delta, int borderType)
|
int anchor_x, int anchor_y, double delta, int borderType)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
ReplacementSepFilter * impl = new ReplacementSepFilter();
|
ReplacementSepFilter * impl = new ReplacementSepFilter();
|
||||||
if (impl->init(stype, dtype, ktype,
|
if (impl->init(stype, dtype, ktype,
|
||||||
kernelx_data, kernelx_step, kernelx_width, kernelx_height,
|
kernelx_data, kernelx_len,
|
||||||
kernely_data, kernely_step, kernely_width, kernely_height,
|
kernely_data, kernely_len,
|
||||||
anchor_x, anchor_y, delta, borderType))
|
anchor_x, anchor_y, delta, borderType))
|
||||||
{
|
{
|
||||||
return Ptr<hal::SepFilter2D>(impl);
|
return Ptr<hal::SepFilter2D>(impl);
|
||||||
@ -4976,8 +4976,8 @@ Ptr<SepFilter2D> SepFilter2D::create(int stype, int dtype, int ktype,
|
|||||||
{
|
{
|
||||||
OcvSepFilter * impl = new OcvSepFilter();
|
OcvSepFilter * impl = new OcvSepFilter();
|
||||||
impl->init(stype, dtype, ktype,
|
impl->init(stype, dtype, ktype,
|
||||||
kernelx_data, kernelx_step, kernelx_width, kernelx_height,
|
kernelx_data, kernelx_len,
|
||||||
kernely_data, kernely_step, kernely_width, kernely_height,
|
kernely_data, kernely_len,
|
||||||
anchor_x, anchor_y, delta, borderType);
|
anchor_x, anchor_y, delta, borderType);
|
||||||
return Ptr<hal::SepFilter2D>(impl);
|
return Ptr<hal::SepFilter2D>(impl);
|
||||||
}
|
}
|
||||||
@ -5041,11 +5041,15 @@ void cv::sepFilter2D( InputArray _src, OutputArray _dst, int ddepth,
|
|||||||
if( (borderType & BORDER_ISOLATED) == 0 )
|
if( (borderType & BORDER_ISOLATED) == 0 )
|
||||||
src.locateROI( wsz, ofs );
|
src.locateROI( wsz, ofs );
|
||||||
|
|
||||||
CV_Assert(kernelX.type() == kernelY.type());
|
CV_Assert( kernelX.type() == kernelY.type() &&
|
||||||
|
(kernelX.cols == 1 || kernelX.rows == 1) &&
|
||||||
|
(kernelY.cols == 1 || kernelY.rows == 1) );
|
||||||
|
|
||||||
|
Mat contKernelX = kernelX.isContinuous() ? kernelX : kernelX.clone();
|
||||||
|
Mat contKernelY = kernelY.isContinuous() ? kernelY : kernelY.clone();
|
||||||
Ptr<hal::SepFilter2D> c = hal::SepFilter2D::create(src.type(), dst.type(), kernelX.type(),
|
Ptr<hal::SepFilter2D> c = hal::SepFilter2D::create(src.type(), dst.type(), kernelX.type(),
|
||||||
kernelX.data, kernelX.step, kernelX.cols, kernelX.rows,
|
contKernelX.data, kernelX.cols + kernelX.rows - 1,
|
||||||
kernelY.data, kernelY.step, kernelY.cols, kernelY.rows,
|
contKernelY.data, kernelY.cols + kernelY.rows - 1,
|
||||||
anchor.x, anchor.y, delta, borderType & ~BORDER_ISOLATED);
|
anchor.x, anchor.y, delta, borderType & ~BORDER_ISOLATED);
|
||||||
c->apply(src.data, src.step, dst.data, dst.step, dst.cols, dst.rows, wsz.width, wsz.height, ofs.x, ofs.y);
|
c->apply(src.data, src.step, dst.data, dst.step, dst.cols, dst.rows, wsz.width, wsz.height, ofs.x, ofs.y);
|
||||||
}
|
}
|
||||||
|
@ -140,20 +140,16 @@ inline int hal_ni_filterFree(cvhalFilter2D *context) { return CV_HAL_ERROR_NOT_I
|
|||||||
@param dst_type destination image type
|
@param dst_type destination image type
|
||||||
@param kernel_type kernels type
|
@param kernel_type kernels type
|
||||||
@param kernelx_data pointer to x-kernel data
|
@param kernelx_data pointer to x-kernel data
|
||||||
@param kernelx_step x-kernel step
|
@param kernelx_length x-kernel vector length
|
||||||
@param kernelx_width x-kernel width
|
|
||||||
@param kernelx_height x-kernel height
|
|
||||||
@param kernely_data pointer to y-kernel data
|
@param kernely_data pointer to y-kernel data
|
||||||
@param kernely_step y-kernel step
|
@param kernely_length y-kernel vector length
|
||||||
@param kernely_width y-kernel width
|
|
||||||
@param kernely_height y-kernel height
|
|
||||||
@param anchor_x relative X position of center point within the kernel
|
@param anchor_x relative X position of center point within the kernel
|
||||||
@param anchor_y relative Y position of center point within the kernel
|
@param anchor_y relative Y position of center point within the kernel
|
||||||
@param delta added to pixel values
|
@param delta added to pixel values
|
||||||
@param borderType border processing mode (CV_HAL_BORDER_REFLECT, ...)
|
@param borderType border processing mode (CV_HAL_BORDER_REFLECT, ...)
|
||||||
@sa cv::sepFilter2D, cv::hal::SepFilter2D
|
@sa cv::sepFilter2D, cv::hal::SepFilter2D
|
||||||
*/
|
*/
|
||||||
inline int hal_ni_sepFilterInit(cvhalFilter2D **context, int src_type, int dst_type, int kernel_type, uchar *kernelx_data, size_t kernelx_step, int kernelx_width, int kernelx_height, uchar *kernely_data, size_t kernely_step, int kernely_width, int kernely_height, int anchor_x, int anchor_y, double delta, int borderType) { return CV_HAL_ERROR_NOT_IMPLEMENTED; }
|
inline int hal_ni_sepFilterInit(cvhalFilter2D **context, int src_type, int dst_type, int kernel_type, uchar *kernelx_data, int kernelx_length, uchar *kernely_data, int kernely_length, int anchor_x, int anchor_y, double delta, int borderType) { return CV_HAL_ERROR_NOT_IMPLEMENTED; }
|
||||||
/**
|
/**
|
||||||
@brief hal_sepFilter
|
@brief hal_sepFilter
|
||||||
@param context pointer to user-defined context
|
@param context pointer to user-defined context
|
||||||
|
Loading…
Reference in New Issue
Block a user