想从图像中的二维点找到平面透视世界中的旋转和位置

Posted

技术标签:

【中文标题】想从图像中的二维点找到平面透视世界中的旋转和位置【英文标题】:Want to find rotation and position in perspective world of plane from 2d points in image 【发布时间】:2021-10-24 16:59:45 【问题描述】:

我有 2D png 图片

我想在沙发的完美旋转和位置放置一个3D平面如图

我正在使用 three.js 和透视相机手动将旋转和平移添加到平面。

我有放置绿色平面的区域的中心和角坐标。我有初始 3D 坐标位置 - (0,0,0) 和旋转 - (0,0,0)。我有 Object (0,0),(0,100),(140,0),(1 like

我想使用 OpenCV 和three.js 将initial frame 转换为final frame。 如何从该 2D 图像中找到最后一帧中绿色平面的角度,以将绿色平面旋转并转换为白色平面?

我们的最终目标是将 3D 对象放置在这样的平面上 -

我尝试使用 OpenCV solvePNP 解决同样的问题,但没有得到想要的结果,它的旋转和平移矢量不起作用,并且给出了错误的结果。

【问题讨论】:

只使用单应性。 您不会为此估计相机参数(视野),所以不,如果您想要在那里进行透视投影,这是唯一的解决方案。定义四个点,使用getPerspectiveTransform。 谢谢,@ChristophRackwitz,我们不想透视变换平面,我们正在尝试放置一个 3D 对象。我已在编辑后的问题中分享了图片。 如果您能够检测/跟踪该平面上的 4 个点,您可以计算该平面的单应性。通过分解,您可以计算相机在帧之间的旋转/平移。有了它,您可以投影 3D 对象。如果您无法跟踪飞机(例如,因为它不是真正的飞机),您将不得不以不同的方式计算相机运动/姿势。 您甚至可以使用单应性对 3D 平面进行二次采样(在该平面上创建 NxN 个图像点),然后使用 calibrateCamera。如果你没有失真系数、内在函数等,你显然不会得到完美的结果。 【参考方案1】:

使用 OpenCV 计算单应性并包装图像以在 python 中选择区域的示例。

首先,加载您的 2D png 图片和横幅图片,横幅图片将替换白色区域。

import cv2
import numpy as np

img = cv2.imread("2D png image.png")
banner = cv2.imread("replace region img.jpg")

然后,手动选择四个角(图像中的沙发角)来定义替换区域。

#point sequence:top_left corner, top right corner, bottom left corner, bottom left corner
pt = np.array([[65,180], [122, 192], [122, 277], [67, 251]]) 

接下来,获取横幅图像的四个角。

#point sequence same as hand select :top_left corner, top right corner, bottom left corner, bottom left corner
pts_banner = np.array([[0, 0], [banner.shape[1] - 1, 0], [banner.shape[1] - 1, banner.shape[0] - 1], [0, banner.shape[0] - 1]])

接下来使用 OpenCV 计算单应矩阵并将图像包装到替换区域。

homographyMat, status = cv2.findHomography(pts_banner, pt)
result1 = cv2.warpPerspective(banner, homographyMat, (img.shape[1], img.shape[0]))

最后,黑色选择区域并添加环绕图像到输入图像。

cv2.fillConvexPoly(img, pt, (0,0,0))
result2 = img + result1
cv2.imwrite("result.png", result2)

横幅图片:

输出:

参考:

https://anishdubey.com/virtual-billboard-homography-perspective-geometric-transformation-image-opencv

【讨论】:

谢谢@yanzzz,但这并不是我们想要的。除了平面,我们还想放置一个具有与平面一样的旋转方向(法向量)的 3D 对象。

以上是关于想从图像中的二维点找到平面透视世界中的旋转和位置的主要内容,如果未能解决你的问题,请参考以下文章

使用OpenCV透视变换技术实现坐标变换实践

使用OpenCV透视变换技术实现坐标变换实践

使用OpenCV透视变换技术实现坐标变换实践

图像透视变换原理与实现

图像透视变换原理与实现

图像处理之_仿射变换与透视变换