繁体   English   中英

OpenCV 中的 WMesh 面部着色伪影

[英]WMesh face shading artifacts in OpenCV

我在 Ubuntu 18.04.5 上使用 OpenCV v4.4.0 和 gcc v10.1。 此代码片段:

using namespace std;
using namespace cv;
using namespace cv::viz;
......
vector<Vec3f> points{{0, 0, 0}, {1, 0, 0}, {1, 1, 0}, {0, 1, 0}, {2, 0, 0}, {2, 1, 0}};
vector<int>   faces{4, 0, 1, 2, 0, 4, 0, 2, 3, 0, 5, 1, 4, 5, 2, 1};
Viz3d         window("Mesh");
WMesh         mesh(points, faces);

window.setBackgroundColor(Color::gray());
mesh.setColor(Color::indigo());
mesh.setRenderingProperty(OPACITY, 0.4);
mesh.setRenderingProperty(SHADING, SHADING_FLAT);
mesh.setRenderingProperty(REPRESENTATION, REPRESENTATION_SURFACE);
window.showWidget("mesh", mesh);
window.spin();

创建并显示此平面网格:

在此处输入图像描述

左边的正方形被定义为 2 个三角形并被均匀地着色,而右边的正方形被定义为单个四边形面,并没有被均匀地着色。 同样,网格是平面的。 为什么不均匀?

当我将阴影从SHADING_FLAT更改为SHADING_GOURAUD时,它变得更加不均匀:

在此处输入图像描述

有人可以解释这里发生了什么吗? 我知道四边形面被转换为三角形,但为什么阴影是不均匀的?

编辑

正如 Матвей Вислоух 在他下面的回答中指出的那样,我打算使用:

vector<int> faces{3, 0, 1, 2, 3, 0, 2, 3, 4, 1, 4, 5, 2};

它正确定义了两个三角形和一个四边形面。 这解决了左半部分的伪影问题,但它们仍然保留在右半部分:

在此处输入图像描述

vector<int> faces{3, 0, 1, 2, 3, 0, 2, 3, 4, 1, 4, 2, 5};

opencv 如何从多边形中解包索引有一个特定的规则。

如果有一个多边形:(5, 1, 4, 5, 2, 0) 它由 3 个三角形组成:(1,4,5), (4, 5, 2), (5, 2, 0)

老的:

矢量面{4, 0, 1, 2, 0, 4, 0, 2, 3, 0, 5, 1, 4, 5, 2, 1};

这意味着您绘制 3 个多边形:2 个四边形和 1 个五边形。

但是通过索引我猜你想画 2 个三角形和一个四边形,所以试试这个:

矢量面{3, 0, 1, 2, 3, 0, 2, 3, 4, 1, 4, 5, 2};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM