IPP 2017 filter2D fix;
authorPavel Vlasov <pavel.vlasov@intel.com>
Mon, 21 Nov 2016 14:18:03 +0000 (17:18 +0300)
committerPavel Vlasov <pavel.vlasov@intel.com>
Mon, 21 Nov 2016 14:18:03 +0000 (17:18 +0300)
filter2D IPP runtime check;

modules/imgproc/src/filter.cpp

index 68a168f..e379df2 100644 (file)
@@ -4640,6 +4640,11 @@ struct IppFilter : public hal::Filter2D
         int ddepth = CV_MAT_DEPTH(dtype);
         int sdepth = CV_MAT_DEPTH(stype);
 
+#if IPP_VERSION_X100 >= 201700 && IPP_VERSION_X100 < 201702 // IPP bug with 1x1 kernel
+        if(kernel_width == 1 && kernel_height == 1)
+            return false;
+#endif
+
         bool runIpp = true
                       && (borderTypeNI == BORDER_CONSTANT || borderTypeNI == BORDER_REPLICATE)
                       && (sdepth == ddepth)
@@ -4911,26 +4916,29 @@ Ptr<hal::Filter2D> Filter2D::create(uchar* kernel_data, size_t kernel_step, int
     }
 
 #ifdef HAVE_IPP
-    if (kernel_type == CV_32FC1) {
-        IppFilter<CV_32F>* impl = new IppFilter<CV_32F>();
-        if (impl->init(kernel_data, kernel_step, kernel_type, kernel_width, kernel_height,
-                       max_width, max_height, stype, dtype,
-                       borderType, delta, anchor_x, anchor_y, isSubmatrix, isInplace))
-        {
-            return Ptr<hal::Filter2D>(impl);
+    CV_IPP_CHECK()
+    {
+        if (kernel_type == CV_32FC1) {
+            IppFilter<CV_32F>* impl = new IppFilter<CV_32F>();
+            if (impl->init(kernel_data, kernel_step, kernel_type, kernel_width, kernel_height,
+                           max_width, max_height, stype, dtype,
+                           borderType, delta, anchor_x, anchor_y, isSubmatrix, isInplace))
+            {
+                return Ptr<hal::Filter2D>(impl);
+            }
+            delete impl;
         }
-        delete impl;
-    }
 
-    if (kernel_type == CV_16SC1) {
-        IppFilter<CV_16S>* impl = new IppFilter<CV_16S>();
-        if (impl->init(kernel_data, kernel_step, kernel_type, kernel_width, kernel_height,
-                       max_width, max_height, stype, dtype,
-                       borderType, delta, anchor_x, anchor_y, isSubmatrix, isInplace))
-        {
-            return Ptr<hal::Filter2D>(impl);
+        if (kernel_type == CV_16SC1) {
+            IppFilter<CV_16S>* impl = new IppFilter<CV_16S>();
+            if (impl->init(kernel_data, kernel_step, kernel_type, kernel_width, kernel_height,
+                           max_width, max_height, stype, dtype,
+                           borderType, delta, anchor_x, anchor_y, isSubmatrix, isInplace))
+            {
+                return Ptr<hal::Filter2D>(impl);
+            }
+            delete impl;
         }
-        delete impl;
     }
 #endif