diff --git a/libs/MVS/SceneTexture.cpp b/libs/MVS/SceneTexture.cpp index ffc7346..2b1ee24 100644 --- a/libs/MVS/SceneTexture.cpp +++ b/libs/MVS/SceneTexture.cpp @@ -800,6 +800,8 @@ bool MeshTexture::ListCameraFaces(FaceDataViewArr& facesDatas, float fOutlierThr // scene.mesh.invalidFaces.clear(); } + std::vector faceViewCount(faces.size(), 0); + // extract array of faces viewed by each image IIndexArr views(_views); if (views.empty()) { @@ -1105,11 +1107,24 @@ bool MeshTexture::ListCameraFaces(FaceDataViewArr& facesDatas, float fOutlierThr const Face& facet = faces[idxFace]; rasterer.idxFace = idxFace; - if (scene.is_face_visible(strName.c_str(), idxFace)) + bool skipVisibilityCheck = false; + + int coverage = faceViewCount[idxFace]; + + if (coverage < 5) { + skipVisibilityCheck = true; + } + + if (skipVisibilityCheck || scene.is_face_visible(strName.c_str(), idxFace)) { rasterer.Project(facet, triangleRasterizer); if (!rasterer.validFace) rasterer.Project(facet, triangleRasterizer); + + // 如果投影成功,增加面片覆盖率计数 + if (rasterer.validFace) { + faceViewCount[idxFace]++; + } } } diff --git a/libs/MVS/mask_face_occlusion.py b/libs/MVS/mask_face_occlusion.py index efeded8..906c7a1 100755 --- a/libs/MVS/mask_face_occlusion.py +++ b/libs/MVS/mask_face_occlusion.py @@ -1353,7 +1353,7 @@ class ModelProcessor: face_visible = v0_visible | v1_visible | v2_visible # 使用与CPU版本相同的后续处理 - shrunk_visibility = self._shrink_face_visibility(face_visible.cpu().numpy(), 6) + shrunk_visibility = self._shrink_face_visibility(face_visible.cpu().numpy(), 10) expanded_visibility = self._expand_face_visibility(face_visible.cpu().numpy(), 30) shrunk_visibility2 = self._shrink_face_visibility(face_visible.cpu().numpy(), 50) expanded_edge = expanded_visibility & ~shrunk_visibility2