Browse Source

最佳视图选择逻辑优化

master
hesuicong 2 weeks ago
parent
commit
9ab39219b1
  1. 33
      libs/MVS/SceneTexture.cpp

33
libs/MVS/SceneTexture.cpp

@ -5714,7 +5714,8 @@ bool MeshTexture::CreateVirtualFaces64(FaceDataViewArr& facesDatas, FaceDataView
} }
// 如果夹角小于45度(cos(45°) ≈ 0.7071),则计入覆盖 // 如果夹角小于45度(cos(45°) ≈ 0.7071),则计入覆盖
float fAngleThreshold = 0.7071; // 0.7071f float fAngleThreshold1 = 0.671; // 0.7071f
float fAngleThreshold2 = 0.8071; // 0.7071f
// 初始化数据结构 // 初始化数据结构
std::vector<bool> processedFaces(faces.size(), false); std::vector<bool> processedFaces(faces.size(), false);
@ -5796,10 +5797,15 @@ bool MeshTexture::CreateVirtualFaces64(FaceDataViewArr& facesDatas, FaceDataView
const Normal& faceNormal = scene.mesh.faceNormals[idxFace]; const Normal& faceNormal = scene.mesh.faceNormals[idxFace];
const float cosAngle = cameraForward.dot(Point3f(faceNormal.x, faceNormal.y, faceNormal.z)); const float cosAngle = cameraForward.dot(Point3f(faceNormal.x, faceNormal.y, faceNormal.z));
if (cosAngle > fAngleThreshold) if (cosAngle > fAngleThreshold2)
{ // 45度阈值 {
coverageCount++; coverageCount++;
// viewData.faceToIndexMap[idxFace] = idxFace;
}
if (cosAngle > fAngleThreshold1)
{
viewData.faceToIndexMap[idxFace] = idxFace; viewData.faceToIndexMap[idxFace] = idxFace;
} }
} }
@ -6006,13 +6012,14 @@ bool MeshTexture::CreateVirtualFaces64(FaceDataViewArr& facesDatas, FaceDataView
IIndexArr filteredCams; IIndexArr filteredCams;
int nHitCount = 0; int nHit = 0;
int nMaxHit = 400; int nHitMax = 1;
int nMaxViewCoverage = 0; int nViewCoverage = 0;
int nViewCoverageMax = -1;
for (const auto& [viewIdx, coverageCount] : viewCoverage) { for (const auto& [viewIdx, coverageCount] : viewCoverage) {
if (nMaxViewCoverage>12) if (nViewCoverage>=nViewCoverageMax)
if (nHitCount>nMaxHit) // if (nHit>nHitMax)
break; break;
auto it_view = mapViewCoverageData.find(viewIdx); auto it_view = mapViewCoverageData.find(viewIdx);
if (it_view == mapViewCoverageData.end()) { if (it_view == mapViewCoverageData.end()) {
@ -6047,14 +6054,14 @@ bool MeshTexture::CreateVirtualFaces64(FaceDataViewArr& facesDatas, FaceDataView
if (!scene.is_face_delete_edge2(strName, virtualFaceCenterFaceID)) if (!scene.is_face_delete_edge2(strName, virtualFaceCenterFaceID))
{ {
filteredCams.push_back(viewIdx); filteredCams.push_back(viewIdx);
++nHitCount; ++nHit;
if (nHitCount>nMaxHit) // if (nHit>=nHitMax)
break; // break;
} }
} }
++nMaxViewCoverage; ++nViewCoverage;
} }
if (filteredCams.empty()) { if (filteredCams.empty()) {

Loading…
Cancel
Save