Browse Source

修改成最大的前2个数字

ManualUV
hesuicong 7 days ago
parent
commit
59f1f7e873
  1. 47
      libs/MVS/SceneTexture.cpp

47
libs/MVS/SceneTexture.cpp

@ -17905,7 +17905,7 @@ bool MeshTexture::SelectBestViewsForVirtualFaces(
DEBUG_EXTRA("Selecting best views for %zu virtual faces", virtualFaceMap.size()); DEBUG_EXTRA("Selecting best views for %zu virtual faces", virtualFaceMap.size());
// ---------- 准备禁用视图列表(禁用最后一个单独数字 = 最大值的【所有】相机) ---------- // ---------- 准备禁用视图列表(禁用最后单个数字最大的【两个数值】的所有相机) ----------
std::unordered_set<IIndex> disabledViews; std::unordered_set<IIndex> disabledViews;
{ {
struct ViewDigitPair { struct ViewDigitPair {
@ -17913,11 +17913,11 @@ bool MeshTexture::SelectBestViewsForVirtualFaces(
int digit; int digit;
}; };
std::vector<ViewDigitPair> viewDigits; std::vector<ViewDigitPair> viewDigits;
for (IIndex idx = 0; idx < (IIndex)images.size(); ++idx) { for (IIndex idx = 0; idx < (IIndex)images.size(); ++idx) {
const Image& img = images[idx]; const Image& img = images[idx];
if (!img.IsValid()) continue; if (!img.IsValid()) continue;
// 提取文件名(不含路径和扩展名) // 提取文件名(不含路径和扩展名)
std::string path = img.name; std::string path = img.name;
size_t lastSlash = path.find_last_of("/\\"); size_t lastSlash = path.find_last_of("/\\");
@ -17925,7 +17925,7 @@ bool MeshTexture::SelectBestViewsForVirtualFaces(
size_t lastDot = path.find_last_of('.'); size_t lastDot = path.find_last_of('.');
if (lastDot == std::string::npos) lastDot = path.size(); if (lastDot == std::string::npos) lastDot = path.size();
std::string strName = path.substr(start, lastDot - start); std::string strName = path.substr(start, lastDot - start);
// 提取最后一个 _ 前面的最后一个数字字符 // 提取最后一个 _ 前面的最后一个数字字符
int digit = -1; int digit = -1;
size_t lastUnderscore = strName.find_last_of('_'); size_t lastUnderscore = strName.find_last_of('_');
@ -17938,28 +17938,43 @@ bool MeshTexture::SelectBestViewsForVirtualFaces(
if (pos == 0) break; if (pos == 0) break;
} }
} }
if (digit >= 0) { if (digit >= 0) {
viewDigits.push_back({idx, digit}); viewDigits.push_back({idx, digit});
} }
} }
// ★ 找到最大的 digit 值 // ★ 找出最大的两个【不同】digit值
int maxDigit = -1; std::set<int> uniqueDigits;
for (const auto& vd : viewDigits) { for (const auto& vd : viewDigits) {
if (vd.digit > maxDigit) maxDigit = vd.digit; uniqueDigits.insert(vd.digit);
} }
// ★ 禁用【所有】digit == maxDigit 的视图(不再只禁前 N 个) std::vector<int> topDigits;
auto it = uniqueDigits.rbegin();
// 取最大的第一个
if (it != uniqueDigits.rend()) {
topDigits.push_back(*it);
++it;
}
// 取最大的第二个(次大)
if (it != uniqueDigits.rend()) {
topDigits.push_back(*it);
++it;
}
// ★ 禁用所有 digit 等于这两个最大值的视图
for (const auto& vd : viewDigits) { for (const auto& vd : viewDigits) {
if (vd.digit == maxDigit) { if (std::find(topDigits.begin(), topDigits.end(), vd.digit) != topDigits.end()) {
disabledViews.insert(vd.idx); disabledViews.insert(vd.idx);
DEBUG_EXTRA("[DisabledView] idx=%d name=%s digit=%d (maxDigit=%d)", DEBUG_EXTRA("[DisabledView] idx=%d name=%s digit=%d (topDigits=[%d,%d])",
vd.idx, images[vd.idx].name.c_str(), vd.digit, maxDigit); vd.idx, images[vd.idx].name.c_str(), vd.digit,
topDigits[0], topDigits.size() > 1 ? topDigits[1] : -1);
} }
} }
DEBUG_EXTRA("[DisabledView] %zu views disabled (all with digit=%d)", DEBUG_EXTRA("[DisabledView] %zu views disabled (all with digit in [%d,%d])",
disabledViews.size(), maxDigit); disabledViews.size(),
topDigits[0], topDigits.size() > 1 ? topDigits[1] : -1);
} }
// ---------- 初始化 ---------- // ---------- 初始化 ----------

Loading…
Cancel
Save