我一直在使用Affine Transform在我的java项目中旋转一个String,而我还不是一个经验丰富的程序员,所以我花了很长时间做一个看似很小的任务.旋转一个字符串.
现在我终于得到了或多或少的工作,正如我所希望的那样,除非它没有像我想要的那样精确地完成......
由于经过了大量的反复试验并阅读了仿射变换的描述,我仍然不太清楚它到底是做什么的.我想我现在所知道的是,我取一个字符串,并定义字符串的中心(或我想要旋转的点),但是矩阵在哪里?(显然我不知道嘿嘿)
任何人都可以试着向我解释仿射变换是如何工作的,换句话说就是java doc?也许它可以帮助我调整我的实现,而且,我真的很想知道:)
提前致谢.
我有两个2D三角形(即,它们都位于平面中),并且想要找到将它们中的一个最接近地映射到另一个上的相似性变换(旋转+缩放+平移).
这两个三角形实际上并不相似,所以我只想让变换尽可能地对齐它们.
我知道我可以在两个三角形之间创建一个仿射变换,它将精确地映射到另一个三角形,但我不想要仿射变换中存在的剪切效果.我希望我的变换只由翻译,旋转和缩放组成.
知道怎么做吗?
我想将刚体变换应用于大量的二维图像矩阵.理想情况下,我希望能够提供一个指定平移和旋转的仿射变换矩阵,一次应用,然后在输出上进行三次样条插值.
不幸的是,似乎affine_transform
在scipy.ndimage.interpolation
没有做翻译.我知道我可以使用的组合shift
和rotate
,但是这是一种混乱和在涉及到多次插值输出.
我也试过使用这样的泛型geometric_transformation
:
import numpy as np
from scipy.ndimage.interpolation import geometric_transformation
# make the affine matrix
def maketmat(xshift,yshift,rotation,dimin=(0,0)):
# centre on the origin
in2orig = np.identity(3)
in2orig[:2,2] = -dimin[0]/2.,-dimin[1]/2.
# rotate about the origin
theta = np.deg2rad(rotation)
rotmat = np.identity(3)
rotmat[:2,:2] = [np.cos(theta),np.sin(theta)],[-np.sin(theta),np.cos(theta)]
# translate to new position
orig2out = np.identity(3)
orig2out[:2,2] = xshift,yshift
# the final affine matrix is just the product
tmat = np.dot(orig2out,np.dot(rotmat,in2orig))
# function that maps …
Run Code Online (Sandbox Code Playgroud) 我应该如何将CoreGraphics CGAffineTransform解释为人类可读,有意义的格式?
我想采取类似的方式:
NSLog(@"naturalSize %@, appliedSize %@, transformationMatrix %@",
NSStringFromCGSize(clipVideoTrack.naturalSize),
NSStringFromCGSize(CGSizeApplyAffineTransform(clipVideoTrack.naturalSize, clipVideoTrack.preferredTransform)),
NSStringFromCGAffineTransform(clipVideoTrack.preferredTransform));
Run Code Online (Sandbox Code Playgroud)
naturalSize {1920,1080},appliedSize {-1080,1920},transformationMatrix [0,1,-1,0,1080,0]
上述矩阵变换的最终结果是采用这种风景右视频并转换为此纵向视频
我很高兴能够将其分解为人类可读形式的步骤,以便人们可以看到并理解转换实际上在做什么.
有点像(不确定我是否正确的步骤):
0. Will use upper left corner for video export of width 1080, height 1920.
1. Will move the video -1080(left) on the x axis
2. Will move the video 1920(down) on the y axis
3. Will rotate 90deg clockwise from bottom right corner
Run Code Online (Sandbox Code Playgroud)
对于执行此操作的代码或实现或解释,我将不胜感激.我试图学习并理解AVFoundation上下文中转换矩阵究竟是如何运作的.
transformation avfoundation affinetransform cgaffinetransform ios
我在图像中检测到一个显着区域,我执行了一系列操作,最重要的是仿射归一化(将椭圆转换为圆形,将梯形转换为等边矩形).
仿射归一化是矩阵中剪切和缩放的组合,如下所示:
Chol=[a,b
0,c]
Run Code Online (Sandbox Code Playgroud)
a,[0,1]中的c和[-1,1]中的b(对于那些感兴趣的人,它是检测到的区域的协方差矩阵的Cholesky分解的逆矩阵).
一切正常,直到这里,但是当我将变换应用到原始帧时
AffineFrame=cv.warpAffine(RealFrame,[Chol,[0;0]],...
'DSize',[RealFrameSize(1),RealFrameSize(2)]);
% that's dst=cv.warpAffine(src,trafo) with trafo: 2x3 Matrix (here Chol and [0,0] translation)
Run Code Online (Sandbox Code Playgroud)
我得到一个未缩放的图像,转换和图像大小: .
我真正想要的是 - 并且通过这条线的试错来实现这个特定的框架
AffineFrame=cv.warpAffine(RealFrame,[Chol,[0;0]]*S,...
'DSize',[RealFrameSize(1)*X,RealFrameSize(2)*Y]);
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
.
我知道问题在于缩放S
,X
和Y
.如果有人知道如何计算这个,你将节省我回到学校几何的漫长旅程!(我已经拥有了可以从第二个图像时刻中提取的所有几何信息,如市长和短轴,各自的幅度,偏心率等等.)
编辑:一些典型值(不一定是这种情况):
Chol = 0.43 -0.23
0 0.67
Run Code Online (Sandbox Code Playgroud)
这个想法我有X
和Y
:与L
和W
主轴线和次轴线的大小(变化很大,这取决于形状通常约5和50):
X=(1+L/(L+W));
Y=(1+W/(L+W));
Run Code Online (Sandbox Code Playgroud)
仅当剪切Chol
不大时才有效.S
取决于形状,在5到30之间做得很好.
我想在某些单独的(x,y)点上使用与在cv2.warpAffine图像上使用的相同的仿射矩阵M。看来cv2.transform是要走的路。当我尝试发送Nx2的点矩阵时,我感到很沮丧(
src = np.array([
[x1,y1],[x2,y2],[x3,y3],[x4,y4]], dtype = "float32")
print('source shape '+str(src.shape))
dst=cv2.transform(src,M)
cv2.error: /home/jeremy/sw/opencv-3.1.0/modules/core/src/matmul.cpp:1947: error: (-215) scn == m.cols || scn + 1 == m.cols in function transform
Run Code Online (Sandbox Code Playgroud)
我可以使用numpy算术获得所需的转换:
dst = np.dot(src,M[:,0:2]) +M[:,2]
print('dest:{}'.format(dst))
Run Code Online (Sandbox Code Playgroud)
但是想了解发生了什么。文档说cv2.transform想要的通道数等于M中的列数,但我不清楚通道是什么-也许是'x'通道和'y'通道,但是第三个通道是,不同的行表示什么?
我在PIL python库中遇到了im.transform方法的问题.我认为我弄清了参数A到F的逻辑,然而,尽管由波纹管函数计算的所有四个角都具有正确的正值,但是所得到的图像在错误的方向上旋转并被切断.
有人可以给我公式来计算两个坐标系中三个相同点的仿射参数(A到F)吗?
def tran (x_pic, y_pic, A, B, C, D, E, F):
X = A * x_pic + B * y_pic + C
Y = D * x_pic + E * y_pic + F
return X, Y
Run Code Online (Sandbox Code Playgroud) 我正在Netbeans中创建一个Swing GUI.此GUI的目的是打开(缓冲)图像(在JLabel中作为图标)并在其上应用仿射变换.现在有4个转换,我正在做如下.
现在,每个变换需要两个滑块才能更改X和Y值,但旋转除外,只需要一个.我这样做是因为它比为所有4种类型的变换做四个选项卡要好得多.另外,我希望它是这样的,例如,如果旋转图像,可以通过从下拉列表中选择剪切来剪切相同的旋转图像.
问题是(是):如何重新绘制标签图标并对同一重新绘制的图像应用不同的变换?另外,如何在所选效果上更改JSlider depanding的最小值和最大值?
我正在使用 AffineTransforms 来旋转体积。我现在对旋转角度的符号感到困惑。对于右手系统,当向下看一个轴时,比如 Z 轴,逆时针旋转 XY 平面应该是正角。我定义了一个旋转矩阵r = [0.0 -1. 0.0; 1.0 0.0 0.0; 0.0 0.0 1.0]
,就是沿Z轴逆时针旋转90度。实际上,r * [1 0 0]'
给出 [ 0 1 0]'
,它将 X 轴旋转到 Y 轴。
现在我定义一个体积 v。
3×3×3 Array{Float64,3}:
[:, :, 1] =
0.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
[:, :, 2] =
0.0 0.0 0.0
1.0 0.0 0.0
0.0 0.0 0.0
[:, :, 3] =
0.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
Run Code Online (Sandbox Code Playgroud)
然后我定义tfm = …
我正在尝试使用 pytorch 在 3D 体积上执行刚性+缩放变换,但我似乎无法理解 torch.nn.function.affine_grid 所需的 theta 是如何工作的。
我有一个大小为 (1,4,4) 的变换矩阵,是通过矩阵平移 * 缩放 * 旋转相乘生成的。例如,如果我在 scipy.ndimage.affine_transform 中使用此矩阵,它可以正常工作。然而,相同的矩阵(裁剪为大小(1,3,4))在torch.nn.function.affine_grid 中完全失败。
我已经设法理解翻译是如何工作的(范围 -1 到 1),并且我已经通过简单地将值标准化到该范围来确认翻译矩阵的工作原理。至于另外两个,我迷路了。
我尝试单独使用基本的缩放矩阵(如下)作为最基本的比较,但 pytorch 中的结果与 scipy 中的结果不同
Scaling =
[[0.75, 0, 0, 0],
[[0, 0.75, 0, 0],
[[0, 0, 0.75, 0],
[[0, 0, 0, 1]]
Run Code Online (Sandbox Code Playgroud)
如何将 (1,4,4) 仿射矩阵转换为与 torch.nn.function.affine_grid 相同的工作方式?或者,有没有办法根据变换参数(移位、欧拉角、缩放)生成正确的矩阵?