Updated HAL interface for separable filters to address that both kernels are vectors.
authorVitaly Tuzov <terfendail@mediana.jetos.com>
Fri, 2 Sep 2016 11:36:34 +0000 (14:36 +0300)
committerVitaly Tuzov <terfendail@mediana.jetos.com>
Fri, 2 Sep 2016 11:42:01 +0000 (14:42 +0300)
3rdparty/carotene/hal/tegra_hal.hpp
modules/imgproc/include/opencv2/imgproc/hal/hal.hpp
modules/imgproc/src/filter.cpp
modules/imgproc/src/hal_replacement.hpp

index 401f521..37e7472 100644 (file)
@@ -1178,12 +1178,12 @@ struct SepFilterCtx
     CAROTENE_NS::BORDER_MODE border;
 };
 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 *kernely_data, size_t kernely_step, int kernely_width, int kernely_height,
+                               uchar *kernelx_data, int kernelx_length,
+                               uchar *kernely_data, int kernely_length,
                                int anchor_x, int anchor_y, double delta, int borderType)
 {
     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)
         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[2]=kernelx_data[2];
         ctx->kernely_data[0]=kernely_data[0];
-        ctx->kernely_data[1]=kernely_data[kernely_step];
-        ctx->kernely_data[2]=kernely_data[2*kernely_step];
+        ctx->kernely_data[1]=kernely_data[1];
+        ctx->kernely_data[2]=kernely_data[2];
         break;
     case CV_8SC1:
         ctx->kernelx_data[0]=((char*)kernelx_data)[0];
         ctx->kernelx_data[1]=((char*)kernelx_data)[1];
         ctx->kernelx_data[2]=((char*)kernelx_data)[2];
         ctx->kernely_data[0]=((char*)kernely_data)[0];
-        ctx->kernely_data[1]=((char*)(kernely_data+kernely_step))[0];
-        ctx->kernely_data[2]=((char*)(kernely_data+2*kernely_step))[0];
+        ctx->kernely_data[1]=((char*)kernely_data)[1];
+        ctx->kernely_data[2]=((char*)kernely_data)[2];
         break;
     case CV_16UC1:
         ctx->kernelx_data[0]=((int16_t*)kernelx_data)[0];
         ctx->kernelx_data[1]=((int16_t*)kernelx_data)[1];
         ctx->kernelx_data[2]=((int16_t*)kernelx_data)[2];
         ctx->kernely_data[0]=((int16_t*)kernely_data)[0];
-        ctx->kernely_data[1]=((int16_t*)(kernely_data+kernely_step))[0];
-        ctx->kernely_data[2]=((int16_t*)(kernely_data+2*kernely_step))[0];
+        ctx->kernely_data[1]=((int16_t*)kernely_data)[1];
+        ctx->kernely_data[2]=((int16_t*)kernely_data)[2];
     default:
         delete ctx;
         return CV_HAL_ERROR_NOT_IMPLEMENTED;
