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; @@ -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)) {
// 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 @@ -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);

Loading…
Cancel
Save