From 982106fec27fc95ade8033c26b3dcf05d6b045c7 Mon Sep 17 00:00:00 2001 From: hesuicong Date: Thu, 6 Aug 2026 14:25:15 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E6=9E=84=E5=BB=BA=E8=99=9A?= =?UTF-8?q?=E6=8B=9F=E9=9D=A2=E9=82=BB=E5=B1=85=E5=9B=BE=E6=97=B6=E7=9A=84?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E5=B4=A9=E6=BA=83Bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/MVS/SceneTexture.cpp | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/libs/MVS/SceneTexture.cpp b/libs/MVS/SceneTexture.cpp index b67cd8f..a5d72bd 100644 --- a/libs/MVS/SceneTexture.cpp +++ b/libs/MVS/SceneTexture.cpp @@ -6308,6 +6308,8 @@ bool MeshTexture::CreateVirtualFaces65( } } + DEBUG_EXTRA("结束稳定的虚拟面片创建逻辑"); + return true; } @@ -8640,6 +8642,7 @@ bool MeshTexture::FaceViewSelection3( unsigned minCommonCameras, float fOutlierT } } + DEBUG_EXTRA("FaceViewSelection3.1"); // printf("perFaceFaces.size = %d\n", perFaceFaces.size()); ASSERT(controlCounter == faces.size()); @@ -8657,16 +8660,22 @@ bool MeshTexture::FaceViewSelection3( unsigned minCommonCameras, float fOutlierT const FIndex fAdj(adjFaces[i]); if (fAdj == NO_ID) continue; - if (mapFaceToVirtualFace[fAdj] == idxVF) + const FIndex virtualAdj = mapFaceToVirtualFace[fAdj]; + if (virtualAdj == NO_ID) continue; - if (fAdj != idxFace && vfNeighbors.Find(mapFaceToVirtualFace[fAdj]) == Mesh::FaceIdxArr::NO_INDEX) { - vfNeighbors.emplace_back(mapFaceToVirtualFace[fAdj]); + if (virtualAdj >= virtualFaces.size()) + continue; + if (virtualAdj == idxVF) + continue; + if (vfNeighbors.Find(virtualAdj) == Mesh::FaceIdxArr::NO_INDEX) { + vfNeighbors.emplace_back(virtualAdj); } } } } //*/ } + DEBUG_EXTRA("FaceViewSelection3.2"); // 3) use virtual faces to build the graph // 4) assign images to virtual faces // 5) spread image ID to each mesh face from virtual face @@ -8674,21 +8683,30 @@ bool MeshTexture::FaceViewSelection3( unsigned minCommonCameras, float fOutlierT MAYBEUNUSED const Mesh::FIndex idx((Mesh::FIndex)boost::add_vertex(graph)); ASSERT(idx == idxFace); } + DEBUG_EXTRA("FaceViewSelection3.3"); //* FOREACH(idxVirtualFace, virtualFaces) { const Mesh::FaceIdxArr& afaces = virtualFaceNeighbors[idxVirtualFace]; - for (FIndex idxVirtualFaceAdj: afaces) { + for (FIndex idxVirtualFaceAdj : afaces) { + // ✅ 防御性检查 + if (idxVirtualFaceAdj == NO_ID) + continue; + if (idxVirtualFaceAdj >= virtualFaces.size()) + continue; if (idxVirtualFace >= idxVirtualFaceAdj) continue; + const bool bInvisibleFace(virtualFacesDatas[idxVirtualFace].empty()); const bool bInvisibleFaceAdj(virtualFacesDatas[idxVirtualFaceAdj].empty()); if (bInvisibleFace || bInvisibleFaceAdj) continue; + boost::add_edge(idxVirtualFace, idxVirtualFaceAdj, graph); } } //*/ + DEBUG_EXTRA("FaceViewSelection3.4"); // 这里通过深度图判断virtualFaces是否要为invalid // CheckInvalidFaces(virtualFacesDatas, fOutlierThreshold, nIgnoreMaskLabel, views, bUseVirtualFaces))