文档章节

纹理映射与仿射变换

来来叔叔
 来来叔叔
发布于 2017/08/04 23:57
字数 570
阅读 3
收藏 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
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
6- OpenCV+TensorFlow 入门人工智能图像处理-图片移位

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

天涯明月笙
05/05
0
0
iPhone之Quartz 2D系列--变换(5)Transforms

以下几遍关于Quartz 2D博文都是转载自:http://www.cocoachina.com/bbs/u.php?action=topic&uid=38018 苹果官网英语介绍:https://developer.apple.com/library/mac/documentation/GraphicsI......

长平狐
2013/12/25
38
0
【OpenCV3.3】通过透视变换矫正变形图像

在平面图像处理中,因为镜头角度等原因,容易导致图像出现倾斜、变形等情况,为了方便后续处理我们常常需要进行图像矫正,其中主要技术原理是两种变换类型--仿射变换(Affine Transformation)...

wjf1997
2017/08/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

spring 事件

ContextRefreshedEvent Event raised when an {@code ApplicationContext} gets initialized or refreshed. ContextClosedEvent Event raised when an {@code ApplicationContext} gets clos......

Canaan_
30分钟前
1
0
leetcode两数之和

leetcode中求两数之和解决方法 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。 给定 nums = [2, 7, 11, ...

lar555
46分钟前
1
0
js实现限制网页内容复制

转载 在我们做的网页发到网上后,如果访客看到比较喜欢的内容,只要复制就可以变为自己的,自己辛辛苦苦弄半天还不及人家的一下复制,有时为了只让访客看到,而不能让它们复制内容,就用Jav...

lc_comeon
51分钟前
1
0
jenkins将spring boot项目发布到阿里云镜像中

1、spring boot项目 1.1 pom.xml配置 <artifactId>xxx-docker</artifactId><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.......

xixingzhe
今天
0
0
qsv格式可以在电视上播放吗

  大家都知道qsv格式是爱奇艺的独家缓存格式,是加密的,一般的播放器是无法播放的,只能在爱奇艺播放器上播放,如果想要在电视上播放,就必须要安装爱奇艺播放器,比较麻烦。其实还有一种...

萤火的萤火
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部