attempt
authorIlya Lavrenov <ilya.lavrenov@itseez.com>
Fri, 21 Sep 2012 13:25:42 +0000 (17:25 +0400)
committerIlya Lavrenov <ilya.lavrenov@itseez.com>
Fri, 21 Sep 2012 13:25:42 +0000 (17:25 +0400)
modules/imgproc/src/imgwarp.cpp
modules/imgproc/test/test_imgwarp.cpp

index 47cf92e..f0ed609 100644 (file)
@@ -1423,7 +1423,7 @@ public:
         dsize.width *= cn;
         AutoBuffer<WT> _buffer(dsize.width*2);
         WT *buf = _buffer, *sum = buf + dsize.width;
-        int k, sy, dx, cur_dy = 0;
+        int k = -1000, sy = -1000, dx = -1000, cur_dy = -1000;
         WT scale_y = (WT)scale_y_;
         
         CV_Assert( cn <= 4 );
@@ -1567,7 +1567,8 @@ public:
                 T* D = (T*)(dst.data + dst.step*cur_dy);
                 if( fabs(beta) < 1e-3 )
                 {
-                    if(cur_dy >= dsize.height) return;
+                    if(cur_dy >= dsize.height)
+                        return;
                     for( dx = 0; dx < dsize.width; dx++ )
                     {
                         D[dx] = saturate_cast<T>((sum[dx] + buf[dx]) / min(scale_y, src.rows - cur_dy * scale_y));
@@ -1614,19 +1615,23 @@ private:
     resizeArea_Invoker& operator=(const resizeArea_Invoker&);
 };
 
-template<typename T, typename WT>
+template <typename T, typename WT>
 static void resizeArea_( const Mat& src, Mat& dst, const DecimateAlpha* xofs, int xofs_count, double scale_y_)
 {
 #ifdef HAVE_TBB
     Size ssize = src.size(), dsize = dst.size();
     AutoBuffer<int> _yofs(2 * ssize.height);
     int *yofs = _yofs, *cur_dy_ofs = _yofs + ssize.height;
-    int index = 0, cur_dy = 0, sy;
+    int index = 0, cur_dy = 0;
+    
+    // cur_dy_ofs - dy for the current sy
+    // yofs - a starting row for calculating a band according to the current sy
     
-    for( sy = 0; sy < ssize.height; sy++ )
+    for (int sy = 0; sy < ssize.height; sy++)
     {
-        bool reset = false;
         cur_dy_ofs[sy] = cur_dy;
+        yofs[sy] = index;
+        
         if ((cur_dy + 1) * scale_y_ <= sy + 1 || sy == ssize.height - 1 )
         {
             WT beta = (WT)std::max(sy + 1 - (cur_dy + 1) * scale_y_, 0.);
@@ -1634,13 +1639,10 @@ static void resizeArea_( const Mat& src, Mat& dst, const DecimateAlpha* xofs, in
             {
                 if (cur_dy >= dsize.height)
                     break;
-                reset = true;
+                index = sy + 1;
             }
             cur_dy++;
         }
-        yofs[sy] = index;
-        if (reset)
-            index = sy + 1;
     }
 #endif
     
index abed4ba..83246db 100644 (file)
@@ -1491,18 +1491,21 @@ TEST(Imgproc_resize_area, regression)
     };
 
     cv::Mat src(16, 16, CV_16UC1, input_data);
-    cv::Mat expected(5,5,CV_16UC1, expected_data);
+    cv::Mat expected(5, 5, CV_16UC1, expected_data);
     cv::Mat actual(expected.size(), expected.type());
 
     cv::resize(src, actual, cv::Size(), 0.3, 0.3, INTER_AREA);
 
     ASSERT_EQ(actual.type(), expected.type());
     ASSERT_EQ(actual.size(), expected.size());
+    
     Mat diff;
     absdiff(actual, expected, diff);
-    Mat one_channel_diff = diff.reshape(1);
+    std::cout << "Abs diff:" << std::endl << diff << std::endl;
+    
+    Mat one_channel_diff = diff; //.reshape(1);
     
-    int elem_diff = 1;
+    float elem_diff = 1.0f;
     Size dsize = actual.size();
     bool next = true;
     for (int dy = 0; dy < dsize.height && next; ++dy)
@@ -1527,7 +1530,7 @@ TEST(Imgproc_resize_area, regression)
             }
     }
     
-    ASSERT_EQ(norm(one_channel_diff, cv::NORM_INF),0);
+    ASSERT_EQ(norm(one_channel_diff, cv::NORM_INF), 0);
 }