index 0943a2d..23ed10c 100644 (file)
@@ -30,10 +30,8 @@ struct CV_EXPORTS Filter2D
 struct CV_EXPORTS SepFilter2D
 {
     static Ptr<hal::SepFilter2D> create(int stype, int dtype, int ktype,
-                                        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,
+                                        uchar * kernelx_data, int kernelx_len,
+                                        uchar * kernely_data, int kernely_len,
                                         int anchor_x, int anchor_y,
                                         double delta, int borderType);
     virtual void apply(uchar * src_data, size_t src_step,
index 3bd5cd0..68a168f 100644 (file)
@@ -4823,13 +4823,13 @@ struct ReplacementSepFilter : public hal::SepFilter2D
     bool isInitialized;
     ReplacementSepFilter() : ctx(0), isInitialized(false) {}
     bool init(int stype, int dtype, int ktype,
-              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,
+              uchar * kernelx_data, int kernelx_len,
+              uchar * kernely_data, int kernely_len,
               int anchor_x, int anchor_y, double delta, int borderType)
     {
         int res = cv_hal_sepFilterInit(&ctx, stype, dtype, ktype,
-                                       kernelx_data, kernelx_step, kernelx_width, kernelx_height,
-                                       kernely_data, kernely_step, kernely_width, kernely_height,
+                                       kernelx_data, kernelx_len,
+                                       kernely_data, kernely_len,
                                        anchor_x, anchor_y, delta, borderType);
         isInitialized = (res == CV_HAL_ERROR_OK);
         return isInitialized;
@@ -4862,14 +4862,14 @@ struct OcvSepFilter : public hal::SepFilter2D
     int src_type;
     int dst_type;
     bool init(int stype, int dtype, int ktype,
-              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,
+              uchar * kernelx_data, int kernelx_len,
+              uchar * kernely_data, int kernely_len,
               int anchor_x, int anchor_y, double delta, int borderType)
     {
         src_type = stype;
         dst_type = dtype;
-        Mat kernelX(Size(kernelx_width, kernelx_height), ktype, kernelx_data, kernelx_step);
-        Mat kernelY(Size(kernely_width, kernely_height), ktype, kernely_data, kernely_step);
+        Mat kernelX(Size(kernelx_len, 1), ktype, kernelx_data);
+        Mat kernelY(Size(kernely_len, 1), ktype, kernely_data);
 
         f = createSeparableLinearFilter( stype, dtype, kernelX, kernelY,
                                          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,
-                                     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,
+                                     uchar * kernelx_data, int kernelx_len,
+                                     uchar * kernely_data, int kernely_len,
                                      int anchor_x, int anchor_y, double delta, int borderType)
 {
     {
         ReplacementSepFilter * impl = new ReplacementSepFilter();
         if (impl->init(stype, dtype, ktype,
-                       kernelx_data, kernelx_step, kernelx_width, kernelx_height,
-                       kernely_data, kernely_step, kernely_width, kernely_height,
+                       kernelx_data, kernelx_len,
+                       kernely_data, kernely_len,
                        anchor_x, anchor_y, delta, borderType))
         {
             return Ptr<hal::SepFilter2D>(impl);
@@ -4976,8 +4976,8 @@ Ptr<SepFilter2D> SepFilter2D::create(int stype, int dtype, int ktype,
     {
         OcvSepFilter * impl = new OcvSepFilter();
         impl->init(stype, dtype, ktype,
-                   kernelx_data, kernelx_step, kernelx_width, kernelx_height,
-                   kernely_data, kernely_step, kernely_width, kernely_height,
+                   kernelx_data, kernelx_len,
+                   kernely_data, kernely_len,
                    anchor_x, anchor_y, delta, borderType);
         return Ptr<hal::SepFilter2D>(impl);
     }
@@ -5041,11 +5041,15 @@ void cv::sepFilter2D( InputArray _src, OutputArray _dst, int ddepth,
     if( (borderType & BORDER_ISOLATED) == 0 )
         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(),
-                                                       kernelX.data, kernelX.step, kernelX.cols, kernelX.rows,
-                                                       kernelY.data, kernelY.step, kernelY.cols, kernelY.rows,
+                                                       contKernelX.data, kernelX.cols + kernelX.rows - 1,
+                                                       contKernelY.data, kernelY.cols + kernelY.rows - 1,
                                                        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);
 }
index ecc11fb..fdf3ab7 100644 (file)
@@ -140,20 +140,16 @@ inline int hal_ni_filterFree(cvhalFilter2D *context) { return CV_HAL_ERROR_NOT_I
    @param dst_type destination image type
    @param kernel_type kernels type
    @param kernelx_data pointer to x-kernel data
-   @param kernelx_step x-kernel step
-   @param kernelx_width x-kernel width
-   @param kernelx_height x-kernel height
+   @param kernelx_length x-kernel vector length
    @param kernely_data pointer to y-kernel data
-   @param kernely_step y-kernel step
-   @param kernely_width y-kernel width
-   @param kernely_height y-kernel height
+   @param kernely_length y-kernel vector length
    @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 delta added to pixel values
    @param borderType border processing mode (CV_HAL_BORDER_REFLECT, ...)
    @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
    @param context pointer to user-defined context