如何在 MATLAB 中绘制纹理映射三角形?

2024-06-19

我有一个三角形(u,v)图像中的坐标。我想在 3D 坐标处绘制这个三角形(X,Y,Z)与图像中的三角形进行纹理映射。

Here, u,v,X,Y,Z都是具有三个元素的向量,代表三角形的三个角。

我有一个非常丑陋、缓慢且令人不满意的解决方案,其中我:

  1. 提取图像的矩形部分
  2. 使用由三个点定义的变换将其变换到 3D 空间
  3. 用曲面来画它
  4. 最后用 AlphaData 屏蔽掉不属于三角形的所有内容

当然必须有一种更简单的方法来做到这一点吗?


我有一个我认为对您来说更好的解决方案,涉及两个步骤。首先,它提取图像的矩形部分,其中一半是用作纹理贴图的三角形部分,一半将被忽略。然后,将此纹理贴图应用于 3D 表面对象,调整其点以将其渲染为三角形而不是四边形。

对于我将在这里展示的示例,我将为您的各种参数使用以下值,假设您有一个三角形,其点被标记为“原点”(三角形顶点)、点“A”和点“B”图像空间(如下第一张图所示):

x = [0.1 0.9 0.8];   % [xorigin xA xB] coordinates in 3-D space
y = [0.9 0.1 0.8];   % [yorigin yA yB] coordinates in 3-D space
z = [0.1 0.1 0.9];   % [zorigin zA zB] coordinates in 3-D space
origin = [150 350];  % Vertex of triangle in image space
U = [300 -50];       % Vector from origin to point A in image space
V = [50 -250];       % Vector from origin to point B in image space
img = imread('peppers.png');  % Sample image for texture map

通过投影变换提取纹理图:

此步骤使用图像处理工具箱 https://www.mathworks.com/help/images/index.html功能maketform https://www.mathworks.com/help/images/ref/maketform.html and imtransform https://www.mathworks.com/help/images/ref/imtransform.html对包含要用作纹理贴图的三角形的图像部分执行投影变换。请注意,由于图像必须是矩形,因此由点定义的附加三角形部分(O,B,C)必须包括在内。

您想要的图像的三角形部分将位于图像的右下半部分,而附加的三角形“填充物”部分将位于左上角。请注意,这个额外的三角形可以延伸到图像之外,这将导致默认情况下部分图像被黑色填充。下面是执行上面所示的投影变换的代码:

A = origin+U;  % Point A
B = origin+V;  % Point B
C = B-U;       % Point C
[nRows, nCols, nPages] = size(img);  % Image dimensions
inputCorners = [origin; ...          % Corner coordinates of input space
                A; ...
                B; ...
                C];
outputCorners = [1 nRows; ...        % Corner coordinates of output space
                 nCols nRows; ...
                 nCols 1; ...
                 1 1];
tform = maketform('projective', ...  % Make the transformation structure
                  inputCorners, ...
                  outputCorners);
triTexture = imtransform(img,tform, 'bicubic', ...  % Transform the image
                         'xdata', [1 nCols], ...
                         'ydata', [1 nRows], ...
                         'size', [nRows nCols]);

请注意,此代码将创建最终图像triTexture与输入图像的大小相同img.

绘制三角形纹理映射表面:

绘制曲面现在非常简单,假设您已对中的值进行了排序x,y,z变量,使得原点的坐标在第一个索引中,A点的坐标在第二个索引中,B点的坐标在第三个索引中。您现在可以创建新的 2×2 曲面坐标集X,Y,Z包含点 B 的两个副本,这会导致仅渲染表面的一半(即包含所需三角形图像作为纹理贴图的一半)。这是执行此操作的代码:

index = [3 3; 1 2];  % Index used to create 2-by-2 surface coordinates
X = x(index);        % x coordinates of surface
Y = y(index);        % y coordinates of surface
Z = z(index);        % z coordinates of surface
hSurface = surf(X, Y, Z, triTexture, ...  % Plot texture-mapped surface
                'FaceColor', 'texturemap', ...
                'EdgeColor', 'none');
