Browse Source

解决构建虚拟面邻居图时的一个崩溃Bug

master
hesuicong 5 days ago
parent
commit
982106fec2
  1. 24
      libs/MVS/SceneTexture.cpp

24
libs/MVS/SceneTexture.cpp

@ -6308,6 +6308,8 @@ bool MeshTexture::CreateVirtualFaces65(
} }
} }
DEBUG_EXTRA("结束稳定的虚拟面片创建逻辑");
return true; return true;
} }
@ -8640,6 +8642,7 @@ bool MeshTexture::FaceViewSelection3( unsigned minCommonCameras, float fOutlierT
} }
} }
DEBUG_EXTRA("FaceViewSelection3.1");
// printf("perFaceFaces.size = %d\n", perFaceFaces.size()); // printf("perFaceFaces.size = %d\n", perFaceFaces.size());
ASSERT(controlCounter == faces.size()); ASSERT(controlCounter == faces.size());
@ -8657,16 +8660,22 @@ bool MeshTexture::FaceViewSelection3( unsigned minCommonCameras, float fOutlierT
const FIndex fAdj(adjFaces[i]); const FIndex fAdj(adjFaces[i]);
if (fAdj == NO_ID) if (fAdj == NO_ID)
continue; continue;
if (mapFaceToVirtualFace[fAdj] == idxVF) const FIndex virtualAdj = mapFaceToVirtualFace[fAdj];
if (virtualAdj == NO_ID)
continue; continue;
if (fAdj != idxFace && vfNeighbors.Find(mapFaceToVirtualFace[fAdj]) == Mesh::FaceIdxArr::NO_INDEX) { if (virtualAdj >= virtualFaces.size())
vfNeighbors.emplace_back(mapFaceToVirtualFace[fAdj]); 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 // 3) use virtual faces to build the graph
// 4) assign images to virtual faces // 4) assign images to virtual faces
// 5) spread image ID to each mesh face from virtual face // 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)); MAYBEUNUSED const Mesh::FIndex idx((Mesh::FIndex)boost::add_vertex(graph));
ASSERT(idx == idxFace); ASSERT(idx == idxFace);
} }
DEBUG_EXTRA("FaceViewSelection3.3");
//* //*
FOREACH(idxVirtualFace, virtualFaces) { FOREACH(idxVirtualFace, virtualFaces) {
const Mesh::FaceIdxArr& afaces = virtualFaceNeighbors[idxVirtualFace]; 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) if (idxVirtualFace >= idxVirtualFaceAdj)
continue; continue;
const bool bInvisibleFace(virtualFacesDatas[idxVirtualFace].empty()); const bool bInvisibleFace(virtualFacesDatas[idxVirtualFace].empty());
const bool bInvisibleFaceAdj(virtualFacesDatas[idxVirtualFaceAdj].empty()); const bool bInvisibleFaceAdj(virtualFacesDatas[idxVirtualFaceAdj].empty());
if (bInvisibleFace || bInvisibleFaceAdj) if (bInvisibleFace || bInvisibleFaceAdj)
continue; continue;
boost::add_edge(idxVirtualFace, idxVirtualFaceAdj, graph); boost::add_edge(idxVirtualFace, idxVirtualFaceAdj, graph);
} }
} }
//*/ //*/
DEBUG_EXTRA("FaceViewSelection3.4");
// 这里通过深度图判断virtualFaces是否要为invalid // 这里通过深度图判断virtualFaces是否要为invalid
// CheckInvalidFaces(virtualFacesDatas, fOutlierThreshold, nIgnoreMaskLabel, views, bUseVirtualFaces)) // CheckInvalidFaces(virtualFacesDatas, fOutlierThreshold, nIgnoreMaskLabel, views, bUseVirtualFaces))

Loading…
Cancel
Save