发版,处理纹理色差问题
This commit is contained in:
1 parent
0f36dd536c
commit
12082d9904
1 file changed
+164
-40
+164
-40
@@ -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<nSize; ++n)
|
||||
@@ -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
|
||||
|
||||
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<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);
|
||||
|
||||
Reference in new issue
Block a user