METHOD 4 FAST!!
This commit is contained in:
parent
629c2e52c1
commit
41cbb90213
@ -20,7 +20,9 @@ namespace methods_private {
|
|||||||
cv::Mat const& t_ref,
|
cv::Mat const& t_ref,
|
||||||
std::vector<std::array<uchar, 3>> const& t_colors,
|
std::vector<std::array<uchar, 3>> const& t_colors,
|
||||||
double const diff,
|
double const diff,
|
||||||
bool const t_controlled_size);
|
bool const t_controlled_size,
|
||||||
|
int const t_init_iter,
|
||||||
|
int const t_iter);
|
||||||
void adjustSize(cv::Mat const& t_process_img,
|
void adjustSize(cv::Mat const& t_process_img,
|
||||||
cv::Point& t_top_left,
|
cv::Point& t_top_left,
|
||||||
int t_size);
|
int t_size);
|
||||||
@ -41,4 +43,6 @@ void method2(cv::Mat const&, cv::Mat&, int);
|
|||||||
|
|
||||||
void method3(cv::Mat const&, cv::Mat&, int);
|
void method3(cv::Mat const&, cv::Mat&, int);
|
||||||
|
|
||||||
|
void method4(cv::Mat const&, cv::Mat&, int);
|
||||||
|
|
||||||
#endif /* GENETIC_IMAGE_INCLUDE_GENIMG_METHODS_HH_ */
|
#endif /* GENETIC_IMAGE_INCLUDE_GENIMG_METHODS_HH_ */
|
||||||
|
@ -29,6 +29,10 @@ int main(int ac, char** av)
|
|||||||
method3(input_image, process_image, iterations);
|
method3(input_image, process_image, iterations);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 4: {
|
||||||
|
method4(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);
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <future>
|
||||||
|
#include <iostream>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
@ -201,3 +203,42 @@ void method3(cv::Mat const& t_reference, cv::Mat& t_output, int t_iterations)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void method4(cv::Mat const& 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) {
|
||||||
|
std::vector<std::future<std::optional<std::pair<cv::Mat, double>>>>
|
||||||
|
results{};
|
||||||
|
std::vector<std::pair<cv::Mat, double>> values{};
|
||||||
|
for (unsigned i = 0; i < thread_nbr; ++i) {
|
||||||
|
results.push_back(
|
||||||
|
std::async(std::launch::async, methods_private::createCandidate,
|
||||||
|
std::ref(t_output), std::ref(t_reference),
|
||||||
|
std::ref(colors), diff, true, init_iter, t_iterations));
|
||||||
|
}
|
||||||
|
for (auto& elem : results) {
|
||||||
|
if (auto res = elem.get(); res.has_value() && res->second < diff) {
|
||||||
|
values.push_back(*res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(values.size() > 0) {
|
||||||
|
unsigned best = 0;
|
||||||
|
for(unsigned i = 0; i < values.size(); ++i) {
|
||||||
|
if(values[i].second < values[best].second) {
|
||||||
|
best = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
diff = values[best].second;
|
||||||
|
values[best].first.copyTo(t_output);
|
||||||
|
--t_iterations;
|
||||||
|
spdlog::debug("iteration:{} diff:{}", t_iterations, diff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user