From 715bf75c746b811ec0ca711cd300aa46f4ab572f Mon Sep 17 00:00:00 2001 From: hesuicong Date: Wed, 29 Jul 2026 11:15:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B9=B3=E5=9D=A6=E5=8C=BA=E5=9F=9F=E8=99=9A?= =?UTF-8?q?=E6=8B=9F=E9=9D=A2=E5=A2=9E=E9=95=BF=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/MVS/SceneTexture.cpp | 46 +++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/libs/MVS/SceneTexture.cpp b/libs/MVS/SceneTexture.cpp index 78adc96..cf32d38 100644 --- a/libs/MVS/SceneTexture.cpp +++ b/libs/MVS/SceneTexture.cpp @@ -471,7 +471,7 @@ struct MeshTexture { */ public: - MeshTexture(Scene& _scene, unsigned _nResolutionLevel=0, unsigned _nMinResolution=640); + MeshTexture(Scene& _scene, unsigned _nResolutionLevel=0, unsigned _nMinResolution=640, Mesh::FaceIdxArr* _curvatureRegions=nullptr); ~MeshTexture(); void ListVertexFaces(); @@ -512,6 +512,8 @@ public: float ComputeAverageQuality(const FaceDataArr& virtualFaceData) const; FaceDataArr MergeFaceData(const FaceDataArr& data1, const FaceDataArr& data2) const; + bool ShouldStopGrowthByCurvature(FIndex currentFace, FIndex seedFace, float centerCurvature) const; + bool CreateVirtualFaces7(FaceDataViewArr& facesDatas, FaceDataViewArr& virtualFacesDatas, VirtualFaceIdxsArr& virtualFaces, std::vector& isVirtualFace, unsigned minCommonCameras=2, float thMaxNormalDeviation=25.f) const; IIndexArr SelectBestViews(const FaceDataArr& faceDatas, FIndex fid, unsigned minCommonCameras, float ratioAngleToQuality) const; IIndexArr SelectBestViews2(const FaceDataArr& faceDatas, FIndex fid, unsigned minCommonCameras, float ratioAngleToQuality, FaceDataViewArr& facesDatas) const; @@ -731,6 +733,7 @@ public: ImageArr& images; Scene& scene; // the mesh vertices and faces + Mesh::FaceIdxArr* curvatureRegions; }; // creating an invalid mask for the given image corresponding to @@ -764,7 +767,7 @@ static Image8U DetectInvalidImageRegions(const Image8U3& image) return mask; } -MeshTexture::MeshTexture(Scene& _scene, unsigned _nResolutionLevel, unsigned _nMinResolution) +MeshTexture::MeshTexture(Scene& _scene, unsigned _nResolutionLevel, unsigned _nMinResolution, Mesh::FaceIdxArr* _curvatureRegions) : nResolutionLevel(_nResolutionLevel), nMinResolution(_nMinResolution), @@ -778,7 +781,8 @@ MeshTexture::MeshTexture(Scene& _scene, unsigned _nResolutionLevel, unsigned _nM faces(_scene.mesh.faces), images(_scene.images), scene(_scene), - alternativeTexture(nullptr) + alternativeTexture(nullptr), + curvatureRegions(nullptr) { } MeshTexture::~MeshTexture() @@ -4307,6 +4311,28 @@ float MeshTexture::ComputeAverageQuality(const FaceDataArr& virtualFaceData) con return count > 0 ? totalQuality / static_cast(count) : 0.0f; } + +bool MeshTexture::ShouldStopGrowthByCurvature(FIndex currentFace, FIndex seedFace, float centerCurvature) const +{ + // 软化逻辑(同上) + const float curvCurrent = meshCurvatures[currentFace]; + const float curvSeed = meshCurvatures[seedFace]; + const float curvDiff = std::abs(curvCurrent - curvSeed); + + float threshold; + if (centerCurvature < 0.1f) { + threshold = 0.3f; + } else if (centerCurvature < 0.2f) { + threshold = 0.15f; + } else if (centerCurvature < 0.4f) { + threshold = 0.08f; + } else { + threshold = 0.03f; + } + + return curvDiff > threshold; +} + MeshTexture::FaceDataArr MeshTexture::MergeFaceData(const FaceDataArr& data1, const FaceDataArr& data2) const { FaceDataArr mergedData; @@ -6368,8 +6394,14 @@ bool MeshTexture::CreateVirtualFaces65(FaceDataViewArr& facesDatas, FaceDataView if (cosFaceToCenter < dynamicCosTh) continue; - if (meshCurvatures[currentFaceId] > 0.2f) - continue; + // if (meshCurvatures[currentFaceId] > 0.2f) + // continue; + + // 软化曲率检查 + const float centerCurvature = meshCurvatures[virtualFaceCenterFaceID]; + if (ShouldStopGrowthByCurvature(currentFaceId, virtualFaceCenterFaceID, centerCurvature)) { + continue; + } // check if current face is seen by all cameras in selectedCams ASSERT(!selectedCams.empty()); @@ -12801,6 +12833,7 @@ bool Scene::TextureMesh(unsigned nResolutionLevel, unsigned nMinResolution, unsi int nIgnoreMaskLabel, int maxTextureSize, const IIndexArr& views, const SEACAVE::String& baseFileName, bool bOriginFaceview, const std::string& inputFileName, const std::string& meshFileName) { + Mesh::FaceIdxArr regionMap; if (!bOriginFaceview) { // 确保网格拓扑结构已计算 @@ -12819,11 +12852,10 @@ bool Scene::TextureMesh(unsigned nResolutionLevel, unsigned nMinResolution, unsi mesh.ListBoundaryVertices(); // 计算边界顶点 } - Mesh::FaceIdxArr regionMap; this->SegmentMeshBasedOnCurvature(regionMap, 0.2f); // 曲率阈值设为0.2 } - MeshTexture texture(*this, nResolutionLevel, nMinResolution); + MeshTexture texture(*this, nResolutionLevel, nMinResolution, ®ionMap); // printf("baseFileName=%s\n", baseFileName.c_str());