- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设我有一个 2x2 矩阵,其中填充了代表一个平面的值。现在我想在“z 方向”上以 3-D 方式围绕自身旋转飞机。为了更好地理解,请参见下图:
我想知道这是否可以通过一个简单的仿射矩阵实现,因此我创建了以下简单脚本:
%Create a random value matrix
A = rand*ones(200,200);
%Make a box in the image
A(50:200-50,50:200-50) = 1;
现在我可以简单地通过旋转矩阵在二维房间中应用变换,如下所示:
R = affine2d([1 0 0; .5 1 0; 0 0 1])
tform = affine3d(R);
transformed = imwarp(A,tform);
但是,这不会产生上述所需的输出,而且我不太确定如何创建二维仿射矩阵来创建此类行为。
我想 3-D 仿射矩阵可以解决问题。但是,如果我定义一个 3-D 仿射矩阵,我将无法再使用该矩阵的 2-D 表示,因为 MATLAB 会抛出错误:
The number of dimensions of the input image A must be 3 when the
specified geometric transformation is 3-D.
那么如何使用仿射矩阵对所需的输出进行编码?
最佳答案
answer from m3tho正确地说明了您将如何应用您想要的转换:使用 fitgeotrans
用'projective'
transform ,因此要求您指定 4 个控制点(即输入和输出图像中的 4 对对应点)。然后,您可以使用 imwarp
应用此转换.
那么,问题是如何您选择这些点对来创建所需的转换,在本例中是创建一个 perspective projection .如下所示,透视投影考虑到观察位置(即“相机”)将具有定义圆锥视野的给定视角。通过获取此锥体内的所有 3-D 点并将它们投影到观察平面上来渲染场景,观察平面是位于相机目标处的平面,该平面垂直于连接相机及其目标的线。
让我们首先假设您的图像位于观察平面中,并且角由标准化引用框架描述,因此它们在每个方向上都跨越 [-1 1]
。我们需要首先通过选择视角来选择我们想要的透视度,然后计算相机和观察平面之间的距离。 45度左右的视角可以模拟正常人眼的透视感,所以用观察平面的角定义圆锥视野的边缘,我们可以计算相机距离如下:
camDist = sqrt(2)./tand(viewAngle./2);
现在我们可以使用它来生成一组用于转换的控制点。我们先申请一个3-D rotation到观察平面的角点,围绕 y 轴旋转一定量 theta
。这会将它们旋转出平面,因此我们现在通过定义从相机穿过每个旋转角点的线和 finding the point where it intersects the plane 将角点投影回观察平面。 .我将省去数学推导(您可以从上面链接中的公式自己实现它们),但在这种情况下,一切都简化为以下一组计算:
term1 = camDist.*cosd(theta);
term2 = camDist-sind(theta);
term3 = camDist+sind(theta);
outP = [-term1./term2 camDist./term2; ...
term1./term3 camDist./term3; ...
term1./term3 -camDist./term3; ...
-term1./term2 -camDist./term2];
并且 outP
现在包含输出图像中的标准化控制点集。给定大小为 s
的图像,我们可以创建一组输入和输出控制点,如下所示:
scaledInP = [1 s(1); s(2) s(1); s(2) 1; 1 1];
scaledOutP = bsxfun(@times, outP+1, s([2 1])-1)./2+1;
您可以像这样应用转换:
tform = fitgeotrans(scaledInP, scaledOutP, 'projective');
outputView = imref2d(s);
newImage = imwarp(oldImage, tform, 'OutputView', outputView);
您可能会遇到的唯一问题是旋转 90 度(即从图像平面的端部看)会产生一组共线点,这会导致 fitgeotrans
出错。在这种情况下,从技术上讲,您只需要一张空白图像,因为从侧面看时您看不到二维对象。
下面是一些代码,通过动画旋转图像来说明上述转换:
img = imread('peppers.png');
s = size(img);
outputView = imref2d(s);
scaledInP = [1 s(1); s(2) s(1); s(2) 1; 1 1];
viewAngle = 45;
camDist = sqrt(2)./tand(viewAngle./2);
for theta = linspace(0, 360, 360)
term1 = camDist.*cosd(theta);
term2 = camDist-sind(theta);
term3 = camDist+sind(theta);
outP = [-term1./term2 camDist./term2; ...
term1./term3 camDist./term3; ...
term1./term3 -camDist./term3; ...
-term1./term2 -camDist./term2];
scaledOutP = bsxfun(@times, outP+1, s([2 1])-1)./2+1;
tform = fitgeotrans(scaledInP, scaledOutP, 'projective');
spinImage = imwarp(img, tform, 'OutputView', outputView);
if (theta == 0)
hImage = image(spinImage);
set(gca, 'Visible', 'off');
else
set(hImage, 'CData', spinImage);
end
drawnow;
end
这是动画:
关于image - 在 MATLAB 中围绕其中心旋转图像矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47273993/
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: How to align a to the middle of the page 这是一个简单的问题,应该有一个简
我想知道如何在屏幕中央的ListView中生成2个itens。 class _CategoriesState extends State { List categories = ["Anterio
我需要修复 UICollectionView 的一个小问题,当在 6s 设备尺寸上时,我得到如下布局: 但是,我想知道将它们居中以使其成为两条线的最佳方法是什么,或者我应该将它们缩小一点以便可以放置其
我尝试在 UIImageView 中居中 CAShapeLayer 但没有成功,我找到了解决方案,将其(CAShapeLayer)添加到 UIVIew,然后将 UIVIew 添加到 ImageView
一直在从线性布局和相对布局切换,因为我想实现图像的居中。 显示图片:
* { margin:0; padding:0; } /** General Style Info **/ body { background: #003d4c; co
我目前正在尝试修改我在 Wordpress 上的 Royal Slider 插件 (http://dimsemenov.com/plugins/royal-slider/) 我的目标是将所有标题的文本
我已经坚持了一段时间,因此简化了我的要求。当您单击标记时,信息窗口将打开,当用户缩放时,我希望该标记位于 map 的中心。这不起作用,但我认为它很接近: function bindInfoWindow
/* Linked Styles */ body { padding: 0 !important;
这个问题在这里已经有了答案: How do I center floated elements? (12 个答案) 关闭 7 年前。
这个问题在这里已经有了答案: Is there an equivalent to background-size: cover and contain for image elements? (1
我试图让我的页眉停留在页面的中间,不管我在什么窗口大小。 我试过使用 Bootstrap。 StackOverflow 还有这个 CSS。 .section-t
我有一个 1600 像素宽的页面。主要区域虽然只有 900 像素宽。我有一个导航应该固定在页面的中心(它是)。我的问题是当我打开页面时,页面固定在左侧而不是在打开时居中。当用户访问该网站时,我需要做什
我正在尝试找到 View 的中心。对于非旋转 View ,该值是正确的,但对于旋转 View ,它不正确,因为中心 (0,0) 正在旋转。在缩放的情况下,即使缩放后宽度和高度也保持不变 我正在使用以下
预期效果是将 Kartennummer 和 Passwort 集中。 这怎么可能? 我为此使用了一个自定义类: import 'package:flutter/material.dart'; impo
我管理着许多 Maven 项目。他们中的大多数部署到我们的内部 maven 存储库。现在我想开始向 Maven Central 发布一个项目。到目前为止,我有一个父 POM,它指定了我们内部存储库的
我试图锚定两个进展,但我看不到获得预期结果的方法。 我希望左边的进度条固定在左边,右边的条固定在中心固定(如下图所示) (下图显示调整大小的表格) 我尝试将控件放在具有各种 anchor 的停靠面板上
我正在玩 Angular 模态 ui 对话框。我想知道有什么方法可以让它居中?我发现了一个类似的问题: Twitter Bootstrap - Center Modal Dialog 但无法使其工作,
是否可以将值标签放置在条形上,使它们位于条形的中心? 如果我设置条形 align: "center",则条形上的标签将关闭且不居中。 $(function() { var d
http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/tutorial-signalr-20-s
我是一名优秀的程序员,十分优秀!