Browse Source

平坦区域虚拟面增长优化

master
hesuicong 2 weeks ago
parent
commit
715bf75c74
  1. 46
      libs/MVS/SceneTexture.cpp

46
libs/MVS/SceneTexture.cpp

@ -471,7 +471,7 @@ struct MeshTexture {
*/ */
public: public:
MeshTexture(Scene& _scene, unsigned _nResolutionLevel=0, unsigned _nMinResolution=640); MeshTexture(Scene& _scene, unsigned _nResolutionLevel=0, unsigned _nMinResolution=640, Mesh::FaceIdxArr* _curvatureRegions=nullptr);
~MeshTexture(); ~MeshTexture();
void ListVertexFaces(); void ListVertexFaces();
@ -512,6 +512,8 @@ public:
float ComputeAverageQuality(const FaceDataArr& virtualFaceData) const; float ComputeAverageQuality(const FaceDataArr& virtualFaceData) const;
FaceDataArr MergeFaceData(const FaceDataArr& data1, const FaceDataArr& data2) 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<bool>& isVirtualFace, unsigned minCommonCameras=2, float thMaxNormalDeviation=25.f) const; bool CreateVirtualFaces7(FaceDataViewArr& facesDatas, FaceDataViewArr& virtualFacesDatas, VirtualFaceIdxsArr& virtualFaces, std::vector<bool>& isVirtualFace, unsigned minCommonCameras=2, float thMaxNormalDeviation=25.f) const;
IIndexArr SelectBestViews(const FaceDataArr& faceDatas, FIndex fid, unsigned minCommonCameras, float ratioAngleToQuality) 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; IIndexArr SelectBestViews2(const FaceDataArr& faceDatas, FIndex fid, unsigned minCommonCameras, float ratioAngleToQuality, FaceDataViewArr& facesDatas) const;
@ -731,6 +733,7 @@ public:
ImageArr& images; ImageArr& images;
Scene& scene; // the mesh vertices and faces Scene& scene; // the mesh vertices and faces
Mesh::FaceIdxArr* curvatureRegions;
}; };
// creating an invalid mask for the given image corresponding to // creating an invalid mask for the given image corresponding to
@ -764,7 +767,7 @@ static Image8U DetectInvalidImageRegions(const Image8U3& image)
return mask; return mask;
} }
MeshTexture::MeshTexture(Scene& _scene, unsigned _nResolutionLevel, unsigned _nMinResolution) MeshTexture::MeshTexture(Scene& _scene, unsigned _nResolutionLevel, unsigned _nMinResolution, Mesh::FaceIdxArr* _curvatureRegions)
: :
nResolutionLevel(_nResolutionLevel), nResolutionLevel(_nResolutionLevel),
nMinResolution(_nMinResolution), nMinResolution(_nMinResolution),
@ -778,7 +781,8 @@ MeshTexture::MeshTexture(Scene& _scene, unsigned _nResolutionLevel, unsigned _nM
faces(_scene.mesh.faces), faces(_scene.mesh.faces),
images(_scene.images), images(_scene.images),
scene(_scene), scene(_scene),
alternativeTexture(nullptr) alternativeTexture(nullptr),
curvatureRegions(nullptr)
{ {
} }
MeshTexture::~MeshTexture() MeshTexture::~MeshTexture()
@ -4307,6 +4311,28 @@ float MeshTexture::ComputeAverageQuality(const FaceDataArr& virtualFaceData) con
return count > 0 ? totalQuality / static_cast<float>(count) : 0.0f; return count > 0 ? totalQuality / static_cast<float>(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 MeshTexture::FaceDataArr MeshTexture::MergeFaceData(const FaceDataArr& data1, const FaceDataArr& data2) const
{ {
FaceDataArr mergedData; FaceDataArr mergedData;
@ -6368,8 +6394,14 @@ bool MeshTexture::CreateVirtualFaces65(FaceDataViewArr& facesDatas, FaceDataView
if (cosFaceToCenter < dynamicCosTh) if (cosFaceToCenter < dynamicCosTh)
continue; continue;
if (meshCurvatures[currentFaceId] > 0.2f) // if (meshCurvatures[currentFaceId] > 0.2f)
continue; // continue;
// 软化曲率检查
const float centerCurvature = meshCurvatures[virtualFaceCenterFaceID];
if (ShouldStopGrowthByCurvature(currentFaceId, virtualFaceCenterFaceID, centerCurvature)) {
continue;
}
// check if current face is seen by all cameras in selectedCams // check if current face is seen by all cameras in selectedCams
ASSERT(!selectedCams.empty()); 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, int nIgnoreMaskLabel, int maxTextureSize, const IIndexArr& views, const SEACAVE::String& baseFileName, bool bOriginFaceview,
const std::string& inputFileName, const std::string& meshFileName) const std::string& inputFileName, const std::string& meshFileName)
{ {
Mesh::FaceIdxArr regionMap;
if (!bOriginFaceview) if (!bOriginFaceview)
{ {
// 确保网格拓扑结构已计算 // 确保网格拓扑结构已计算
@ -12819,11 +12852,10 @@ bool Scene::TextureMesh(unsigned nResolutionLevel, unsigned nMinResolution, unsi
mesh.ListBoundaryVertices(); // 计算边界顶点 mesh.ListBoundaryVertices(); // 计算边界顶点
} }
Mesh::FaceIdxArr regionMap;
this->SegmentMeshBasedOnCurvature(regionMap, 0.2f); // 曲率阈值设为0.2 this->SegmentMeshBasedOnCurvature(regionMap, 0.2f); // 曲率阈值设为0.2
} }
MeshTexture texture(*this, nResolutionLevel, nMinResolution); MeshTexture texture(*this, nResolutionLevel, nMinResolution, &regionMap);
// printf("baseFileName=%s\n", baseFileName.c_str()); // printf("baseFileName=%s\n", baseFileName.c_str());

Loading…
Cancel
Save