FIX:fix bugs of algo and read quad in obj file
Jira: STUDIO-6805 Change-Id: I6c33e8197225f27dccdfa0681e64d76d1df14f61
This commit is contained in:
parent
037f31e12d
commit
b6154d4014
|
@ -165,12 +165,7 @@ bool load_obj(const char *path, TriangleMesh *meshptr, ObjInfo& obj_info, std::s
|
|||
} else {
|
||||
for (size_t k = 0; k < data.usemtls.size(); k++) {
|
||||
auto mtl = data.usemtls[k];
|
||||
if (mtl.vertexIdxEnd == -1 && face_index >= (mtl.vertexIdxFirst / ONE_FACE_SIZE)) {
|
||||
set_face_color(face_index, data.usemtls[k].name);
|
||||
break;
|
||||
} else if (mtl.vertexIdxEnd != -1 &&
|
||||
face_index >= (mtl.vertexIdxFirst / ONE_FACE_SIZE)
|
||||
&& face_index < (mtl.vertexIdxEnd / ONE_FACE_SIZE)) {
|
||||
if (face_index >= mtl.face_start && face_index <= mtl.face_end) {
|
||||
set_face_color(face_index, data.usemtls[k].name);
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -251,6 +251,24 @@ static bool obj_parseline(const char *line, ObjData &data)
|
|||
data.vertices.push_back(vertex);
|
||||
EATWS();
|
||||
}
|
||||
if (data.usemtls.size() > 0) {
|
||||
data.usemtls.back().vertexIdxEnd = (int) data.vertices.size();
|
||||
}
|
||||
if (data.usemtls.size() > 0) {
|
||||
int face_index_count = 0;
|
||||
for (int i = data.vertices.size() - 1; i >= 0; i--) {
|
||||
if (data.vertices[i].coordIdx == -1) {
|
||||
break;
|
||||
}
|
||||
face_index_count++;
|
||||
}
|
||||
if (face_index_count == 3) {//tri
|
||||
data.usemtls.back().face_end++;
|
||||
} else if (face_index_count == 4) {//quad
|
||||
data.usemtls.back().face_end++;
|
||||
data.usemtls.back().face_end++;
|
||||
}
|
||||
}
|
||||
vertex.coordIdx = -1;
|
||||
vertex.normalIdx = -1;
|
||||
vertex.textureCoordIdx = -1;
|
||||
|
@ -289,6 +307,16 @@ static bool obj_parseline(const char *line, ObjData &data)
|
|||
usemtl.vertexIdxFirst = (int)data.vertices.size();
|
||||
usemtl.name = line;
|
||||
data.usemtls.push_back(usemtl);
|
||||
if (data.usemtls.size() == 1) {
|
||||
data.usemtls.back().face_start = 0;
|
||||
}
|
||||
else {//>=2
|
||||
auto count = data.usemtls.size();
|
||||
auto& last_usemtl = data.usemtls[count-1];
|
||||
auto& last_last_usemtl = data.usemtls[count - 2];
|
||||
last_usemtl.face_start = last_last_usemtl.face_end + 1;
|
||||
}
|
||||
data.usemtls.back().face_end = data.usemtls.back().face_start - 1;
|
||||
break;
|
||||
}
|
||||
case 'o':
|
||||
|
|
|
@ -27,6 +27,8 @@ struct ObjUseMtl
|
|||
{
|
||||
int vertexIdxFirst;
|
||||
int vertexIdxEnd{-1};
|
||||
int face_start;
|
||||
int face_end{-1};
|
||||
std::string name;
|
||||
};
|
||||
|
||||
|
|
|
@ -57,16 +57,19 @@ public:
|
|||
convert_color_space(flatten_image8UC3, image8UC3, color_space);
|
||||
|
||||
cv::Mat image32FC3(image8UC3.rows, 1, CV_32FC3);
|
||||
for (int i = 0; i < image8UC3.rows; i++) image32FC3.at<cv::Vec3f>(i, 0) = image8UC3.at<cv::Vec3b>(i, 0);
|
||||
for (int i = 0; i < image8UC3.rows; i++)
|
||||
image32FC3.at<cv::Vec3f>(i, 0) = image8UC3.at<cv::Vec3b>(i, 0);
|
||||
|
||||
int best_cluster = 1, cur_score = 0, best_score = 100;
|
||||
int best_cluster = 1;
|
||||
double cur_score, best_score = 100;
|
||||
int max_cluster = ori_colors.size();
|
||||
num_cluster = fmin(num_cluster, max_cluster);
|
||||
if (num_cluster < 1) {
|
||||
cur_score = kmeans(image32FC3, 1, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, cv::KMEANS_PP_CENTERS);
|
||||
best_score = cur_score;
|
||||
for (int cur_cluster = 2; cur_cluster < 16; cur_cluster++) {
|
||||
if (cur_cluster > max_cluster) break;
|
||||
if (cur_cluster > max_cluster)
|
||||
break;
|
||||
cur_score = kmeans(image32FC3, cur_cluster, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3,
|
||||
cv::KMEANS_PP_CENTERS);
|
||||
best_cluster = cur_score < best_score ? cur_cluster : best_cluster;
|
||||
|
@ -79,7 +82,8 @@ public:
|
|||
kmeans(image32FC3, best_cluster, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, cv::KMEANS_PP_CENTERS,
|
||||
centers32FC3);
|
||||
this->m_centers8UC3 = cv::Mat(best_cluster, 1, CV_8UC3);
|
||||
for (int i = 0; i < best_cluster; i++) this->m_centers8UC3.at<cv::Vec3b>(i) = centers32FC3.at<cv::Vec3f>(i);
|
||||
for (int i = 0; i < best_cluster; i++)
|
||||
this->m_centers8UC3.at<cv::Vec3b>(i) = centers32FC3.at<cv::Vec3f>(i);
|
||||
|
||||
convert_color_space(this->m_centers8UC3, this->m_centers8UC3, color_space, true);
|
||||
|
||||
|
|
Loading…
Reference in New Issue