1 /* 2 * cloning_demo.cpp 3 * 4 * Author: 5 * Siddharth Kherada <siddharthkherada27[at]gmail[dot]com> 6 * 7 * This tutorial demonstrates how to use OpenCV seamless cloning 8 * module without GUI. 9 * 10 * 1- Normal Cloning 11 * 2- Mixed Cloning 12 * 3- Monochrome Transfer 13 * 4- Color Change 14 * 5- Illumination change 15 * 6- Texture Flattening 16 17 * The program takes as input a source and a destination image (for 1-3 methods) 18 * and ouputs the cloned image. 19 * 20 * Download test images from opencv_extra folder @github. 21 * 22 */ 23 24 #include "opencv2/photo.hpp" 25 #include "opencv2/imgproc.hpp" 26 #include "opencv2/imgcodecs.hpp" 27 #include "opencv2/highgui.hpp" 28 #include "opencv2/core.hpp" 29 #include <iostream> 30 #include <stdlib.h> 31 32 using namespace std; 33 using namespace cv; 34 35 int main() 36 { 37 cout << endl; 38 cout << "Cloning Module" << endl; 39 cout << "---------------" << endl; 40 cout << "Options: " << endl; 41 cout << endl; 42 cout << "1) Normal Cloning " << endl; 43 cout << "2) Mixed Cloning " << endl; 44 cout << "3) Monochrome Transfer " << endl; 45 cout << "4) Local Color Change " << endl; 46 cout << "5) Local Illumination Change " << endl; 47 cout << "6) Texture Flattening " << endl; 48 cout << endl; 49 cout << "Press number 1-6 to choose from above techniques: "; 50 int num = 1; 51 cin >> num; 52 cout << endl; 53 54 if(num == 1) 55 { 56 string folder = "cloning/Normal_Cloning/"; 57 string original_path1 = folder + "source1.png"; 58 string original_path2 = folder + "destination1.png"; 59 string original_path3 = folder + "mask.png"; 60 61 Mat source = imread(original_path1, IMREAD_COLOR); 62 Mat destination = imread(original_path2, IMREAD_COLOR); 63 Mat mask = imread(original_path3, IMREAD_COLOR); 64 65 if(source.empty()) 66 { 67 cout << "Could not load source image " << original_path1 << endl; 68 exit(0); 69 } 70 if(destination.empty()) 71 { 72 cout << "Could not load destination image " << original_path2 << endl; 73 exit(0); 74 } 75 if(mask.empty()) 76 { 77 cout << "Could not load mask image " << original_path3 << endl; 78 exit(0); 79 } 80 81 Mat result; 82 Point p; 83 p.x = 400; 84 p.y = 100; 85 86 seamlessClone(source, destination, mask, p, result, 1); 87 88 imshow("Output",result); 89 imwrite(folder + "cloned.png", result); 90 } 91 else if(num == 2) 92 { 93 string folder = "cloning/Mixed_Cloning/"; 94 string original_path1 = folder + "source1.png"; 95 string original_path2 = folder + "destination1.png"; 96 string original_path3 = folder + "mask.png"; 97 98 Mat source = imread(original_path1, IMREAD_COLOR); 99 Mat destination = imread(original_path2, IMREAD_COLOR); 100 Mat mask = imread(original_path3, IMREAD_COLOR); 101 102 if(source.empty()) 103 { 104 cout << "Could not load source image " << original_path1 << endl; 105 exit(0); 106 } 107 if(destination.empty()) 108 { 109 cout << "Could not load destination image " << original_path2 << endl; 110 exit(0); 111 } 112 if(mask.empty()) 113 { 114 cout << "Could not load mask image " << original_path3 << endl; 115 exit(0); 116 } 117 118 Mat result; 119 Point p; 120 p.x = destination.size().width/2; 121 p.y = destination.size().height/2; 122 123 seamlessClone(source, destination, mask, p, result, 2); 124 125 imshow("Output",result); 126 imwrite(folder + "cloned.png", result); 127 } 128 else if(num == 3) 129 { 130 string folder = "cloning/Monochrome_Transfer/"; 131 string original_path1 = folder + "source1.png"; 132 string original_path2 = folder + "destination1.png"; 133 string original_path3 = folder + "mask.png"; 134 135 Mat source = imread(original_path1, IMREAD_COLOR); 136 Mat destination = imread(original_path2, IMREAD_COLOR); 137 Mat mask = imread(original_path3, IMREAD_COLOR); 138 139 if(source.empty()) 140 { 141 cout << "Could not load source image " << original_path1 << endl; 142 exit(0); 143 } 144 if(destination.empty()) 145 { 146 cout << "Could not load destination image " << original_path2 << endl; 147 exit(0); 148 } 149 if(mask.empty()) 150 { 151 cout << "Could not load mask image " << original_path3 << endl; 152 exit(0); 153 } 154 155 Mat result; 156 Point p; 157 p.x = destination.size().width/2; 158 p.y = destination.size().height/2; 159 160 seamlessClone(source, destination, mask, p, result, 3); 161 162 imshow("Output",result); 163 imwrite(folder + "cloned.png", result); 164 } 165 else if(num == 4) 166 { 167 string folder = "cloning/Color_Change/"; 168 string original_path1 = folder + "source1.png"; 169 string original_path2 = folder + "mask.png"; 170 171 Mat source = imread(original_path1, IMREAD_COLOR); 172 Mat mask = imread(original_path2, IMREAD_COLOR); 173 174 if(source.empty()) 175 { 176 cout << "Could not load source image " << original_path1 << endl; 177 exit(0); 178 } 179 if(mask.empty()) 180 { 181 cout << "Could not load mask image " << original_path2 << endl; 182 exit(0); 183 } 184 185 Mat result; 186 187 colorChange(source, mask, result, 1.5, .5, .5); 188 189 imshow("Output",result); 190 imwrite(folder + "cloned.png", result); 191 } 192 else if(num == 5) 193 { 194 string folder = "cloning/Illumination_Change/"; 195 string original_path1 = folder + "source1.png"; 196 string original_path2 = folder + "mask.png"; 197 198 Mat source = imread(original_path1, IMREAD_COLOR); 199 Mat mask = imread(original_path2, IMREAD_COLOR); 200 201 if(source.empty()) 202 { 203 cout << "Could not load source image " << original_path1 << endl; 204 exit(0); 205 } 206 if(mask.empty()) 207 { 208 cout << "Could not load mask image " << original_path2 << endl; 209 exit(0); 210 } 211 212 Mat result; 213 214 illuminationChange(source, mask, result, 0.2f, 0.4f); 215 216 imshow("Output",result); 217 imwrite(folder + "cloned.png", result); 218 } 219 else if(num == 6) 220 { 221 string folder = "cloning/Texture_Flattening/"; 222 string original_path1 = folder + "source1.png"; 223 string original_path2 = folder + "mask.png"; 224 225 Mat source = imread(original_path1, IMREAD_COLOR); 226 Mat mask = imread(original_path2, IMREAD_COLOR); 227 228 if(source.empty()) 229 { 230 cout << "Could not load source image " << original_path1 << endl; 231 exit(0); 232 } 233 if(mask.empty()) 234 { 235 cout << "Could not load mask image " << original_path2 << endl; 236 exit(0); 237 } 238 239 Mat result; 240 241 textureFlattening(source, mask, result, 30, 45, 3); 242 243 imshow("Output",result); 244 imwrite(folder + "cloned.png", result); 245 } 246 waitKey(0); 247 } 248