From b4504639c877ce55edeb68477a079bab48f842d9 Mon Sep 17 00:00:00 2001 From: Adrien BAK Date: Fri, 10 Oct 2014 15:56:32 +0900 Subject: [PATCH] refactor poisson_solver --- modules/photo/src/seamless_cloning.hpp | 3 +- modules/photo/src/seamless_cloning_impl.cpp | 47 ++++----------------- 2 files changed, 10 insertions(+), 40 deletions(-) diff --git a/modules/photo/src/seamless_cloning.hpp b/modules/photo/src/seamless_cloning.hpp index 9735c6684a..4d9cfdfbd7 100644 --- a/modules/photo/src/seamless_cloning.hpp +++ b/modules/photo/src/seamless_cloning.hpp @@ -67,7 +67,8 @@ namespace cv void evaluate(const cv::Mat &I, const cv::Mat &wmask, const cv::Mat &cloned); void dst(const Mat& src, Mat& dest, bool invert = false); void idst(const Mat& src, Mat& dest); - void solve(const cv::Mat &img, std::vector& mod_diff, cv::Mat &result); + void solve(const Mat &img, Mat& mod_diff, Mat &result); + void poissonSolver(const cv::Mat &img, cv::Mat &gxx , cv::Mat &gyy, cv::Mat &result); void arrayProduct(const cv::Mat& lhs, const cv::Mat& rhs, cv::Mat& result) const; diff --git a/modules/photo/src/seamless_cloning_impl.cpp b/modules/photo/src/seamless_cloning_impl.cpp index 35c83736a2..a7f59aa707 100644 --- a/modules/photo/src/seamless_cloning_impl.cpp +++ b/modules/photo/src/seamless_cloning_impl.cpp @@ -131,15 +131,13 @@ void Cloning::idst(const Mat& src, Mat& dest) dst(src, dest, true); } -void Cloning::solve(const Mat &img, std::vector& mod_diff, Mat &result) +void Cloning::solve(const Mat &img, Mat& mod_diff, Mat &result) { const int w = img.cols; const int h = img.rows; - - Mat ModDiff(h-2, w-2, CV_32F, &mod_diff[0]); Mat res; - dst(ModDiff, res); + dst(mod_diff, res); for(int j = 0 ; j < h-2; j++) { @@ -150,7 +148,7 @@ void Cloning::solve(const Mat &img, std::vector& mod_diff, Mat &result) } } - idst(res, ModDiff); + idst(res, mod_diff); unsigned char * resLinePtr = result.ptr(0); const unsigned char * imgLinePtr = img.ptr(0); @@ -164,7 +162,7 @@ void Cloning::solve(const Mat &img, std::vector& mod_diff, Mat &result) { resLinePtr = result.ptr(j); imgLinePtr = img.ptr(j); - interpLinePtr = ModDiff.ptr(j-1); + interpLinePtr = mod_diff.ptr(j-1); //first row resLinePtr[0] = imgLinePtr[0]; @@ -201,8 +199,6 @@ void Cloning::poissonSolver(const Mat &img, Mat &laplacianX , Mat &laplacianY, M const int w = img.cols; const int h = img.rows; - unsigned long int idx; - Mat lap = Mat(img.size(),CV_32FC1); lap = laplacianX + laplacianY; @@ -210,39 +206,12 @@ void Cloning::poissonSolver(const Mat &img, Mat &laplacianX , Mat &laplacianY, M Mat bound = img.clone(); rectangle(bound, Point(1, 1), Point(img.cols-2, img.rows-2), Scalar::all(0), -1); + Mat boundary_points; + Laplacian(bound, boundary_points, CV_32F); + boundary_points = lap - boundary_points; - std::vector boundary_point(h*w, 0.); - - for(int i =1;i(i)[j] + (int)bound.ptr(i)[j+1] + (int)bound.ptr(i)[j-1] - + (int)bound.ptr(i-1)[j] + (int)bound.ptr(i+1)[j]; - } - - Mat diff = Mat(h,w,CV_32FC1); - for(int i =0;i(i)[j] = (lap.ptr(i)[j] - boundary_point[idx]); - } - } - - std::vector mod_diff((h-2)*(w-2), 0.); - for(int i = 0 ; i < h-2;i++) - { - for(int j = 0 ; j < w-2; j++) - { - idx = i*(w-2) + j; - mod_diff[idx] = diff.ptr(i+1)[j+1]; - - } - } - ///////////////////////////////////////////////////// Find DST ///////////////////////////////////////////////////// + Mat mod_diff = boundary_points(Rect(1, 1, w-2, h-2)); solve(img,mod_diff,result); }