Browse Source

发版,处理纹理色差问题

master
hesuicong 5 months ago
parent
commit
12082d9904
  1. 204
      libs/MVS/SceneTexture.cpp

204
libs/MVS/SceneTexture.cpp

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

Loading…
Cancel
Save