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]。

转载于:https://my.oschina.net/tofro/blog/1503118

OpenVG中可以使用投影变换(本例中为仿射变换)来实现图像的变形效果,进而可以用于纹理映射。 为简单起见只考虑三角形到三角形的映射。 变换矩阵T为: |sx shx tx| |shy sy ty| |0 0 1 | 其中sx,sy表示伸缩,shx,shy表示变形,tx,... 创建可以轻松用作 Web UI 的图像变形效果! 变形 EC 网站上模特照片的幻灯片。 如果给两个或多个图像对应的点(例如,人脸的位置分别是),它们就会被变形。这可以通过将纹理映射的图像变换和改变透明度的淡入/淡出相结合来实现(我认为)。 这是通过将图像分成多个三角形,通过仿射变换扭曲每个三角形并绘制来实现的。 上面的许多例子都很简单,因为它们使用了以网格模式排列的三角形,但我想在任何一点分割图像(我想用任意坐标的三角形分割它)。 需要从三点变换前后的坐标求出仿射变换矩阵。这是参照。 如果要在纹理映射期间从任意点生成要分割的三角形(单击)将使用德劳内图(德劳内三角分割)。 Delaunay图的实现比较复杂(我尽力了也可以自己写,但是很烦人的水平),所以决定用d3.js的方法。 变形滑块.js MorphingSliderJS 是使用 Java /* 定义顶点的次序是大写的反N字形,这样根据绘制三角形规则刚好构成矩形 */ float vertices[] = { -1.0f, 1.0f, 1.0, 0, 0, //0左上 -1.0f, -1.0f, 1.0, 0, 1, //1左下 1.0f, 1.0f, 1.0, 1, 0, //2右上 1.0f, -1.0f, 1.0, 1, 1, //3右下 上一篇是通过绘图方式得到的立方体,没有贴图,这次加上纹理贴图。 通过纹理贴图有两种方案: 1、图片分割化,即是把一张完整的全景图片(就是支持720度全景图片)人工的分隔成前后左右上下六张图片(静态),然后分别加载这六张图片; 2、数据分割化,即是保留一张完整的全景图片,加载图片以后,对图片数据进行上下左右前后进行数据切割,或者应...
图像仿射变换(Affine Transformation)是指在二维平面中对一幅图像进行线性变换的过程,包括平移、旋转、缩放和剪切等操作。在Matlab中,可以使用affine2d函数来进行仿射变换。 以下是一个简单的Matlab示例代码,演示如何对一幅图像进行平移和旋转变换: ```matlab % 读取图像 img = imread('image.png'); % 定义变换矩阵 angle = 30; % 旋转角度 tx = 50; % 水平平移量 ty = 20; % 垂直平移量 scale = 1.2; % 缩放比例 tform = affine2d([scale*cosd(angle) scale*sind(angle) 0; -scale*sind(angle) scale*cosd(angle) 0; tx ty 1]); % 执行仿射变换 imgTransformed = imwarp(img, tform); % 显示结果 figure, imshow(imgTransformed); 其中,定义了一个3x3的仿射变换矩阵tform,包括旋转、平移和缩放操作。然后使用imwarp函数执行仿射变换,得到变换后的图像imgTransformed,并使用imshow函数显示结果。 需要注意的是,仿射变换是一个复杂的过程,需要根据具体情况选择不同的变换方法,并进行适当的参数调整。同时,在进行仿射变换前,需要对图像进行预处理和特征提取,以获得更好的变换效果。