python中的3D图像旋转

2024-02-12

我有以下图像 I1。我没有捕捉到它。我从谷歌下载的

我将已知的单应性 h 应用到 I1 以获得以下图像 I2。

我想假设相机拍摄了上面这张 I2 的照片。我找到了这个“相机”的相机矩阵。令这个相机矩阵为k。现在,我想围绕相机轴旋转该图像 I2。根据已接受答案中的解释这个问题 https://stackoverflow.com/questions/47990350/python-rotate-image-about-camera-axis,我需要设置旋转矩阵R然后执行k*R*inv(k)*h在图像 I1 上得到所需的旋转图像 I3。

当我尝试设置这个旋转矩阵 R 时,我一直遇到问题。我使用过这个方法 https://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle设置矩阵 R。

为了测试我的代码,我最初尝试将图像绕 z 轴旋转 10 度,但没有得到正确的输出。

我的部分Python代码:

theta_in_degrees = 10
theta_in_radians = theta_in_degrees*math.pi/180
ux=0.0 
uy=0.0 
uz=1.0 
vector_normalize_factor = math.sqrt(ux*ux+uy*uy+uz*uz)
ux=ux/vector_normalize_factor
uy=uy/vector_normalize_factor
uz=uz/vector_normalize_factor
print "ux*ux+uy*uy+uz*uz = ", ux*ux+uy*uy+uz*uz 
rotation_matrix = np.zeros([3,3])
c1 = math.cos(theta_in_radians)
c2 = 1-c1
s1 = math.sin(theta_in_radians)
rotation_matrix[0][0] = c1+ux*ux*c2
rotation_matrix[0][1] = ux*uy*c2-uz*s1
rotation_matrix[0][2] = ux*uz*c2+uy*s1
rotation_matrix[1][0] = uy*ux*c2+uz*s1
rotation_matrix[1][1] = c1+uy*uy*c2
rotation_matrix[1][2] = uy*uz*c2-ux*s1
rotation_matrix[2][0] = uz*ux*c2-uy*s1
rotation_matrix[2][1] = uz*uy*c2+ux*s1
rotation_matrix[2][2] = c1+uz*uz*c2
print "rotation_matrix = ", rotation_matrix
R = rotation_matrix
#Calculate homography H1 between reference top view and rotated frame
k_inv = np.linalg.inv(k)
Hi = k.dot(R)
Hii = k_inv.dot(h)
H1 = Hi.dot(Hii)
print "H1 = ", H1
im_out = cv2.warpPerspective(im_src, H1, (im_dst.shape[1],im_dst.shape[0]))

Here, img_src是 I1 的来源。

当我尝试上面的代码时得到的结果是一个黑色图像,图像的任何部分都不可见。但是,当我改变值时theta_in_degrees到以下值,这些是我的输出:

0.00003

0.00006

0.00009

为什么旋转仅适用于如此小的值theta_in_degrees?此外,图像中可见的旋转实际上并不是围绕 z 轴发生的。为什么图像不绕 z 轴旋转?我哪里出了问题以及如何解决这些问题?

h 矩阵:

[[  1.71025842e+00  -7.51761942e-01   1.02803446e+02]
 [ -2.98552735e-16   1.39232576e-01   1.62792482e+02]
 [ -1.13518150e-18  -2.27094753e-03   1.00000000e+00]]

k矩阵:

[[  1.41009391e+09   0.00000000e+00   5.14000000e+02]
 [  0.00000000e+00   1.78412347e+02   1.17000000e+02]
 [  0.00000000e+00   0.00000000e+00   1.00000000e+00]]

Edit:

在采纳托比·柯林斯的建议后,我将左上角的值设置为kk[1][1]。现在,当我绕 z 轴执行旋转时,我得到了所有值的正确旋转图像theta_in_degrees从 0 到 360。但是,当我尝试通过将上面代码中的 ux、uy 和 uz 更改为以下内容来绕 y 轴旋转图像时,我得到了荒谬的旋转结果:

ux=0.0 
uy=1.0 
uz=0.0 

一些不同值的样本theta_in_degrees绕y轴旋转对应的结果如下所示:

-10

-40

-90

-110

我到底哪里还出错了?另外,为什么旋转图像中连续黄色条纹的长度和宽度会出现如此巨大的下降?以及为什么图像的一部分会环绕(例如旋转-90度和-110度的结果)?

我的问题的第二部分是这样的:我的旋转轴的矢量方程是(320, 0, -10)+t(0, 1, 0)。为了使用这个方法 https://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle,为了计算旋转矩阵,我需要定义ux, uy and uz的旋转轴使得ux^2+uy^2+uz^2=1。如果需要围绕其中一个坐标轴进行旋转(正如我目前出于测试目的所做的那样),这将很简单。但我如何获得这些值ux, uy and uz if the t我的旋转轴的矢量方程是变量吗?我也愿意接受有关寻找合适旋转矩阵 R 的任何其他方法的建议,以便旋转围绕我提到的轴发生(例如,x 度)。


你遇到的困难是你的单应矩阵h与通过获得的投影不太相符sensible透视相机。我认为有一个更简单的方法。

从根本上来说,您需要非常清楚您的技术目标,并将其与解决问题的方法分开。每当你处理问题时,一定要这样做any视力问题。

技术目标

因此,让我们明确一下技术目标。您有一个平面的自上而下的图像(也称为已整顿看法)。通常你会称这个表面为model,定义在平面 z=0 上。您想要渲染这个模型。具体来说,您想要执行以下操作;

  1. 创建一个虚拟透视相机,从特定的角度观察模型。我们通过以下方式定义模型到相机的刚性变换R1, t1、具有内在矩阵K.
  2. 通过围绕投影中心旋转相机来移动相机。我们将这个旋转表示为R2.
  3. 该模型使用 2 中的视图进行渲染。我们将此图像称为I2

为简单起见,我将使用 T(R,t) 表示某些旋转的 4x4 齐次刚性变换R和翻译t. The 模型到相机因此,第 3 阶段的变换由下式给出T=T(R2, (0,0,0)) x T(R1, t1).

渲染选项

有两种好的创建方法I2

  1. 使用渲染引擎例如 OpenGL 或 Ogre。这样做的好处是可以很容易地制作一个用于改变相机视点的GUI,并且可以添加其他复杂的渲染效果。

  2. 确定模型到图像的单应性矩阵并使用 OpenCV 进行渲染warpPerspective。这样做的优点是可以在几行内完成,而无需破坏渲染软件。缺点是,如果单应性在渲染中有消失点(正如您所观察到的),您可能会得到一些奇怪的效果。稍后会详细讨论这一点。

模型到图像单应性的定义

为了使用 OpenCV 方法,我们定义模型到图像单应性为H2. 这可以根据相机参数来定义。考虑一点p=(x,y,1) 在齐次坐标模型平面上。它的位置q在 I2 的齐次坐标中由下式给出q=K M p, where M是。 3x3 矩阵由下式给出M=(T00,T01,T03;T10,T11,T13;T20,T21,T23)。使用透视相机模型可以直接得出这一点。因此,我们现在有H2 =K M.

实例化单应性矩阵

现在我们必须实例化单应性,与您提出的方法不同,我将使用特定的相机配置来定义它,通过指定K, R1, t1, R2. 选择权在于你!为了简化定义K您可以使用一种带有一个自由参数(焦距)的简单形式,并将主点设置为图像中心。对于典型的相机,f 的范围是图像宽度的 0.5 到 2 倍,但这取决于您。然后你需要设置R1 and t1 取决于您想要的视角/距离。

这与您当前的方法有何不同