axis equal            % Use equal scaling on axes
axis([0 1 0 1 0 1]);  % Set axes limits
xlabel('x-axis');     % x-axis label
ylabel('y-axis');     % y-axis label
zlabel('z-axis');     % z-axis label

这是它创建的结果纹理贴图三角形表面,添加了一个插图以显示纹理贴图包含原始图像的正确三角形部分:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 MATLAB 中绘制纹理映射三角形? 的相关文章

  • 如何在 MATLAB 中绘制 3D 曲面图?

    我有一个像这样的数据集 0 1 0 2 0 3 0 4 1 10 11 12 13 2 11 12 13 14 3 12 13 14 15 4 13 14 15 16 我想在 matlab 中绘制 3D 曲面图 使列标题位于 y 轴 行标题
  • 如何在文本集中创建所有字符组合?

    例如 我有这样的文本集 第 1 栏 a b 第 2 栏 l m n 第 3 栏 v w x y 我想将它们组合起来以获得如下输出 alv alw alx aly amv amw amx amy 这将输出 24 种文本组合 如果我只使用前两列
  • 图像处理 - 使用 opencv 进行服装分割

    我正在使用 opencv 进行服装特征识别 第一步 我需要通过从图像中移除脸部和手来分割 T 恤 任何建议表示赞赏 我建议采用以下方法 Use 阿德里安 罗斯布鲁克的用于检测皮肤的皮肤检测算法 谢谢罗莎 格隆奇以获得他的评论 在方差图上使用
  • 如何在 MATLAB 中绘制纹理映射三角形?

    我有一个三角形 u v 图像中的坐标 我想在 3D 坐标处绘制这个三角形 X Y Z 与图像中的三角形进行纹理映射 Here u v X Y Z都是具有三个元素的向量 代表三角形的三个角 我有一个非常丑陋 缓慢且令人不满意的解决方案 其中我
  • matlab中求和函数句柄

    Hi我试图对两个函数句柄求和 但它不起作用 例如 y1 x x x y2 x x x 3 x y3 y1 y2 我收到的错误是 对于 function handle 类型的输入参数 未定义函数或方法 plus 这只是一个小例子 实际上我实际
  • MATLAB 列含义的内存分析

    我正在使用 MATLAB 配置文件来使用命令观察内存 profile memory on profile clear my code profile report and i got this table 1 我想问一下什么意思 已分配内存
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan
  • 加到 100 的随机数:Matlab

    我将人口数量分成不同的矩阵 现在想使用随机数测试我的代码 快速提问 谢谢你们提前的帮助 如果我使用 100 rand 9 1 使这 9 个数字相加等于 100 的最佳方法是什么 我想要 9 个 0 到 100 之间的随机数 加起来为 100
  • 射线与三角形相交

    我看到了快速最小存储射线 三角形交集 http www cs virginia edu gfx Courses 2003 ImageSynthesis papers Acceleration Fast 20MinimumStorage 20
  • 找到与圆相切的向量

    我需要围绕中心圆通过固定范数的向量移动一个点 因此 要做到这一点 我需要计算应用于我的点的圆切向量 Here is a descriptive graph 所以我知道p1坐标 圆半径和圆心 以及向量范数d 我需要找到 p2 找到向量 v 方
  • 小矩阵乘以大矩阵

    我试图将小矩阵 假设为 2x2 中的每个元素与大矩阵 假设为 4x4 中的每个位置逐个元素相乘 所以我想要 1 2 3 4 1 0 3 0 1 0 1 2 3 4 0 0 0 0 0 0 x 1 2 3 4 1 0 3 0 1 2 3 4
  • 如何让 CSS 字体与这个 Grails PDF 渲染插件一起使用?

    我正在使用 Grails 渲染插件来生成 PDF 我想在我的 PDF 中包含 CSS 以便更好地呈现它 我在上找到了一个例子渲染插件网站 http gpc github io grails rendering docs manual gui
  • 找到三角测量时覆盖另一个点的最近 3 个点的算法

    想象一张画布 周围随机分布着一堆点 现在选择其中一点 您如何找到距离它最近的 3 个点 这样如果您画一个连接这些点的三角形 它将覆盖所选点 澄清 我所说的 最近 是指到该点的最小距离总和 这主要是出于好奇 我认为 如果一个点未知 但周围的点
  • 使用嵌套 if 子句向量化循环

    Problem 我正在尝试优化代码的运行时 并且之前曾提出过类似的问题 其中包括几个嵌套的 if 语句 向量化嵌套 if 语句 https stackoverflow com questions 38125770 vectorizing n
  • Matlab:从一定范围内不重复的随机整数

    我想获得一个包含在范围内且不重复的随机整数的数组 我使用了 randperm 15 3 输出是 8 10 12 这个函数不使用范围 我只想从 10 中随机取值 例如 如果您有统计工具箱 则可以使用randsample https www m
  • 在 Matlab 中将变量命名为字符串 [重复]

    这个问题在这里已经有答案了 假设变量 FileName 包含一个字符串 例如 Name1 如何创建名称为 Name1 的变量 本页的示例 4 似乎很相似 但我无法让它工作 这是正确的做法吗 http se mathworks com hel
  • 了解截断二十面体的几何形状,以进行渲染

    我正在尝试使用可点击区域来渲染像上面这样的截断二十面体Three js http stemkoski github io Three js js Three js 我找到了正二十面体的代码 var t 1 Math sqrt 5 2 var
  • MATLAB 的函数 imfill() 导致错误

    我有一个二进制图像 720x1280 逻辑 其中有一些漏洞 所以我使用imfill来填充它 但是操作失败并且出现以下错误 Undefined function or variable eml assert all constant Erro
  • 如何为伪随机数生成器设置自定义种子

    我需要在使用的地方进行一些测试randn伪随机数生成器 我如何自己设置种子 以便每次运行此测试时都会得到相同的结果 是的 我知道这有点奇怪 但这就是问题所在 我找到了RANDSTREAM对象具有seed属性 但它是只读的 有什么方法可以用它
  • 一次设置多个字段/向单元结构添加新字段

    我有一个 1xn 结构 该结构包含一些带有数字单元格的字段 并非每个结构都具有相同的字段 所以我想将缺少的字段添加到结构中 但我没明白 Mimimal example I have same cells imported from csv

