问题标签 [affinetransform]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1438 浏览

javascript - 如何将矩阵的旋转设置为围绕给定点的弧度绝对值?

我有一个用于仿射变换的 javascript Matrix 类,以及一个将旋转设置为围绕给定中心的绝对弧度数的函数:

我试图围绕对象本身的中心旋转,所以我传入对象宽度一半和高度一半的中心点,因此对于 100 x 100 对象,我传入 50、50。

如果我的对象从零旋转开始,则可以正常工作:

前 后

...但是如果我再次旋转形状,或者以非零的旋转开始,则 tx 和 ty 值最终会出错:

位置移动

我上面的公式有什么问题?设置旋转似乎是准确的,但不是 tx 和 ty。

我已经看到了关于这个主题的其他一些问题,特别是这个问题,但没有任何帮助。

更新要为此添加一些数字:

如果我从一个 100x100 的矩形开始,位于 100,100,那么我的初始矩阵是:{Matrix: [a:1, b:0, c:0, d:1, tx:100, ty:100]}

要将其顺时针旋转 45 度,我输入上述函数 0.7853981633974483(弧度为 45 度)和中心:{Point: [x:50, y: 50]}

这会产生以下矩阵: {Matrix: [a:0.7071067812, b:0.7071067812, c:-0.7071067812, d:0.7071067812, tx:150, ty:79.28932188]}完全正确。

{Point: [x:70.71067812000001, y: 70.71067812000001]}但是,如果我然后从该矩阵开始,并尝试通过提供函数参数 0 和(新的旋转形状的中心)将其返回为零,那么输出是{Matrix: [a:1, b:0, c:0, d:1, tx:150, ty:79.28932188]},这是正确的旋转但不是正确的翻译。我期待得到{Matrix: [a:1, b:0, c:0, d:1, tx:100, ty:100]}

我已经尝试了该函数的其他几种变体,包括使用父坐标空间 150,150 中的矩形中心而不是 50,50 的局部中心,并按照下面的建议将 += 替换为 =,但似乎没有任何帮助。如果我注释掉 tx 计算,那么我的形状会围绕它的原点完美旋转,所以问题必须与 tx/ty 计算有关,或者与我传入的中心点有关。

有没有人有任何进一步的想法?

0 投票
2 回答
3612 浏览

java - 在Java中拖动鼠标旋转和缩放

我正在尝试为 java 中的几何对象创建一个 Illustrator 样式选择框。

选择框

When the object is selected a border is drawn and it's possible to drag the little rectangles to re-size the object. 我还希望能够通过拖动来旋转框。

到目前为止,我可以缩放盒子并且可以旋转盒子,但我不能同时做这两个。想象一下,盒子呈 45 度角。当您拖动角以沿 x 方向放大框时,由于角度的原因,这将增加框的宽度和高度。

我可以通过使用它来工作:

但这仅在枢轴点位于左上角时才有效。我希望能够移动枢轴然后缩放和旋转。这个问题以前应该已经解决过很多次了。有没有办法可以使用仿射变换将鼠标绘制转换为旋转对象的坐标空间?我宁愿不必挖掘三角函数!提前致谢。

0 投票
1 回答
547 浏览

c++ - 椭圆面片之间的仿射变换

我是 OpenCV 的新手,我正在学习做一些图像处理。作为我项目的一部分,我遇到了将椭圆形式的图像补丁变形为目标椭圆的问题。据我了解,我需要计算两个补丁之间的仿射变换,然后将此转换扭曲到目标补丁中。浏览互联网寻求帮助,我没有找到一种方法来计算两个椭圆补丁之间的仿射变换。我在正确的轨道上吗?如果您能给我一些如何进行或在哪里寻找更多信息的建议,我将不胜感激。

0 投票
2 回答
1206 浏览

java - 根据条件更改 JSlider 的最小值和最大值

我正在 Netbeans 中创建一个 Swing GUI。此 GUI 的目的是打开(缓冲的)图像(在 JLabel 中作为图标)并对其应用仿射变换。现在有 4 个转换,我正在做如下。

在此处输入图像描述

现在,每个变换都需要两个滑块来更改 X 和 Y 值,旋转的除外,它只需要一个。我这样做是因为它比必须为所有 4 种类型的转换执行四个选项卡要好得多。我也希望它是这样的,例如,如果旋转图像,则可以通过从下拉列表中选择剪切来剪切相同的旋转图像。

问题是(是):我如何重绘标签图标并在同一个重绘图像上应用不同的变换?另外,如何根据所选效果更改 JSlider 的最小值和最大值?

0 投票
2 回答
4636 浏览

python - Python中的图像配准和仿射变换

我一直在阅读Jan Erik Solem 的Programming Computer Vision with Python,这是一本非常好的书,但是我无法澄清有关图像配准的问题。

基本上,我们有一堆图像(人脸)需要稍微对齐,所以首先需要通过相似变换执行刚性变换:

其中 x 是要通过旋转 R、平移 t 和缩放 s 转换为 x' 的向量(在这种情况下为一组坐标)。

Solem 为每个图像计算这个刚性变换,它返回旋转矩阵 R 和一个平移向量作为 tx 和 ty:

但是,出于某种原因,他重新排序了 R 的元素:

后来他进行了仿射变换

在这个例子中,这个仿射变换是在每个通道上执行的,但这并不相关。im[:,:,i]是要处理的图像,此过程返回另一个图像。

什么是T以及为什么我们在仿射变换中反转该矩阵?实现图像配准的通常步骤是什么?

更新

在这里,您可以在 Google 图书中找到此代码的相关部分。从第 67 页底部开始。

0 投票
0 回答
187 浏览

java - 用 Java 读取图像并执行仿射变换

所以对于一个类项目,我必须读取一个Image文件并执行Affine Transforms它。我使用类找到了如何使用 Complete Reference bool 中存在的信息来执行格式PixelGrabber。但是,我必须为许多图像执行此操作。

Affine Transforms课堂上,我如何将图像作为输入。它不接受二维数组作为输入。在这种情况下要给出的输入到底是多少?我必须获取图像reflectionrotation然后scaled up形成并保存它们。

0 投票
1 回答
875 浏览

rotation - 仿射变换旋转,缓冲图像被剪切

我正在制作游戏,最近遇到了使用仿射变换旋转缓冲图像时出现的问题。图像围绕它们自己的中心旋转。例如,当旋转 45 度时,朝上和朝左的角被切断,所有低于图像原始 x 或 y 位置的像素都不会显示。

这是我用于旋转缓冲图像的代码:

setRad() 根据 x 和 y 速度给出角度
startImage 是加载的图像
bImage 是返回到主类的图像。

我想出了一个解决这个问题的方法是放大图像文件,在它周围添加空白空间,这样我就不会使用被切割的角落。但这会降低一些性能,如果可能的话,我宁愿坚持使用适当的解决方案。希望一切都清楚!

//打鼾鸟

0 投票
1 回答
2775 浏览

java - 使用仿射变换摆动放大

我正在使用 JAVA swing 进行我的个人项目。

该项目是关于在窗口上绘制地图。

在此处输入图像描述

该地图可使用仿射变换进行缩放。我在这里遇到的问题是,每当我放大或缩小地图时,地图也会移动,而不是放大/缩小屏幕中心的地图点

0 投票
1 回答
1705 浏览

opencv - 查看仿射变换的结果

我试图找出原因,当我在 OpenCV 中的图像上应用仿射变换时,它的结果在预览窗口中不可见,但整个窗口都是黑色的。我怎样才能找到解决这个问题的方法,以便我无论应用了何种变换,都可以在窗口中查看我的变换图像(仿射变换的结果)吗?
更新:我认为发生这种情况是因为所有转换都是相对于坐标系的原点(图像的左上角)计算的。虽然对于旋转,我可以指定旋转的中心,并且我可以查看结果,但当我执行缩放时,我无法控制转换后的图像的去向。是否可以以某种方式移动坐标系以使图像适合窗口?

Update2:我有一个图像,其中某个位置仅包含 ROI(图像的其余部分为黑色),我需要对其应用一组仿射变换。为了让事情变得更简单并查看每个单独变换的效果,我一个一个地应用了每个变换。我注意到的是,每当我移动(平移)图像以使 ROI 的中心位于坐标系的中心(视图窗口的左上角)时,所有仿射变换都会在不移动的情况下正确执行。但是,通过在坐标系的中心平移 ROI 的中心,ROI 的上半部分和左半部分仍然被切出当前视图窗口。如果我将 ROI 的中心点移动到视图窗口中的另一个点(例如窗口中心),则会出现以下类型的仿射变换: A=[a 0 0; 0 b 0] (A 是 2x3 矩阵,warpAffine 函数的参数)将图像 (ROI) 移动到视图窗口之外(如果 ROI 的中心位于左上角,则不会发生这种情况)。如何修改仿射变换以使图像不会移出其位置(与 ROI 中心位于坐标系中心时的行为相同)?

0 投票
1 回答
1187 浏览

ios - 从两个 UIView 中的每一个中的三个点计算 CGAffineTransform 的值?

我有两个UIViews,每个都包含一个对象的视觉表示。我CGPoint在每个中都有三个已知的 s,UIView它们对应于该对象上的相同位置。我需要对其中一个视图应用变换,以便这三个点与另一个视图中的对应点完美对齐。

我需要处理缩放、旋转和平移,即仿射变换,并且我知道计算这种平移的参数的数学方法(参见这个问题)。我不明白的是如何在 Obj-C 中实际执行这些计算并将正确的数字插入CGAffineTrasnformMake. 看起来应该很明显,但出于某种原因,我认为我只是在这里遗漏了一些概念。

所以简而言之,给定 A 中CGPoint的 s (X1a,Y1a), (X2a,Y2a), (X3a,Y3a)UIView和 B 中的 (X1b,Y1b), (X2b,Y2b), (X3b,Y3b) UIView,怎么办我这样做是为了让自己 ACGAffineTransform我可以申请UIViewB 吗?所以它与UIViewA对齐?

顺便说一下,我的部署目标是 iOS 5;我不需要更早地支持任何东西。

谢谢!