Update seamless_cloning.cpp
authorSuleyman TURKMEN <sturkmen@hotmail.com>
Wed, 12 Sep 2018 14:34:32 +0000 (17:34 +0300)
committerSuleyman TURKMEN <sturkmen@hotmail.com>
Fri, 14 Sep 2018 16:51:40 +0000 (19:51 +0300)
modules/photo/src/seamless_cloning.cpp

index e5fcd09..629c56f 100644 (file)
@@ -54,20 +54,27 @@ void cv::seamlessClone(InputArray _src, InputArray _dst, InputArray _mask, Point
     const Mat src  = _src.getMat();
     const Mat dest = _dst.getMat();
     const Mat mask = _mask.getMat();
-    _blend.create(dest.size(), CV_8UC3);
+    dest.copyTo(_blend);
     Mat blend = _blend.getMat();
-    dest.copyTo(blend);
-
-    int minx = INT_MAX, miny = INT_MAX, maxx = INT_MIN, maxy = INT_MIN;
-    int h = mask.size().height;
-    int w = mask.size().width;
 
     Mat gray;
 
     if(mask.channels() == 3)
         cvtColor(mask, gray, COLOR_BGR2GRAY );
     else
-        mask.copyTo(gray);
+    {
+        if (mask.empty())
+            gray = Mat(src.rows, src.cols, CV_8UC1, Scalar(255));
+        else
+            mask.copyTo(gray);
+    }
+
+    Mat gray_inner = gray(Rect(1, 1, gray.cols - 2, gray.rows - 2));
+    copyMakeBorder(gray_inner, gray, 1, 1, 1, 1, BORDER_ISOLATED | BORDER_CONSTANT, Scalar(0));
+
+    int minx = INT_MAX, miny = INT_MAX, maxx = INT_MIN, maxy = INT_MIN;
+    int h = gray.size().height;
+    int w = gray.size().width;
 
     for(int i=0;i<h;i++)
     {
@@ -102,7 +109,6 @@ void cv::seamlessClone(InputArray _src, InputArray _dst, InputArray _mask, Point
 
     Cloning obj;
     obj.normalClone(destinationROI,sourceROI,maskROI,recoveredROI,flags);
-
 }
 
 void cv::colorChange(InputArray _src, InputArray _mask, OutputArray _dst, float red, float green, float blue)