c++ - OpenCV中的WMesh面部着色伪影
问题描述
我在 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};
推荐阅读
- python - 堆算法产生相同的排列两次
- excel - 计算满足条件的日期数
- django - 如何从数据库中获取现有值到 django admin 的 django 模型字段中
- ansible - 使用带有多个变量的 with_list 的 Ansible 循环值
- python - Microsoft Visual Studio 14 - 退出状态为 2 失败
- c# - 每个选项卡都有单独的控制器/视图?
- postman - 使用 Postman 上传文件测试
- javascript - 切换属性和 css 数据
- regex - AD中移动/手机的PowerShell RegEx模式匹配?
- c# - 尝试使用 Ajax 调用控制器方法 MVC 获取数据 我的代码已附加