Browse Source

处理色差和印染问题

master
hesuicong 5 months ago
parent
commit
0f36dd536c
  1. 38
      libs/MVS/SceneTexture.cpp

38
libs/MVS/SceneTexture.cpp

@ -2959,7 +2959,7 @@ void MeshTexture::CreateVirtualFaces6(FaceDataViewArr& facesDatas, FaceDataViewA
} }
float maxLuminance = 150.0f; float maxLuminance = 150.0f;
float minLuminance = 20.0f; float minLuminance = 80.0f;
if (bHasInvalidView) if (bHasInvalidView)
{ {
if (validViews.size()<=0) if (validViews.size()<=0)
@ -3000,28 +3000,47 @@ void MeshTexture::CreateVirtualFaces6(FaceDataViewArr& facesDatas, FaceDataViewA
} }
} }
//*
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);
}
}
}
//*/
/*
float maxColorDeviation2 = 0.05f;
if (validIndices.empty()) { if (validIndices.empty()) {
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 colorDistance = cv::norm(avgColor - viewColor); float colorDistance = cv::norm(avgColor - viewColor);
if (colorDistance <= maxColorDeviation) { if (colorDistance <= maxColorDeviation2) {
validIndices.push_back(n); validIndices.push_back(n);
} }
} }
} }
//*/
/*
float totalLuminance = MeshTexture::GetLuminance(totalColor); float totalLuminance = MeshTexture::GetLuminance(totalColor);
float avgLuminance = totalLuminance / nSize; float avgLuminance = totalLuminance / nSize;
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); float luminanceDistance = cv::norm(avgLuminance - viewLuminance);
// printf("luminanceDistance=%f\n", luminanceDistance);
if (luminanceDistance <= maxLuminanceDeviation) { if (luminanceDistance <= maxLuminanceDeviation) {
// validIndices.push_back(n); validIndices.push_back(n);
} }
} }
//*/
// 如果所有视图都被排除,保留原始平均值 // 如果所有视图都被排除,保留原始平均值
if (validIndices.empty()) { if (validIndices.empty()) {
@ -3029,17 +3048,6 @@ void MeshTexture::CreateVirtualFaces6(FaceDataViewArr& facesDatas, FaceDataViewA
// virtualFaceData.color = avgColor; // virtualFaceData.color = avgColor;
// virtualFaceData.quality = avgQuality; // virtualFaceData.quality = avgQuality;
// virtualFaceData.color = sortedLuminViews[0].second; // virtualFaceData.color = sortedLuminViews[0].second;
for (int n = 0; n < nSize; ++n) {
float lumin = sortedLuminViews[n].first;
if (lumin>=minLuminance&&lumin<=maxLuminance)
{
// virtualFaceData.quality = avgQuality;
// virtualFaceData.color = sortedLuminViews[0].second;
break;
}
}
} }
else { else {
// 使用过滤后的视图重新计算平均值 // 使用过滤后的视图重新计算平均值

Loading…
Cancel
Save