From ec1a89b078354f27819d3da70f985df3ce6feffe Mon Sep 17 00:00:00 2001 From: hesuicong Date: Fri, 12 Jun 2026 17:31:09 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=A4=E8=BD=AE=E5=A1=AB=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/MVS/SceneTexture.cpp | 76 ++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 33 deletions(-) diff --git a/libs/MVS/SceneTexture.cpp b/libs/MVS/SceneTexture.cpp index 7b086c4..e00108e 100644 --- a/libs/MVS/SceneTexture.cpp +++ b/libs/MVS/SceneTexture.cpp @@ -5715,7 +5715,7 @@ bool MeshTexture::CreateVirtualFaces64(FaceDataViewArr& facesDatas, FaceDataView // 如果夹角小于45度(cos(45°) ≈ 0.7071),则计入覆盖 float fAngleThreshold1 = 0.6071; // 0.7071f - float fAngleThreshold2 = 0.7071; // 0.7071f + float fAngleThreshold2 = 0.8571; // 0.7071f // 初始化数据结构 std::vector processedFaces(faces.size(), false); @@ -5723,7 +5723,7 @@ bool MeshTexture::CreateVirtualFaces64(FaceDataViewArr& facesDatas, FaceDataView DEBUG_EXTRA("开始新的虚拟面片创建逻辑: 基于视图排序"); - /* + //* // 1. 计算每个视图的覆盖情况 Util::Progress progress1(_T("计算视图覆盖"), images.size()); for (IIndex idxView = 0; idxView < images.size(); ++idxView) { @@ -5835,8 +5835,8 @@ bool MeshTexture::CreateVirtualFaces64(FaceDataViewArr& facesDatas, FaceDataView DEBUG_EXTRA("排序后视图数量: %zu,最大覆盖: %d, 共%d", viewCoverage.size(), viewCoverage.empty() ? 0 : viewCoverage[0].second, totalCoverage); + //*/ - */ float thMaxColorDeviation = 130.0f; const float ratioAngleToQuality(0.67f); @@ -6003,14 +6003,14 @@ bool MeshTexture::CreateVirtualFaces64(FaceDataViewArr& facesDatas, FaceDataView if (scene.is_face_edge(strName, virtualFaceCenterFaceID)) { - // if (angleDeg <= 20.0f) + if (angleDeg <= 30.0f) { mapSortedcams2[idxView] = angleDeg; } } else { - // if (angleDeg <= 40.0f) + if (angleDeg <= 60.0f) { mapSortedcams2[idxView] = angleDeg; } @@ -6047,34 +6047,11 @@ bool MeshTexture::CreateVirtualFaces64(FaceDataViewArr& facesDatas, FaceDataView IIndexArr filteredCams; int nViewCoverage = 0; - int nViewCoverageMax = 20; + int nViewCoverageMax = 200; int nHit = 0; - int nHitMax = 10; - for (size_t i = 0; i < sortedCams2.size(); ++i) - { - if (nViewCoverage>=nViewCoverageMax) - // if (nHit>nHitMax) - break; - IIndex viewIdx = sortedCams2[i].first; - float val = sortedCams2[i].second; - - const Image& imageData = images[viewIdx]; - std::string strPath = imageData.name; - std::string strName = MeshTexture::GetFileNameWithoutExtension(strPath); - - // if (!scene.is_face_delete_edge2(strName, virtualFaceCenterFaceID)) - { - filteredCams.push_back(viewIdx); - ++nHit; - - if (nHit>=nHitMax) - break; - } - - ++nViewCoverage; - } - - /* + int nHitMax = 1; + std::map mapProcessedViewIdx; + //* for (const auto& [viewIdx, coverageCount] : viewCoverage) { if (nViewCoverage>=nViewCoverageMax) // if (nHit>nHitMax) @@ -6116,6 +6093,7 @@ bool MeshTexture::CreateVirtualFaces64(FaceDataViewArr& facesDatas, FaceDataView if (!scene.is_face_delete_edge2(strName, virtualFaceCenterFaceID)) { filteredCams.push_back(viewIdx); + mapProcessedViewIdx[viewIdx] = viewIdx; ++nHit; if (nHit>=nHitMax) @@ -6125,7 +6103,39 @@ bool MeshTexture::CreateVirtualFaces64(FaceDataViewArr& facesDatas, FaceDataView ++nViewCoverage; } - */ + //*/ + + nViewCoverage = 0; + nViewCoverageMax = 200; + nHit = 0; + nHitMax = 5; + for (size_t i = 0; i < sortedCams2.size(); ++i) + { + if (nViewCoverage>=nViewCoverageMax) + // if (nHit>nHitMax) + break; + + IIndex viewIdx = sortedCams2[i].first; + float val = sortedCams2[i].second; + + if (mapProcessedViewIdx.count(viewIdx) > 0) + continue; + + const Image& imageData = images[viewIdx]; + std::string strPath = imageData.name; + std::string strName = MeshTexture::GetFileNameWithoutExtension(strPath); + + // if (!scene.is_face_delete_edge2(strName, virtualFaceCenterFaceID)) + { + filteredCams.push_back(viewIdx); + ++nHit; + + if (nHit>=nHitMax) + break; + } + + ++nViewCoverage; + } if (filteredCams.empty()) { size_t count = std::min(sortedCams.size(), static_cast(3));