随机推荐

  • 如何为 HTML5 音频元素制作加载栏?

    我正在尝试为 HTML5 音频元素制作一个加载栏 显示加载 缓冲的百分比 对于视频标签 可以使用以下方法进行计算 video buffered end 0 video duration 但我无法让它与音频标签一起使用 它只是返回一个固定值
  • jQuery 验证日期范围问题

    我的代码中有很多地方有成对的相关开始和结束日期字段 范围 我需要验证开始日期早于结束日期 我正在使用 jQuery 验证插件 这是我的代码 http jsfiddle net jinglesthula dESz2 http jsfiddle
  • 在 PlayFramework 2 / Ebean ORM 中使用 @OneToOne,其中子级和父级共享相同的主键

    有两种型号 模型 User java Entity Table name users public class User extends Model Id public int user id public String firstName
  • 在 django 中处理图像上传表单:何时使用 save()、chunks() 和 clean_data?

    我已经使用以下代码成功上传了图像 views py from django conf urls defaults import from django http import HttpResponse HttpResponseRedirec
  • 如何向 vue 项目添加 Babel 对 nullish Coalescing Operator 的支持?

    在我的 Vue CLI 项目中 当我尝试使用 操作员 我收到此错误 语法错误 SyntaxError Users stevebennett odev freelancing v map src components Map vue gt 当
  • IE MIME/内容过滤

    我正在研究开发 IE6 扩展的方法 该扩展将允许处理自定义 MIME 类型 举个例子 我需要能够获取服务器返回的具有自定义 MIME 类型的文档 对其执行一些处理 然后将 MIME 类型更改回 IE 可以本机处理的类型 例如 text ht
  • 如何使用 Android 处理在 Google Cardboard 设备中显示立体图像?

    处理的目的是使使用 Java 绘图变得更加容易 Android 的处理功能具有桌面版的强大功能以及来自传感器的信息 将这些东西放在一起 显示立体图像并像 Oculus Rift 或 Google Cardboard 一样在其周围移动不是很容
  • Java 唤醒休眠线程

    我阅读了其他帖子 但没有找到我正在寻找的确切答案 所以我希望有人能给出一些澄清 我有一个将运行一段时间的程序 我有一些在后台运行的线程来执行各种任务 为了简单起见 让我们考虑 3 个线程 ThreadA每 10 秒执行一次任务 其中Thre
  • DispatcherTimer 未按时执行

    我正在使用 c 中的 DispatchTimer 编写一个时钟应用程序 但由于某些原因 我的时钟似乎时不时地跳过 1 秒 例如 52 秒 gt 54 秒 跳过 53 秒 在我看来 计时器并不是每秒都执行一次 DispatcherTimer
  • 为什么需要设置WORKON_HOME环境变量?

    我已经有一段时间没有使用 python 虚拟环境了 但我也安装了虚拟环境包装器 我的问题是 在文档页面中它说要这样做 export WORKON HOME Envs mkdir p WORKON HOME source usr local
  • C 中的变量定义是什么意思[重复]

    这个问题在这里已经有答案了 你们能告诉我 这在 C 中意味着什么吗 define Privileged Data Privileged Data static int dVariable 编译器对变量进行寻址有特殊意义吗 这只是一个宏Pri
  • 如何在 UITableView 中显示零行的表格

    我正在动态地将内容加载到 UITableView 中 如果有数据 表格需要显示数据 如果没有数据 表格应显示普通页面 但在我的应用程序中 表格显示带有两条分隔线的普通页面 我需要删除此分隔线并显示纯白色页面 请建议 任何帮助 将不胜感激 如
  • MongoRepository动态查询

    我有以下问题 假设我有以下模型对象 class Person String id String firstName String lastName Map
  • Laravel 验证规则仅针对字母

    我正在尝试添加验证规则以仅接受信件 我正在使用regex规则 但它仍然不起作用 下面是我的代码 Validate request input this gt validate request name gt required regex p
  • MVC 重定向到没有控制器的视图

    希望应该是一个简单的 我创建了一个通用错误视图 当整个站点的操作方法内发生异常时 我想显示该视图 我创建了一个部分页面 所有导航都位于其中 因此我不需要在此视图上使用控制器 那么如何从控制器内的操作方法重定向到它 像这样的东西 HttpPo
  • TFS 2015:上传自定义流程模板时出现版本错误

    我已经创建了一个基于敏捷流程的定制流程 并且已经完成了本文中提到的所有规定步骤 TFS 2015不会上传自定义流程模板 https stackoverflow com questions 31999557 tfs 2015 wont upl
  • MySQL 错误 1172 - 结果包含多行

    在存储过程中运行查询时 我从 MySQL 收到此错误 错误代码 1172 结果包含多行 我理解错误 我正在做一个SELECT INTO var list 因此查询需要返回单行 当我使用LIMIT 1 or SELECT DISTINCT 错
  • Google 电子表格中的换行符未在 Google 图表中输出

    这段代码工作完美 除了一个小格式问题 我找不到简单的方法来修复 作为数据源的谷歌电子表格在列中有换行符 然而 在表中 它们看起来好像只是由空格格式化的 我尝试在数据表中使用allowHthml选项 将换行符转换为标签 但这会删除所有格式并使
  • Mac OS X 上的 /proc/self/cmdline / GetCommandLine 等效项是什么?

    如何在不使用 argc argv 的情况下访问 Mac OS X 上的命令行 在 Linux 上 我会简单地阅读 proc self cmdline or use GetCommandLine在 Windows 上 但我找不到 Mac OS
  • 如何在 MATLAB 中绘制纹理映射三角形?

    我有一个三角形 u v 图像中的坐标 我想在 3D 坐标处绘制这个三角形 X Y Z 与图像中的三角形进行纹理映射 Here u v X Y Z都是具有三个元素的向量 代表三角形的三个角 我有一个非常丑陋 缓慢且令人不满意的解决方案 其中我