added third method
This commit is contained in:
parent
9b6d9e81b3
commit
517eb2bb91
@ -9,4 +9,6 @@ void method1(cv::Mat &t_reference, cv::Mat &t_output, int t_iterations);
|
|||||||
|
|
||||||
void method2(cv::Mat &t_reference, cv::Mat &t_output, int t_iterations);
|
void method2(cv::Mat &t_reference, cv::Mat &t_output, int t_iterations);
|
||||||
|
|
||||||
|
void method3(cv::Mat &t_reference, cv::Mat &t_output, int t_iterations);
|
||||||
|
|
||||||
#endif /* GENETIC_IMAGE_INCLUDE_GENIMG_METHODS_HH_ */
|
#endif /* GENETIC_IMAGE_INCLUDE_GENIMG_METHODS_HH_ */
|
||||||
|
BIN
report/output3.png
Normal file
BIN
report/output3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 20 KiB |
10
src/main.cc
10
src/main.cc
@ -1,14 +1,14 @@
|
|||||||
#include "common.hh"
|
#include "common.hh"
|
||||||
#include "methods.hh"
|
#include "methods.hh"
|
||||||
#include "parseargs.hh"
|
#include "parseargs.hh"
|
||||||
#include <iostream>
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
int main(int ac, char **av) {
|
int main(int ac, char **av) {
|
||||||
std::srand(std::time(nullptr));
|
std::srand(std::time(nullptr));
|
||||||
auto const [input_file, output_file, iterations, method,
|
auto const [input_file, output_file, iterations, method, verbose] =
|
||||||
verbose] = parse_args(ac, av);
|
parse_args(ac, av);
|
||||||
spdlog::set_level(verbose ? spdlog::level::debug : spdlog::level::info);
|
spdlog::set_level(verbose ? spdlog::level::debug : spdlog::level::info);
|
||||||
spdlog::debug("Input file:\t{}", input_file.native());
|
spdlog::debug("Input file:\t{}", input_file.native());
|
||||||
spdlog::debug("Output file:\t{}", output_file.native());
|
spdlog::debug("Output file:\t{}", output_file.native());
|
||||||
@ -24,6 +24,10 @@ int main(int ac, char **av) {
|
|||||||
method2(input_image, process_image, iterations);
|
method2(input_image, process_image, iterations);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 3: {
|
||||||
|
method3(input_image, process_image, iterations);
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
spdlog::error("Requested method {} is not implemented.");
|
spdlog::error("Requested method {} is not implemented.");
|
||||||
std::exit(-1);
|
std::exit(-1);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include <thread>
|
#include <thread>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
const auto thread_nbr = std::thread::hardware_concurrency();
|
auto const thread_nbr = std::thread::hardware_concurrency();
|
||||||
std::mutex numbers_mutex;
|
std::mutex numbers_mutex;
|
||||||
|
|
||||||
using randint = std::uniform_int_distribution<>;
|
using randint = std::uniform_int_distribution<>;
|
||||||
@ -106,7 +106,6 @@ void method1(cv::Mat &t_reference, cv::Mat &t_output, int t_iterations) {
|
|||||||
void method2(cv::Mat &t_reference, cv::Mat &t_output, int t_iterations) {
|
void method2(cv::Mat &t_reference, cv::Mat &t_output, int t_iterations) {
|
||||||
auto diff = euclidian_distance(t_reference, t_output);
|
auto diff = euclidian_distance(t_reference, t_output);
|
||||||
spdlog::debug("Beginning method2, initial difference: {}", diff);
|
spdlog::debug("Beginning method2, initial difference: {}", diff);
|
||||||
|
|
||||||
spdlog::debug("Running {} threads.", thread_nbr);
|
spdlog::debug("Running {} threads.", thread_nbr);
|
||||||
auto const colors = methods_private::getColorSet(t_reference);
|
auto const colors = methods_private::getColorSet(t_reference);
|
||||||
spdlog::debug("{} colors detected.", colors.size());
|
spdlog::debug("{} colors detected.", colors.size());
|
||||||
@ -128,3 +127,38 @@ void method2(cv::Mat &t_reference, cv::Mat &t_output, int t_iterations) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void method3(cv::Mat &t_reference, cv::Mat &t_output, int t_iterations) {
|
||||||
|
auto const init_iter = t_iterations;
|
||||||
|
auto diff = euclidian_distance(t_reference, t_output);
|
||||||
|
spdlog::debug("Beginning method2, initial difference: {}", diff);
|
||||||
|
spdlog::debug("Running {} threads.", thread_nbr);
|
||||||
|
auto const colors = methods_private::getColorSet(t_reference);
|
||||||
|
spdlog::debug("{} colors detected.", colors.size());
|
||||||
|
|
||||||
|
while (t_iterations > 0) {
|
||||||
|
auto temp_image = t_output.clone();
|
||||||
|
int const rand_x = rand() % temp_image.size().width;
|
||||||
|
int const rand_y = rand() % temp_image.size().height;
|
||||||
|
float const coef =
|
||||||
|
static_cast<float>(t_iterations) / static_cast<float>(init_iter);
|
||||||
|
int const min_size = static_cast<int>(
|
||||||
|
(static_cast<float>(
|
||||||
|
std::min(t_reference.size().width, t_reference.size().height)) /
|
||||||
|
2.0f) *
|
||||||
|
coef);
|
||||||
|
int const max_size = min_size * 2 + 1;
|
||||||
|
int const size = rand() % (max_size - min_size) + min_size;
|
||||||
|
|
||||||
|
methods_private::newSquare2(temp_image, cv::Point{rand_x, rand_y}, size,
|
||||||
|
colors[rand() % colors.size()]);
|
||||||
|
if (auto new_diff = euclidian_distance(t_reference, temp_image);
|
||||||
|
new_diff < diff) {
|
||||||
|
diff = new_diff;
|
||||||
|
temp_image.copyTo(t_output);
|
||||||
|
spdlog::debug("iteration:{} diff:{} size: {} coef:{} min:{} max:{}",
|
||||||
|
t_iterations, diff, size, coef, min_size, max_size);
|
||||||
|
--t_iterations;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user