我想强调的是,这与我之前给出的任何答案都不矛盾。这只是一种可能更容易管理的不同方法。本质上,在这里我建议直接使用相机参数(您根据需要设置)来定义单应性。这保证了您使用的是合理的内在矩阵(因为您自己设置了它)。这与您的方法不同,您首先创建单应性,然后想要找到匹配的相机参数(这可能是或不是物理上合理的)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python中的3D图像旋转 的相关文章

  • 将 Matplotlib 误差线放置在不位于条形中心的位置

    我正在 Matplotlib 中生成带有错误栏的堆积条形图 不幸的是 某些层相对较小且数据多样 因此多个层的错误条可能重叠 从而使它们难以或无法读取 Example 有没有办法设置每个误差条的位置 即沿 x 轴移动它 以便重叠的线显示在彼此
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 如何使用 Ansible playbook 中的 service_facts 模块检查服务是否存在且未安装在服务器中?

    我用过service facts检查服务是否正在运行并启用 在某些服务器中 未安装特定的软件包 现在 我如何知道这个特定的软件包没有安装在该特定的服务器上service facts module 在 Ansible 剧本中 它显示以下错误
  • 使用 on_bad_lines 将 pandas.read_csv 中的无效行写入文件

    我有一个 CSV 文件 我正在使用 Python 来解析该文件 我发现文件中的某些行具有不同的列数 001 Snow Jon 19801201 002 Crom Jake 19920103 003 Wise Frank 19880303 l
  • 如何替换 pandas 数据框列中的重音符号

    我有一个数据框dataSwiss其中包含瑞士城市的信息 我想用普通字母替换带有重音符号的字母 这就是我正在做的 dataSwiss Municipality dataSwiss Municipality str encode utf 8 d
  • 如何从网页中嵌入的 Tableau 图表中抓取工具提示值

    我试图弄清楚是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入图形中抓取工具提示值 以下是当用户将鼠标悬停在条形上时带有工具提示的图表示例 我从要从中抓取的原始网页中获取了此网址 https covid19 colo
  • 测试 python Counter 是否包含在另一个 Counter 中

    如何测试是否是pythonCounter https docs python org 2 library collections html collections Counter is 包含在另一个中使用以下定义 柜台a包含在计数器中b当且
  • 使用 Tkinter 显示 numpy 数组中的图像

    我对 Python 缺乏经验 第一次使用 Tkinter 制作一个 UI 显示我的数字分类程序与 mnist 数据集的结果 当图像来自 numpy 数组而不是我的 PC 上的文件路径时 我有一个关于在 Tkinter 中显示图像的问题 我为
  • 如何在Python中获取葡萄牙语字符?

    我正在研究葡萄牙语 角色看起来很奇怪 我怎样才能解决这个问题 代码 import feedparser import random Vou definir os feeds feeds conf feedurl http pplware s
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • 无法在 Python 3 中导入 cProfile

    我试图将 cProfile 模块导入 Python 3 3 0 但出现以下错误 Traceback most recent call last File
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • 如何在seaborn displot中使用hist_kws

    我想在同一图中用不同的颜色绘制直方图和 kde 线 我想为直方图设置绿色 为 kde 线设置蓝色 我设法弄清楚使用 line kws 来更改 kde 线条颜色 但 hist kws 不适用于显示 我尝试过使用 histplot 但我无法为
  • 解释 Python 中的数字范围

    在 Pylons Web 应用程序中 我需要获取一个字符串 例如 关于如何做到这一点有什么建议吗 我是 Python 新手 我还没有找到任何可以帮助解决此类问题的东西 该列表将是 1 2 3 45 46 48 49 50 51 77 使用
  • Python:如何将列表列表的元素转换为无向图?

    我有一个程序 可以检索 PubMed 出版物列表 并希望构建一个共同作者图 这意味着对于每篇文章 我想将每个作者 如果尚未存在 添加为顶点 并添加无向边 或增加每个合著者之间的权重 我设法编写了第一个程序 该程序检索每个出版物的作者列表 并
  • 如何计算 pandas 数据帧上的连续有序值

    我试图从给定的数据帧中获取连续 0 值的最大计数 其中包含来自 pandas 数据帧的 id date value 列 如下所示 id date value 354 2019 03 01 0 354 2019 03 02 0 354 201
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • Rocket UniData/UniVerse:ODBC 无法分配足够的内存

    每当我尝试使用pyodbc连接到 Rocket UniData UniVerse 数据时我不断遇到错误 pyodbc Error 00000 00000 Rocket U2 U2ODBC 0302810 Unable to allocate
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我

随机推荐