# 纹理映射与仿射变换 原

来来叔叔

OpenVG中可以使用投影变换（本例中为仿射变换）来实现图像的变形效果，进而可以用于纹理映射。

|sx shx tx|
|shy sy ty|
|0    0   1 |

(x y 1)'=T*(u v 1)'        (1)

u=(tx1 tx2 1),v=(ty1 ty2 1)表示纹理图像的三个顶点坐标
x=(x1 x2 1), y=(y1 y2 1)表示目标区域的三个顶点坐标

B=T*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]。

### 来来叔叔

opencv学习（二十二）重映射remap/仿射变换getRotationMatrix2D()//getAffineTransform//wapAffine()直方图均衡化equalizeHist()

qq_41553038
04/28
0
0

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 入门人工智能图像处理-图片移位

05/05
0
0

JAVA-四元数类

public class Quaternion { private final double x0, x1, x2, x3; // 四元数构造函数 public Quaternion(double x0, double x1, double x2, double x3) { this.x0 = ......

Pulsar-V
16分钟前
12
0
Xshell利用Xftp传输文件,使用pure-ftpd搭建ftp服务

Xftp传输文件 如果已经通过Xshell登录到服务器，此时可以使用快捷键ctrl+alt+f 打开Xftp并展示Xshell当前的目录，之后直接拖拽传输文件即可。 pure-ftpd搭建ftp服务 pure-ftpd要比vsftp简单，...

17分钟前
0
0

22分钟前
2
0
Confluence 6 文档主题合并问答

honeymose
51分钟前
2
0
java框架学习日志-2

6
0