Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 在GPU上围绕图像中心旋转图像_Image Processing_Gpu_Graphical Programming - Fatal编程技术网

Image processing 在GPU上围绕图像中心旋转图像

Image processing 在GPU上围绕图像中心旋转图像,image-processing,gpu,graphical-programming,Image Processing,Gpu,Graphical Programming,假设图像I的尺寸为2,2。图形坐标C如下所示: C = [[0, 0], [1, 0], [0, 1], [1, 1]] 目标:围绕中心而非原点旋转I 90度 变换矩阵: TRotate90=[[0,1],-1,0]] 假设每个坐标对可以在锁步中转换,即在GPU上 方法: 将图形坐标转换为以原点为图像中心的数学坐标。 应用变换矩阵。 转换回图形坐标。 例如: 转换为图形坐标: tx'=tx-宽度/2 C' =[[-1, -1], [0, -1], [-1, 0], [0,

假设图像I的尺寸为2,2。图形坐标C如下所示:

C = [[0, 0], [1, 0],
     [0, 1], [1, 1]]
目标:围绕中心而非原点旋转I 90度

变换矩阵:

TRotate90=[[0,1],-1,0]]

假设每个坐标对可以在锁步中转换,即在GPU上

方法:

将图形坐标转换为以原点为图像中心的数学坐标。 应用变换矩阵。 转换回图形坐标。 例如:

转换为图形坐标:

tx'=tx-宽度/2

C' =[[-1, -1], [0, -1],
     [-1, 0], [0, 0]]
ty'=ty-宽度/2

C' =[[-1, -1], [0, -1],
     [-1, 0], [0, 0]]
应用转换矩阵:

C" = [[-1, 1], [-1, -0],
      [0, 1], [0, 0]]
|-1|   | 0 1 0|   |-1|
|-1| X |-1 0 0| = | 1|
|0 |   | 0 0 1|   | 0|
转换回:

C" = [[0, 2], [0, 1],
      [1, 2], [1, 1]]
转换回已超出范围

我真的在努力让“重心”正确旋转。我认为我对“数学坐标”的转换是错误的

我更幸运的是将坐标转换为以下值:

C' =[[-1, -1], [1, -1],
     [-1, 1], [1, 1]]
通过观察,我实现了这个转换,如果原点位于四个像素之间,+vey轴向下,+vex轴向右,那么点0,0将是-1,-1,以此类推。由此产生的旋转和转换将得到所需的结果

但是,我找不到合适的变换来应用于坐标,从而将原点放置在中心。我尝试过使用齐次坐标的变换矩阵,但这不起作用

编辑

马尔科姆建议:

位置向量=

[0
 0
 1]
通过减去宽度进行平移/2==1:

[-1
 -1
 0]
通过乘以变换矩阵进行旋转:

C" = [[-1, 1], [-1, -0],
      [0, 1], [0, 0]]
|-1|   | 0 1 0|   |-1|
|-1| X |-1 0 0| = | 1|
|0 |   | 0 0 1|   | 0|

您需要在矩阵中增加一行,以便按x和y进行转换。然后向位置向量添加一个额外的列,称之为w,硬编码为1。这是一个确保可以使用标准矩阵乘法执行转换的技巧


由于需要先进行平移,然后进行旋转,因此需要设置平移矩阵,然后对旋转矩阵进行乘法,使它们都为3x3,如果矩阵乘法不稳定,则忽略最后一列。因此,平移和旋转将相互交织。

Hi Malcom。你的意思是在位置向量中有一个额外的行,所以[x,y,w],w=1?你的意思是在转换矩阵中增加一列和一行吗?你可以把你的点想象成列或行,所以如果你把它画成[x y w],它有列,如果你垂直画它,它有行。只要矩阵使用相反的行匹配列,反之亦然,这并不重要。不过,如果矩阵是正方形的,这可能会更容易理解。多亏了马尔科姆,结果很难转换回图形坐标。[-1,1,0]应该是图形坐标系中的点[0,1],因此需要另一个平移。矩阵为平移中心到原点*围绕原点旋转*平移原点到左上角。w被硬编码为1,而不是0。如果我将原点向后平移到左上角,点变成0,2超出边界。我真的很为难。