parent
50c19423f9
commit
7ab43585aa
1 changed files with 0 additions and 243 deletions
@ -1,243 +0,0 @@ |
|||||||
/*
|
|
||||||
* cloning.cpp |
|
||||||
* |
|
||||||
* Author: |
|
||||||
* Siddharth Kherada <siddharthkherada27[at]gmail[dot]com> |
|
||||||
* |
|
||||||
* This tutorial demonstrates how to use OpenCV seamless cloning |
|
||||||
* module without GUI. |
|
||||||
* |
|
||||||
* 1- Normal Cloning |
|
||||||
* 2- Mixed Cloning |
|
||||||
* 3- Monochrome Transfer |
|
||||||
* 4- Color Change |
|
||||||
* 5- Illumination change |
|
||||||
* 6- Texture Flattening |
|
||||||
|
|
||||||
* The program takes as input a source and a destination image (for 1-3 methods) |
|
||||||
* and ouputs the cloned image. |
|
||||||
*/ |
|
||||||
|
|
||||||
#include "opencv2/photo.hpp" |
|
||||||
#include "opencv2/imgproc.hpp" |
|
||||||
#include "opencv2/highgui.hpp" |
|
||||||
#include "opencv2/core.hpp" |
|
||||||
#include <iostream> |
|
||||||
#include <stdlib.h> |
|
||||||
|
|
||||||
using namespace std; |
|
||||||
using namespace cv; |
|
||||||
|
|
||||||
int main(int argc, char **argv) |
|
||||||
{ |
|
||||||
cout << endl; |
|
||||||
cout << "Cloning Module" << endl; |
|
||||||
cout << "---------------" << endl; |
|
||||||
cout << "Options: " << endl; |
|
||||||
cout << endl; |
|
||||||
cout << "1) Normal Cloning " << endl; |
|
||||||
cout << "2) Mixed Cloning " << endl; |
|
||||||
cout << "3) Monochrome Transfer " << endl; |
|
||||||
cout << "4) Local Color Change " << endl; |
|
||||||
cout << "5) Local Illumination Change " << endl; |
|
||||||
cout << "6) Texture Flattening " << endl; |
|
||||||
cout << endl; |
|
||||||
cout << "Press number 1-6 to choose from above techniques: "; |
|
||||||
int num; |
|
||||||
cin >> num; |
|
||||||
cout << endl; |
|
||||||
|
|
||||||
if(num == 1) |
|
||||||
{ |
|
||||||
string folder = "cloning/Normal_Cloning/"; |
|
||||||
string original_path1 = folder + "source1.png"; |
|
||||||
string original_path2 = folder + "destination1.png"; |
|
||||||
string original_path3 = folder + "mask.png"; |
|
||||||
|
|
||||||
Mat source = imread(original_path1, IMREAD_COLOR); |
|
||||||
Mat destination = imread(original_path2, IMREAD_COLOR); |
|
||||||
Mat mask = imread(original_path3, IMREAD_COLOR); |
|
||||||
|
|
||||||
if(source.empty()) |
|
||||||
{ |
|
||||||
cout << "Could not load source image " << original_path1 << endl; |
|
||||||
exit(0); |
|
||||||
} |
|
||||||
if(destination.empty())
|
|
||||||
{ |
|
||||||
cout << "Could not load destination image " << original_path2 << endl; |
|
||||||
exit(0); |
|
||||||
} |
|
||||||
if(mask.empty()) |
|
||||||
{ |
|
||||||
cout << "Could not load mask image " << original_path3 << endl; |
|
||||||
exit(0); |
|
||||||
} |
|
||||||
|
|
||||||
Mat result; |
|
||||||
Point p; |
|
||||||
p.x = 400; |
|
||||||
p.y = 100; |
|
||||||
|
|
||||||
seamlessClone(source, destination, mask, p, result, 1); |
|
||||||
|
|
||||||
imshow("Output",result); |
|
||||||
imwrite(folder + "cloned.png", result); |
|
||||||
} |
|
||||||
else if(num == 2) |
|
||||||
{
|
|
||||||
string folder = "cloning/Mixed_Cloning/"; |
|
||||||
string original_path1 = folder + "source1.png"; |
|
||||||
string original_path2 = folder + "destination1.png"; |
|
||||||
string original_path3 = folder + "mask.png"; |
|
||||||
|
|
||||||
Mat source = imread(original_path1, IMREAD_COLOR); |
|
||||||
Mat destination = imread(original_path2, IMREAD_COLOR); |
|
||||||
Mat mask = imread(original_path3, IMREAD_COLOR); |
|
||||||
|
|
||||||
if(source.empty())
|
|
||||||
{ |
|
||||||
cout << "Could not load source image " << original_path1 << endl; |
|
||||||
exit(0); |
|
||||||
} |
|
||||||
if(destination.empty()) |
|
||||||
{ |
|
||||||
cout << "Could not load destination image " << original_path2 << endl; |
|
||||||
exit(0); |
|
||||||
} |
|
||||||
if(mask.empty())
|
|
||||||
{ |
|
||||||
cout << "Could not load mask image " << original_path3 << endl; |
|
||||||
exit(0); |
|
||||||
} |
|
||||||
|
|
||||||
Mat result; |
|
||||||
Point p; |
|
||||||
p.x = destination.size().width/2; |
|
||||||
p.y = destination.size().height/2; |
|
||||||
|
|
||||||
seamlessClone(source, destination, mask, p, result, 2); |
|
||||||
|
|
||||||
imshow("Output",result); |
|
||||||
imwrite(folder + "cloned.png", result); |
|
||||||
} |
|
||||||
else if(num == 3) |
|
||||||
{ |
|
||||||
string folder = "cloning/Monochrome_Transfer/"; |
|
||||||
string original_path1 = folder + "source1.png"; |
|
||||||
string original_path2 = folder + "destination1.png"; |
|
||||||
string original_path3 = folder + "mask.png"; |
|
||||||
|
|
||||||
Mat source = imread(original_path1, IMREAD_COLOR); |
|
||||||
Mat destination = imread(original_path2, IMREAD_COLOR); |
|
||||||
Mat mask = imread(original_path3, IMREAD_COLOR); |
|
||||||
|
|
||||||
if(source.empty()) |
|
||||||
{ |
|
||||||
cout << "Could not load source image " << original_path1 << endl; |
|
||||||
exit(0); |
|
||||||
} |
|
||||||
if(destination.empty())
|
|
||||||
{ |
|
||||||
cout << "Could not load destination image " << original_path2 << endl; |
|
||||||
exit(0); |
|
||||||
} |
|
||||||
if(mask.empty())
|
|
||||||
{ |
|
||||||
cout << "Could not load mask image " << original_path3 << endl; |
|
||||||
exit(0); |
|
||||||
} |
|
||||||
|
|
||||||
Mat result; |
|
||||||
Point p; |
|
||||||
p.x = destination.size().width/2; |
|
||||||
p.y = destination.size().height/2; |
|
||||||
|
|
||||||
seamlessClone(source, destination, mask, p, result, 3); |
|
||||||
|
|
||||||
imshow("Output",result); |
|
||||||
imwrite(folder + "cloned.png", result); |
|
||||||
} |
|
||||||
else if(num == 4) |
|
||||||
{ |
|
||||||
string folder = "cloning/Color_Change/"; |
|
||||||
string original_path1 = folder + "source1.png"; |
|
||||||
string original_path2 = folder + "mask.png"; |
|
||||||
|
|
||||||
Mat source = imread(original_path1, IMREAD_COLOR); |
|
||||||
Mat mask = imread(original_path2, IMREAD_COLOR); |
|
||||||
|
|
||||||
if(source.empty()) |
|
||||||
{ |
|
||||||
cout << "Could not load source image " << original_path1 << endl; |
|
||||||
exit(0); |
|
||||||
} |
|
||||||
if(mask.empty()) |
|
||||||
{ |
|
||||||
cout << "Could not load mask image " << original_path2 << endl; |
|
||||||
exit(0); |
|
||||||
} |
|
||||||
|
|
||||||
Mat result; |
|
||||||
|
|
||||||
colorChange(source, mask, result, 1.5, .5, .5); |
|
||||||
|
|
||||||
imshow("Output",result); |
|
||||||
imwrite(folder + "cloned.png", result); |
|
||||||
} |
|
||||||
else if(num == 5) |
|
||||||
{ |
|
||||||
string folder = "cloning/Illumination_Change/"; |
|
||||||
string original_path1 = folder + "source1.png"; |
|
||||||
string original_path2 = folder + "mask.png"; |
|
||||||
|
|
||||||
Mat source = imread(original_path1, IMREAD_COLOR); |
|
||||||
Mat mask = imread(original_path2, IMREAD_COLOR); |
|
||||||
|
|
||||||
if(source.empty())
|
|
||||||
{ |
|
||||||
cout << "Could not load source image " << original_path1 << endl; |
|
||||||
exit(0); |
|
||||||
} |
|
||||||
if(mask.empty()) |
|
||||||
{ |
|
||||||
cout << "Could not load mask image " << original_path2 << endl; |
|
||||||
exit(0); |
|
||||||
} |
|
||||||
|
|
||||||
Mat result; |
|
||||||
|
|
||||||
illuminationChange(source, mask, result, .2, .4); |
|
||||||
|
|
||||||
imshow("Output",result); |
|
||||||
imwrite(folder + "cloned.png", result); |
|
||||||
} |
|
||||||
else if(num == 6) |
|
||||||
{ |
|
||||||
string folder = "cloning/Texture_Flattening/"; |
|
||||||
string original_path1 = folder + "source1.png"; |
|
||||||
string original_path2 = folder + "mask.png"; |
|
||||||
|
|
||||||
Mat source = imread(original_path1, IMREAD_COLOR); |
|
||||||
Mat mask = imread(original_path2, IMREAD_COLOR); |
|
||||||
|
|
||||||
if(source.empty()) |
|
||||||
{ |
|
||||||
cout << "Could not load source image " << original_path1 << endl; |
|
||||||
exit(0); |
|
||||||
} |
|
||||||
if(mask.empty()) |
|
||||||
{ |
|
||||||
cout << "Could not load mask image " << original_path2 << endl; |
|
||||||
exit(0); |
|
||||||
} |
|
||||||
|
|
||||||
Mat result; |
|
||||||
|
|
||||||
textureFlattening(source, mask, result, 30, 45, 3); |
|
||||||
|
|
||||||
imshow("Output",result); |
|
||||||
imwrite(folder + "cloned.png", result); |
|
||||||
} |
|
||||||
waitKey(0); |
|
||||||
} |
|
Loading…
Reference in new issue