Commit d052d863 authored by Vadim Pisarevsky's avatar Vadim Pisarevsky

Merge pull request #3315 from abak:seamless-refactor

parents dce629d0 5442de7d
......@@ -315,7 +315,7 @@ CV_EXPORTS_W void illuminationChange(InputArray src, InputArray mask, OutputArra
float alpha = 0.2f, float beta = 0.4f);
CV_EXPORTS_W void textureFlattening(InputArray src, InputArray mask, OutputArray dst,
double low_threshold = 30, double high_threshold = 45,
float low_threshold = 30, float high_threshold = 45,
int kernel_size = 3);
CV_EXPORTS_W void edgePreservingFilter(InputArray src, OutputArray dst, int flags = 1,
......
......@@ -41,7 +41,6 @@
#include "precomp.hpp"
#include "opencv2/photo.hpp"
#include <stdlib.h>
#include "seamless_cloning.hpp"
......@@ -50,9 +49,9 @@ using namespace cv;
void cv::seamlessClone(InputArray _src, InputArray _dst, InputArray _mask, Point p, OutputArray _blend, int flags)
{
Mat src = _src.getMat();
Mat dest = _dst.getMat();
Mat mask = _mask.getMat();
const Mat src = _src.getMat();
const Mat dest = _dst.getMat();
const Mat mask = _mask.getMat();
_blend.create(dest.size(), CV_8UC3);
Mat blend = _blend.getMat();
......@@ -87,6 +86,8 @@ void cv::seamlessClone(InputArray _src, InputArray _dst, InputArray _mask, Point
int lenx = maxx - minx;
int leny = maxy - miny;
Mat patch = Mat::zeros(Size(leny, lenx), CV_8UC3);
int minxd = p.y - lenx/2;
int maxxd = p.y + lenx/2;
int minyd = p.x - leny/2;
......@@ -102,12 +103,14 @@ void cv::seamlessClone(InputArray _src, InputArray _dst, InputArray _mask, Point
gray(roi_s).copyTo(destinationROI);
src(roi_s).copyTo(sourceROI,gray(roi_s));
src(roi_s).copyTo(patch, gray(roi_s));
destinationROI = cd_mask(roi_d);
cs_mask(roi_s).copyTo(destinationROI);
Cloning obj;
obj.normal_clone(dest,cd_mask,dst_mask,blend,flags);
obj.normalClone(dest,cd_mask,dst_mask,blend,flags);
}
......@@ -134,7 +137,7 @@ void cv::colorChange(InputArray _src, InputArray _mask, OutputArray _dst, float
src.copyTo(cs_mask,gray);
Cloning obj;
obj.local_color_change(src,cs_mask,gray,blend,red,green,blue);
obj.localColorChange(src,cs_mask,gray,blend,red,green,blue);
}
void cv::illuminationChange(InputArray _src, InputArray _mask, OutputArray _dst, float a, float b)
......@@ -159,12 +162,12 @@ void cv::illuminationChange(InputArray _src, InputArray _mask, OutputArray _dst,
src.copyTo(cs_mask,gray);
Cloning obj;
obj.illum_change(src,cs_mask,gray,blend,alpha,beta);
obj.illuminationChange(src,cs_mask,gray,blend,alpha,beta);
}
void cv::textureFlattening(InputArray _src, InputArray _mask, OutputArray _dst,
double low_threshold, double high_threshold, int kernel_size)
float low_threshold, float high_threshold, int kernel_size)
{
Mat src = _src.getMat();
......@@ -184,5 +187,5 @@ void cv::textureFlattening(InputArray _src, InputArray _mask, OutputArray _dst,
src.copyTo(cs_mask,gray);
Cloning obj;
obj.texture_flatten(src,cs_mask,gray,low_threshold,high_threshold,kernel_size,blend);
obj.textureFlatten(src,cs_mask,gray,low_threshold,high_threshold,kernel_size,blend);
}
This diff is collapsed.
This diff is collapsed.
......@@ -39,6 +39,15 @@
//
//M*/
#define OUTPUT_SAVING 0
#if OUTPUT_SAVING
#define SAVE(x) std::vector<int> params;\
params.push_back(16);\
params.push_back(0);\
imwrite(folder + "output.png", x ,params);
#else
#define SAVE(x)
#endif
#include "test_precomp.hpp"
#include "opencv2/photo.hpp"
......@@ -47,6 +56,7 @@
using namespace cv;
using namespace std;
static const double numerical_precision = 1000.;
TEST(Photo_SeamlessClone_normal, regression)
{
......@@ -69,8 +79,13 @@ TEST(Photo_SeamlessClone_normal, regression)
p.y = destination.size().height/2;
seamlessClone(source, destination, mask, p, result, 1);
imwrite(folder + "cloned.png", result);
Mat reference = imread(folder + "reference.png");
SAVE(result);
double error = cvtest::norm(reference, result, NORM_L1);
EXPECT_LE(error, numerical_precision);
}
TEST(Photo_SeamlessClone_mixed, regression)
......@@ -94,7 +109,11 @@ TEST(Photo_SeamlessClone_mixed, regression)
p.y = destination.size().height/2;
seamlessClone(source, destination, mask, p, result, 2);
imwrite(folder + "cloned.png", result);
SAVE(result);
Mat reference = imread(folder + "reference.png");
double error = cvtest::norm(reference, result, NORM_L1);
EXPECT_LE(error, numerical_precision);
}
......@@ -119,7 +138,11 @@ TEST(Photo_SeamlessClone_featureExchange, regression)
p.y = destination.size().height/2;
seamlessClone(source, destination, mask, p, result, 3);
imwrite(folder + "cloned.png", result);
SAVE(result);
Mat reference = imread(folder + "reference.png");
double error = cvtest::norm(reference, result, NORM_L1);
EXPECT_LE(error, numerical_precision);
}
......@@ -138,7 +161,11 @@ TEST(Photo_SeamlessClone_colorChange, regression)
Mat result;
colorChange(source, mask, result, 1.5, .5, .5);
imwrite(folder + "cloned.png", result);
SAVE(result);
Mat reference = imread(folder + "reference.png");
double error = cvtest::norm(reference, result, NORM_L1);
EXPECT_LE(error, numerical_precision);
}
......@@ -157,7 +184,11 @@ TEST(Photo_SeamlessClone_illuminationChange, regression)
Mat result;
illuminationChange(source, mask, result, 0.2f, 0.4f);
imwrite(folder + "cloned.png", result);
SAVE(result);
Mat reference = imread(folder + "reference.png");
double error = cvtest::norm(reference, result, NORM_L1);
EXPECT_LE(error, numerical_precision);
}
......@@ -176,6 +207,10 @@ TEST(Photo_SeamlessClone_textureFlattening, regression)
Mat result;
textureFlattening(source, mask, result, 30, 45, 3);
imwrite(folder + "cloned.png", result);
SAVE(result);
Mat reference = imread(folder + "reference.png");
double error = cvtest::norm(reference, result, NORM_L1);
EXPECT_LE(error, numerical_precision);
}
......@@ -47,6 +47,7 @@
using namespace cv;
using namespace std;
static const double numerical_precision = 10.;
TEST(Photo_Decolor, regression)
{
......@@ -61,7 +62,11 @@ TEST(Photo_Decolor, regression)
Mat grayscale, color_boost;
decolor(original, grayscale, color_boost);
imwrite(folder + "grayscale.png",grayscale);
imwrite(folder + "color_boost.png",color_boost);
Mat reference_grayscale = imread(folder + "grayscale_reference.png", 0 /* == grayscale image*/);
double error_grayscale = cvtest::norm(reference_grayscale, grayscale, NORM_L1);
EXPECT_LE(error_grayscale, numerical_precision);
Mat reference_boost = imread(folder + "boost_reference.png");
double error_boost = cvtest::norm(reference_boost, color_boost, NORM_L1);
EXPECT_LE(error_boost, numerical_precision);
}
......@@ -47,6 +47,7 @@
using namespace cv;
using namespace std;
static const double numerical_precision = 100.;
TEST(Photo_NPR_EdgePreserveSmoothing_RecursiveFilter, regression)
{
......@@ -60,8 +61,9 @@ TEST(Photo_NPR_EdgePreserveSmoothing_RecursiveFilter, regression)
Mat result;
edgePreservingFilter(source,result,1);
imwrite(folder + "smoothened_RF.png", result);
Mat reference = imread(folder + "smoothened_RF_reference.png");
double error = cvtest::norm(reference, result, NORM_L1);
EXPECT_LE(error, numerical_precision);
}
TEST(Photo_NPR_EdgePreserveSmoothing_NormConvFilter, regression)
......@@ -76,7 +78,9 @@ TEST(Photo_NPR_EdgePreserveSmoothing_NormConvFilter, regression)
Mat result;
edgePreservingFilter(source,result,2);
imwrite(folder + "smoothened_NCF.png", result);
Mat reference = imread(folder + "smoothened_NCF_reference.png");
double error = cvtest::norm(reference, result, NORM_L1);
EXPECT_LE(error, numerical_precision);
}
......@@ -92,8 +96,9 @@ TEST(Photo_NPR_DetailEnhance, regression)
Mat result;
detailEnhance(source,result);
imwrite(folder + "detail_enhanced.png", result);
Mat reference = imread(folder + "detail_enhanced_reference.png");
double error = cvtest::norm(reference, result, NORM_L1);
EXPECT_LE(error, numerical_precision);
}
TEST(Photo_NPR_PencilSketch, regression)
......@@ -105,12 +110,16 @@ TEST(Photo_NPR_PencilSketch, regression)
ASSERT_FALSE(source.empty()) << "Could not load input image " << original_path;
Mat result,result1;
pencilSketch(source,result,result1, 10, 0.1f, 0.03f);
Mat pencil_result, color_pencil_result;
pencilSketch(source,pencil_result, color_pencil_result, 10, 0.1f, 0.03f);
imwrite(folder + "pencil_sketch.png", result);
imwrite(folder + "color_pencil_sketch.png", result1);
Mat pencil_reference = imread(folder + "pencil_sketch_reference.png", 0 /* == grayscale*/);
double pencil_error = norm(pencil_reference, pencil_result, NORM_L1);
EXPECT_LE(pencil_error, numerical_precision);
Mat color_pencil_reference = imread(folder + "color_pencil_sketch_reference.png");
double color_pencil_error = cvtest::norm(color_pencil_reference, color_pencil_result, NORM_L1);
EXPECT_LE(color_pencil_error, numerical_precision);
}
TEST(Photo_NPR_Stylization, regression)
......@@ -125,6 +134,8 @@ TEST(Photo_NPR_Stylization, regression)
Mat result;
stylization(source,result);
imwrite(folder + "stylized.png", result);
Mat stylized_reference = imread(folder + "stylized_reference.png");
double stylized_error = cvtest::norm(stylized_reference, result, NORM_L1);
EXPECT_LE(stylized_error, numerical_precision);
}
......@@ -65,7 +65,7 @@ float alpha,beta;
float red, green, blue;
double low_t, high_t;
float low_t, high_t;
void source(int, int, int, int, void*);
void destination(int, int, int, int, void*);
......
......@@ -64,7 +64,7 @@ float alpha,beta;
float red, green, blue;
double low_t, high_t;
float low_t, high_t;
void source(int, int, int, int, void*);
void destination(int, int, int, int, void*);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment