|
|
|
|
@ -68,8 +68,7 @@ using namespace MVS;
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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)) {
|
|
|
|
|
// (viewLuminance<=maxLuminance)&&
|
|
|
|
|
// (viewLuminance>=minLuminance)){
|
|
|
|
|
if ((colorDistance <= maxColorDeviation) && |
|
|
|
|
(luminanceDistance <= maxLuminanceDeviation)) { |
|
|
|
|
validIndices.push_back(n); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -3005,9 +3012,19 @@ void MeshTexture::CreateVirtualFaces6(FaceDataViewArr& facesDatas, FaceDataViewA
@@ -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
@@ -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<nSize; ++n) |
|
|
|
|
@ -3081,14 +3102,14 @@ void MeshTexture::CreateVirtualFaces6(FaceDataViewArr& facesDatas, FaceDataViewA
@@ -3081,14 +3102,14 @@ void MeshTexture::CreateVirtualFaces6(FaceDataViewArr& facesDatas, FaceDataViewA
|
|
|
|
|
int nSize = validViews.size(); // (validViews.size() > 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<int> validIndices; |
|
|
|
|
@ -3096,7 +3117,7 @@ void MeshTexture::CreateVirtualFaces6(FaceDataViewArr& facesDatas, FaceDataViewA
@@ -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
@@ -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
@@ -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
@@ -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<int> 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);
|
|
|
|
|
|