72 {
73 cv::Mat image8UC3;
75
76 cv::Mat image32FC3(image8UC3.rows, 1, CV_32FC3);
77 for (int i = 0; i < image8UC3.rows; i++)
78 image32FC3.at<cv::Vec3f>(i, 0) = image8UC3.at<cv::Vec3b>(i, 0);
79
80 int best_cluster = 1;
81 double cur_score = 0, best_score = 100;
82 num_cluster = fmin(num_cluster, max_cluster);
83 if (num_cluster < 1) {
85 num_cluster = fmin(num_cluster, max_cluster);
86 cur_score = cv::kmeans(image32FC3, 1, this->
m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, cv::KMEANS_PP_CENTERS);
87 best_score = cur_score;
88
89 for (int cur_cluster = 2; cur_cluster < max_cluster + 1; cur_cluster++) {
90 cv::Mat centers32FC3;
91 cur_score = cv::kmeans(image32FC3, cur_cluster, this->
m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3,
92 cv::KMEANS_PP_CENTERS, centers32FC3);
93 if (this->
repeat_center(cur_cluster, centers32FC3, color_space))
94 break;
95 best_cluster = cur_score < best_score ? cur_cluster : best_cluster;
96 best_score = cur_score < best_score ? cur_score : best_score;
97 }
99 best_cluster = num_cluster;
100 else {
102 std::cout << "num of image color is " << best_cluster << ", less than custom number " << num_cluster << std::endl;
103 }
104
105 cv::Mat centers32FC3;
106 cv::kmeans(image32FC3, best_cluster, this->
m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, cv::KMEANS_PP_CENTERS,
107 centers32FC3);
109 for (int i = 0; i < best_cluster; i++) {
110 auto center = centers32FC3.row(i);
112 }
114
115 cluster_results.clear();
116 labels.clear();
117 for (int i = 0; i < flatten_image8UC3.rows; i++)
118 labels.emplace_back(this->m_flatten_labels.at<int>(i, 0));
119 for (int i = 0; i < best_cluster; i++) {
121 cluster_results.emplace_back(std::array<float, 4>{
center[0] / 255.f,
center[1] / 255.f,
center[2] / 255.f, 1.f});
122 }
123 }
void convert_color_space(const cv::Mat &ori_image, cv::Mat &image, int color_space, bool reverse=false)
Definition ObjColorUtils.hpp:207
bool repeat_center(int cur_cluster, const cv::Mat ¢ers32FC3, int color_space)
Definition ObjColorUtils.hpp:158
int compute_num_colors(const cv::Mat &image8UC3)
Definition ObjColorUtils.hpp:139
cv::Mat m_centers8UC3
Definition ObjColorUtils.hpp:19
bool more_than_request(const cv::Mat &image8UC3, int target_num)
Definition ObjColorUtils.hpp:125
cv::Mat m_flatten_labels
Definition ObjColorUtils.hpp:18
void center(ExPolygonsWithIds &e)
Definition Emboss.cpp:1382