diff --git a/libs/MVS/SceneTexture.cpp b/libs/MVS/SceneTexture.cpp index ed780de..3e81526 100644 --- a/libs/MVS/SceneTexture.cpp +++ b/libs/MVS/SceneTexture.cpp @@ -68,8 +68,7 @@ using namespace MVS; #define TEXOPT_INFERENCE_LBP 1 #define TEXOPT_INFERENCE_TRWS 2 #define TEXOPT_INFERENCE TEXOPT_INFERENCE_LBP - -#define MASK_FACE_OCCLUSION +// #define MASK_FACE_OCCLUSION // inference algorithm #if TEXOPT_INFERENCE == TEXOPT_INFERENCE_LBP @@ -2799,7 +2798,8 @@ void MeshTexture::CreateVirtualFaces6(FaceDataViewArr& facesDatas, FaceDataViewA std::sort(validViews.begin(), validViews.end(), [](const auto& a, const auto& b) { return a.first > b.first; }); - int nSize = sortedViews.size(); + // int nSize = sortedViews.size(); + int nSize = (sortedViews.size()>1) ? 1 : sortedViews.size(); // 计算初始平均值 float totalQuality = 0.0f; Color totalColor(0,0,0); @@ -2812,7 +2812,6 @@ void MeshTexture::CreateVirtualFaces6(FaceDataViewArr& facesDatas, FaceDataViewA float totalLuminance = MeshTexture::GetLuminance(totalColor); float avgLuminance = totalLuminance / nSize; - std::sort(sortedLuminViews.begin(), sortedLuminViews.end(), [avgLuminance](const auto& a, const auto& b) { float luminDistA = cv::norm(avgLuminance - a.first); @@ -2891,6 +2890,8 @@ void MeshTexture::CreateVirtualFaces6(FaceDataViewArr& facesDatas, FaceDataViewA #if TEXOPT_FACEOUTLIER != TEXOPT_FACEOUTLIER_NA virtualFaceData.color = Point3f::ZERO; #endif + int invalidQuality = 0; + Color invalidColor = Point3f::ZERO; unsigned processedFaces(0); bool bInvalidFacesRelative = false; int invalidCount = 0; @@ -2942,7 +2943,12 @@ void MeshTexture::CreateVirtualFaces6(FaceDataViewArr& facesDatas, FaceDataViewA // if (faceData.bInvalidFacesRelative) if (bHasInvalidView) { - // ++processedFaces; + // invalidQuality += faceData.quality; + // #if TEXOPT_FACEOUTLIER != TEXOPT_FACEOUTLIER_NA + // invalidColor += faceData.color; + // #endif + + ++processedFaces; } else { @@ -2958,11 +2964,12 @@ void MeshTexture::CreateVirtualFaces6(FaceDataViewArr& facesDatas, FaceDataViewA } } - float maxLuminance = 150.0f; - float minLuminance = 80.0f; + float maxLuminance = 120.0f; + float minLuminance = 90.0f; + int validViewsSize = validViews.size(); if (bHasInvalidView) { - if (validViews.size()<=0) + if (validViewsSize<=0) { //* // int nSize = sortedViews.size(); // (sortedViews.size() > 3) ? 3 : sortedViews.size(); @@ -2991,11 +2998,11 @@ void MeshTexture::CreateVirtualFaces6(FaceDataViewArr& facesDatas, FaceDataViewA float luminanceDistance = cv::norm(avgLuminance - viewLuminance); // printf("viewLuminance=%f\n", viewLuminance); - if ((colorDistance<=maxColorDeviation)&& - (viewLuminance<=maxLuminance)&& - (viewLuminance>=minLuminance)){ - // if ((colorDistance <= maxColorDeviation) && - // (luminanceDistance <= maxLuminanceDeviation)) { + // if ((colorDistance<=maxColorDeviation)&& + // (viewLuminance<=maxLuminance)&& + // (viewLuminance>=minLuminance)){ + if ((colorDistance <= maxColorDeviation) && + (luminanceDistance <= maxLuminanceDeviation)) { validIndices.push_back(n); } } @@ -3005,9 +3012,19 @@ void MeshTexture::CreateVirtualFaces6(FaceDataViewArr& facesDatas, FaceDataViewA for (int n = 0; n < nSize; ++n) { const Color& viewColor = sortedViews[n].second; float viewLuminance = MeshTexture::GetLuminance(viewColor); + float luminanceDistance = cv::norm(avgLuminance - viewLuminance); - if ((viewLuminance<=maxLuminance)&& - (viewLuminance>=minLuminance)){ + if (luminanceDistance <= maxLuminanceDeviation){ + validIndices.push_back(n); + } + } + } + if (validIndices.empty()) { + for (int n = 0; n < nSize; ++n) { + const Color& viewColor = sortedViews[n].second; + float colorDistance = cv::norm(avgColor - viewColor); + + if (colorDistance<=maxColorDeviation){ validIndices.push_back(n); } } @@ -3044,27 +3061,31 @@ void MeshTexture::CreateVirtualFaces6(FaceDataViewArr& facesDatas, FaceDataViewA // 如果所有视图都被排除,保留原始平均值 if (validIndices.empty()) { - // virtualFaceData.quality = avgQuality; - // virtualFaceData.color = avgColor; + virtualFaceData.quality = avgQuality; + #if TEXOPT_FACEOUTLIER != TEXOPT_FACEOUTLIER_NA + virtualFaceData.color = avgColor; + #endif // virtualFaceData.quality = avgQuality; // virtualFaceData.color = sortedLuminViews[0].second; } else { // 使用过滤后的视图重新计算平均值 - totalQuality = 0.0f; - totalColor = Color(0,0,0); + float totalQuality2 = 0.0f; + Color totalColor2 = Color(0,0,0); for (int idx : validIndices) { - totalQuality += sortedViews[idx].first; - totalColor += sortedViews[idx].second; + totalQuality2 += sortedViews[idx].first; + totalColor2 += sortedViews[idx].second; } - virtualFaceData.quality = totalQuality / validIndices.size(); - virtualFaceData.color = totalColor / validIndices.size(); + virtualFaceData.quality = totalQuality2 / validIndices.size(); + virtualFaceData.color = totalColor2 / validIndices.size(); } //*/ } - else + else if (validViewsSize>0&&validViewsSize<=2) { /* + virtualFaceData.quality = 0; + virtualFaceData.color = Point3f::ZERO; // int nSize = (validViews.size()>1) ? 1 : validViews.size(); int nSize = validViews.size(); for (int n=0; n 3) ? 3 : validViews.size(); // 计算初始平均值 - float totalQuality = 0.0f; - Color totalColor(0,0,0); + float totalQuality2 = 0.0f; + Color totalColor2(0,0,0); for (int n = 0; n < nSize; ++n) { - totalQuality += validViews[n].first; - totalColor += validViews[n].second; + totalQuality2 += validViews[n].first; + totalColor2 += validViews[n].second; } - const float avgQuality = totalQuality / nSize; - const Color avgColor = totalColor / nSize; + const float avgQuality2 = totalQuality2 / nSize; + const Color avgColor2 = totalColor2 / nSize; // 过滤偏差过大的视图 std::vector validIndices; @@ -3096,7 +3117,7 @@ void MeshTexture::CreateVirtualFaces6(FaceDataViewArr& facesDatas, FaceDataViewA for (int n = 0; n < nSize; ++n) { const Color& viewColor = validViews[n].second; - float colorDistance = cv::norm(avgColor - viewColor); + float colorDistance = cv::norm(avgColor2 - viewColor); // printf("colorDistance=%f\n", colorDistance); float viewLuminance = MeshTexture::GetLuminance(viewColor); // if ((colorDistance<=maxColorDeviation)&& @@ -3107,6 +3128,7 @@ void MeshTexture::CreateVirtualFaces6(FaceDataViewArr& facesDatas, FaceDataViewA } } + /* // float totalLuminance = MeshTexture::GetLuminance(totalColor); // float avgLuminance = totalLuminance / nSize; float maxLuminanceDeviation = 0.01f; @@ -3119,13 +3141,17 @@ void MeshTexture::CreateVirtualFaces6(FaceDataViewArr& facesDatas, FaceDataViewA // validIndices.push_back(n); } } + //*/ // 如果所有视图都被排除,保留原始平均值 if (validIndices.empty()) { - // virtualFaceData.quality = avgQuality; - // virtualFaceData.color = avgColor; - // virtualFaceData.quality = avgQuality; + virtualFaceData.quality = avgQuality; + #if TEXOPT_FACEOUTLIER != TEXOPT_FACEOUTLIER_NA + virtualFaceData.color = avgColor; + #endif + // virtualFaceData.color = sortedLuminViews[0].second; + /* for (int n = 0; n < nSize; ++n) { float lumin = sortedLuminViews[n].first; @@ -3136,28 +3162,126 @@ void MeshTexture::CreateVirtualFaces6(FaceDataViewArr& facesDatas, FaceDataViewA break; } } + //*/ } else { // 使用过滤后的视图重新计算平均值 - totalQuality = 0.0f; - totalColor = Color(0,0,0); + float totalQuality2 = 0.0f; + Color totalColor2 = Color(0,0,0); for (int idx : validIndices) { - totalQuality += validViews[idx].first; - totalColor += validViews[idx].second; + totalQuality2 += validViews[idx].first; + totalColor2 += validViews[idx].second; } - virtualFaceData.quality = totalQuality / validIndices.size(); - virtualFaceData.color = totalColor / validIndices.size(); + virtualFaceData.quality = totalQuality2 / validIndices.size(); + virtualFaceData.color = totalColor2 / validIndices.size(); } //*/ } + else + { + /* + ASSERT(processedFaces > 0); + virtualFaceData.quality /= processedFaces; + #if TEXOPT_FACEOUTLIER != TEXOPT_FACEOUTLIER_NA + virtualFaceData.color /= processedFaces; + #endif + */ + } } else { + float maxLuminance2 = 200.0f; + float minLuminance2 = 20.0f; + /* + std::vector validIndices; + float maxColorDeviation = 1.0f; // 颜色偏差阈值 + float maxLuminanceDeviation = 0.1f; + + for (int n = 0; n < nSize; ++n) { + const Color& viewColor = sortedViews[n].second; + float colorDistance = cv::norm(avgColor - viewColor); + // printf("colorDistance=%f\n", colorDistance); + + float viewLuminance = MeshTexture::GetLuminance(viewColor); + float luminanceDistance = cv::norm(avgLuminance - viewLuminance); + // printf("viewLuminance=%f\n", viewLuminance); + + if ((colorDistance<=maxColorDeviation)&& + (viewLuminance<=maxLuminance2)&& + (viewLuminance>=minLuminance2)){ + // if ((colorDistance <= maxColorDeviation) && + // (luminanceDistance <= maxLuminanceDeviation)) { + validIndices.push_back(n); + } + } + + if (validIndices.empty()) { + for (int n = 0; n < nSize; ++n) { + const Color& viewColor = sortedViews[n].second; + float colorDistance = cv::norm(avgColor - viewColor); + + if (colorDistance<=maxColorDeviation){ + validIndices.push_back(n); + } + } + } + + if (validIndices.empty()) { + for (int n = 0; n < nSize; ++n) { + const Color& viewColor = sortedViews[n].second; + float viewLuminance = MeshTexture::GetLuminance(viewColor); + float luminanceDistance = cv::norm(avgLuminance - viewLuminance); + + if (luminanceDistance <= maxLuminanceDeviation){ + validIndices.push_back(n); + } + } + } + if (validIndices.empty()) { + for (int n = 0; n < nSize; ++n) { + const Color& viewColor = sortedViews[n].second; + float viewLuminance = MeshTexture::GetLuminance(viewColor); + + if ((viewLuminance<=maxLuminance)&& + (viewLuminance>=minLuminance)){ + validIndices.push_back(n); + } + } + } + + // 如果所有视图都被排除,保留原始平均值 + if (validIndices.empty()) { + // virtualFaceData.quality = avgQuality; + // virtualFaceData.color = avgColor; + // virtualFaceData.quality = avgQuality; + + // ASSERT(processedFaces > 0); + // virtualFaceData.quality /= processedFaces; + // #if TEXOPT_FACEOUTLIER != TEXOPT_FACEOUTLIER_NA + // virtualFaceData.color /= processedFaces; + // #endif + + } + else { + // 使用过滤后的视图重新计算平均值 + totalQuality = 0.0f; + totalColor = Color(0,0,0); + for (int idx : validIndices) { + totalQuality += sortedViews[idx].first; + totalColor += sortedViews[idx].second; + } + virtualFaceData.quality = totalQuality / validIndices.size(); + virtualFaceData.color = totalColor / validIndices.size(); + } + //*/ + + //* ASSERT(processedFaces > 0); virtualFaceData.quality /= processedFaces; #if TEXOPT_FACEOUTLIER != TEXOPT_FACEOUTLIER_NA virtualFaceData.color /= processedFaces; #endif + //*/ } // virtualFaceData.bInvalidFacesRelative = (invalidCount > 1);