文档章节

纹理映射与仿射变换

来来叔叔
 来来叔叔
发布于 2017/08/04 23:57
字数 570
阅读 7
收藏 0
 

OpenVG中可以使用投影变换(本例中为仿射变换)来实现图像的变形效果,进而可以用于纹理映射。
为简单起见只考虑三角形到三角形的映射。
变换矩阵T为:
|sx shx tx|
|shy sy ty|
|0    0   1 |
其中sx,sy表示伸缩,shx,shy表示变形,tx,ty表示位移。
设纹理图像中的坐标为(u,v),目标区域中的坐标表示为(x,y),则纹理映射即是从纹理图像到目标区域坐标的转换:
(x y 1)'=T*(u v 1)'        (1)
其中
u=(tx1 tx2 1),v=(ty1 ty2 1)表示纹理图像的三个顶点坐标
x=(x1 x2 1), y=(y1 y2 1)表示目标区域的三个顶点坐标
我们需要把变换矩阵T求出来。为简洁起见,(1)式简写为
B=T*A
则 T=B*inv(A)
而inv(A)=A*/|A|
其中inv(A)表示A的逆矩阵
A*表示A的伴随矩阵
|A|表示A的行列式

//求变换矩阵T的代码

void vg_GetTexTransMatrix(short x1, short y1, short x2, short y2, short x3, short y3, 
                          short tx1, short ty1, short tx2, short ty2, short tx3, short ty3)

{

       //求行列式|A|
       int detA;
       detA = tx1*ty2 + tx2*ty3 + tx3*ty1 - tx3*ty2 - tx1*ty3 - tx2*ty1;      

       // 求伴随矩阵A*
       int A11,A12,A13,A21,A22,A23,A31,A32,A33;
       A11 = ty2 - ty3;
       A21 = -(ty1 - ty3);
       A31 = ty1 - ty2;
       A12 = -(tx2 - tx3);
       A22 = tx1 - tx3;
       A32 = -(tx1 - tx2);
       A13 = tx2*ty3 - tx3*ty2;
       A23 = -(tx1*ty3 - tx3*ty1);
       A33 = tx1*ty2 - tx2*ty1;      

     //求变换矩阵T
       float texMatrix[9]={0};
       texMatrix[0] = (x1*A11 + x2*A21 + x3*A31)/detA;//t11
       texMatrix[1] = (y1*A11 + y2*A21 + y3*A31)/detA;//t21
       texMatrix[2] = (   A11 +    A21 +    A31)/detA;//t31
       texMatrix[3] = (x1*A12 + x2*A22 + x3*A32)/detA;//t12
       texMatrix[4] = (y1*A12 + y2*A22 + y3*A32)/detA;//t22
       texMatrix[5] = (   A12 +    A22 +    A32)/detA;//t32
       texMatrix[6] = (x1*A13 + x2*A23 + x3*A33)/detA;//t13
       texMatrix[7] = (y1*A13 + y2*A23 + y3*A33)/detA;//t23
       texMatrix[8] = (   A13 +    A23 +    A33)/detA;//t33
}


 

PS:仿射变换与投影变换都会将直线映射为直线,但仿射变换把直线上等距分布的点映射为等距分布的点,投影变换则不一定(Both affine and projective transformations map straight lines to straight lines. However, affine transformations map evenly spaced points along a source line to evenly   spaced points   in   the   destination, whereas...)。当为仿射变换时,数学上表现为变换矩阵中的齐次项[w0,w1,w2]等于[0 0 1]。

© 著作权归作者所有

共有 人打赏支持
来来叔叔
粉丝 0
博文 100
码字总数 55732
作品 0
广州
高级程序员
opencv学习(二十二)重映射remap/仿射变换getRotationMatrix2D()//getAffineTransform//wapAffine()直方图均衡化equalizeHist()

重映射remap() 重映射实例(多重映射见书304,其实就是调用子函数的swtich语句,更改mapx,mapy的值来改变重映射形式) 仿射变换 实质就是先用getRotationMatrix2D()或getAffineTransform函数求...

qq_41553038
04/28
0
0
仿射变换实现组合操作 抠图+缩放+旋转

前言 之前在工作中需要用仿射变换的方式来实现,用给定的bounding box(标注框)从一张图片 中扣出特定的区域,然后做旋转和缩放等特定操作。然后在网上搜索了一下与仿射变换相关的资料, 看...

萤火的萤火
08/29
0
0
OpenCV图像处理车牌检测与定位应用

1.车牌颜色分布(HSV空间,YCrCb空间的没有颜色分布图谱,无法实验);利用HSV的H通道,效果一般,受环境影响大。 #include "highgui.h" include "cv.h" include <stdio.h> include <math.h>...

moki_oschina
2016/04/08
241
0
c语言数字图像处理(三):仿射变换

仿射变换及坐标变换公式 几何变换改进图像中像素间的空间关系。这些变换通常称为橡皮模变换,因为它们可看成是在一块橡皮模上印刷一幅图像,然后根据预定的一组规则拉伸该薄膜。在数字图像处...

GoleBeetle
09/18
0
0
6- OpenCV+TensorFlow 入门人工智能图像处理-图片移位

图片移位 opencvAPI实现 算法原理 源代码实现 原始图片和移位后图片 图片位移的算法原理 分析api实现原理 分析像素移动实现原理 偏移矩阵 完成矩阵的运算 输入的xy定义为C 结果: (10,20)->(1...

天涯明月笙
05/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

根据进程名称杀死进程

ps -ef | grep keyword | grep -v grep | awk '{print $2}' | xargs kill -9 逐个分析: 1, ps -ef | grep keyword: 查出进程名含有 keyword 的所有进程; 2, grep -v grep: 从这些结果里面,把......

vinci321
35分钟前
1
0
nginx的简单使用:负载均衡

nginx:反向代理的服务器;用户发送请求到nginx,nginx把请求发送给真正的服务器,等待服务器处理完数据并返回,再把数据发送给用户。 nginx作为一个反向代理服务器,能缓存我们项目的静态文...

osliang
50分钟前
2
0
网站title标题被改并被百度网址安全中心提醒的解决办法

国庆假日期间我们Sine安全接到众多网站站长求助网站标题被改导致在百度搜索中百度安全中心提醒被拦截,导致网站正常用户无法浏览网站被跳转到一些菠菜du博网站,而且很明显的一个特征就是在百...

网站安全
52分钟前
1
0
JDK版本与major.minor version的对照关系

其实,只需要记住jdk6对于major.minor version 50即可,其他版本自行计算即可。 ---------------------

码代码的小司机
55分钟前
1
0
C++基础教程面向对象学习笔记及心得感悟[图]

C++基础教程面向对象学习笔记及心得感悟[图] 使用友元函数重载算术运算符: C ++中一些最常用的运算符是算术运算符 - 即加号运算符(+),减运算符( - ),乘法运算符(*)和除法运算符(/...

原创小博客
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部