diff --git a/src/seam-carving.cpp b/src/seam-carving.cpp index f893bef..0b22704 100644 --- a/src/seam-carving.cpp +++ b/src/seam-carving.cpp @@ -12,10 +12,11 @@ #include #include -// Global flag to silent verbose messages -bool silent; -bool test_energy; +// Global flags +bool silent = false; +bool test_energy = false; bool energy_recompute_all = false; +int max_step = 1; // Get index for any table indexed by [width*(i : height) + (j : width)], but a // : dim_long, b : dim_large @@ -81,7 +82,7 @@ std::vector energy_e1(std::vector source, int width, } std::vector optimal_seam(std::vector energy, int width, int height, - bool vertical, int max_step = 1) { + bool vertical) { /** Given the energy value, returns the optimal seam */ // dyn_energy is indexed by [dim_large*(i : dim_long) + (j : dim_large)] @@ -195,11 +196,11 @@ std::vector carving_step(const std::vector source_img, std::vector &output_img, std::vector &output_energy, int width, int height, int nbChannels, int nbColorChannels, - bool vertical, int max_step=1) { + bool vertical) { /** Carves an image and its energy by one seam, and recomputes the energy. Returns the optimal seam used */ std::vector opt_seam = - optimal_seam(source_energy, width, height, vertical,max_step=max_step); + optimal_seam(source_energy, width, height, vertical); remove_seam(source_img, output_img, width, height, nbChannels, vertical, opt_seam); @@ -241,8 +242,7 @@ std::vector carving_step(const std::vector source_img, } void seam_carving(unsigned char *source, int width, int height, int nbChannels, - const char *out_filename, int nbSeams, bool vertical, - bool test_energy = false, int max_step = 1) { + const char *out_filename, int nbSeams, bool vertical) { int nbColorChannels = nbChannels > 3 ? 3 : nbChannels; int curWidth = width; int curHeight = height; @@ -282,7 +282,7 @@ void seam_carving(unsigned char *source, int width, int height, int nbChannels, float max_energy = __FLT_MIN__; for (auto k = 0; k < width * height; k++) { - max_energy = fmax(max_energy, ini_energy[k]); + max_energy = std::max(max_energy, ini_energy[k]); } if (max_energy != 0) { for (auto k = 0; k < width * height; k++) { @@ -307,7 +307,7 @@ void seam_carving(unsigned char *source, int width, int height, int nbChannels, for (auto seam_index = 0; seam_index < nbSeams; seam_index++) { std::vector opt_seam = carving_step( source_img, source_energy, output_img, output_energy, curWidth, - curHeight, nbChannels, nbColorChannels, vertical, max_step=max_step); + curHeight, nbChannels, nbColorChannels, vertical); std::copy(output_img.begin(), output_img.end(), source_img.begin()); std::copy(output_energy.begin(), output_energy.end(), source_energy.begin()); @@ -348,22 +348,26 @@ void seam_carving(unsigned char *source, int width, int height, int nbChannels, int main(int argc, char **argv) { CLI::App app{"seam-carving"}; std::string sourceImage; + std::string maskImage = "mask.png"; + std::string outputImage = "output.png"; + int nbSeams = 1; + bool vertical = false; + app.add_option("-s,--source", sourceImage, "Source image") ->required() ->check(CLI::ExistingFile); - ; - std::string outputImage = "output.png"; app.add_option("-o,--output", outputImage, "Output image")->required(); - int nbSeams = 1; - app.add_option("-n,--nb-seams", nbSeams, "Number of seams"); - int max_step = 1; - app.add_option("--max-step", max_step, "Max width of step to find a seam"); - bool vertical = false; + app.add_option("-m,--mask", maskImage, "Source image") + ->check(CLI::ExistingFile); + + app.add_option("-n,--nb-seams", nbSeams, "Number of seams") + ->check(CLI::Number); + app.add_option("--max-step", max_step, "Max width of step to find a seam") + ->check(CLI::Number); + app.add_flag("--vertical", vertical, "Vertical carving (remove vertical seams)"); - silent = false; app.add_flag("--silent", silent, "No verbose messages"); - test_energy = false; app.add_flag("--test-energy", test_energy, "Don't resize image, just try the specified energy function"); app.add_flag("--energy-recompute-all", energy_recompute_all, @@ -376,8 +380,8 @@ int main(int argc, char **argv) { stbi_load(sourceImage.c_str(), &width, &height, &nbChannels, 0); nbSeams = std::min(nbSeams, width); - seam_carving(source, width, height, nbChannels, outputImage.c_str(), nbSeams, - vertical, test_energy = test_energy, max_step = max_step); + seam_carving(source, width, height, nbChannels, outputImage.c_str(), + nbSeams, vertical); stbi_image_free(source); exit(0);