OpenCV项目点的逆向

2023-12-30

我有一个面向棋盘的相机。我知道这些点的世界 3D 位置以及相机图像上相应投影点的 2D 位置。所有世界点都属于同一平面。我使用solvePnP:

Matx33d camMat;
Matx41d distCoeffs;
Matx31d rvec;
Matx31d tvec;
std::vector<Point3f> objPoints;
std::vector<Point2f> imgPoints;
solvePnP(objPoints, imgPoints, camMat, distCoeffs, rvec, tvec);

然后我可以使用 projectPoints 从 3d 世界点转到 2d 图像点:

std::vector<Point2f> projPoints;
projectPoints(objPoints, rvec, tvec, camMat, distCoeffs, projPoints);

projPoints 与 imgPoints 非常接近。

如何使用与属于同一平面的 3D 世界点相对应的屏幕点进行相反的操作。我知道从单一视图来看,不可能重建 3D 位置,但这里我在同一平面上,所以这实际上是一个 2D 问题。我可以计算反向旋转矩阵以及反向平移向量,但是我该如何继续呢?

Matx33d rot;
Rodrigues(rvec, rot);
Matx33d camera_rotation_vector;
Rodrigues(rot.t(), camera_rotation_vector);
Matx31d camera_translation_vector = -rot.t() * tvec;

假设您通过 objpoints-imgpoints 对校准相机。请注意,第一个是校准板上特征点的真实 3 维坐标,第二个是每个图像中特征点的 2 维像素位置。因此,它们都应该是包含校准板图像元素数量的列表。在执行 Python 代码行之后,您将获得校准矩阵 mtx、每个校准板的旋转 rvecs 及其平移 tvecs。

ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, np.zeros(5,'float32'),flags=cv2.CALIB_USE_INTRINSIC_GUESS ) 

现在我们可以在假设下找到任意像素的 3D 坐标。这个假设是我们需要定义一些参考点。假设我们的参考是第 0 个(第一个)校准板,其枢轴点位于 0,0,其中校准板的长轴为 x,短轴为 y 轴,校准板的表面也显示 Z= 0 飞机。这是我们创建投影矩阵的方法。

# projection matrix
Lcam=mtx.dot(np.hstack((cv2.Rodrigues(rvecs[0])[0],tvecs[0])))

现在我们可以定义任何像素位置和所需的 Z 值。请注意,由于我想在参考校准板上投影 (100,100) 像素位置,因此我设置 Z=0。

px=100
py=100
Z=0
X=np.linalg.inv(np.hstack((Lcam[:,0:2],np.array([[-1*px],[-1*py],[-1]])))).dot((-Z*Lcam[:,2]-Lcam[:,3]))

现在我们有了 (px,py) 像素的 X 和 Y 坐标,即 X[0], X[1] 。 X 的最后一个元素是 lambda 因子。结果我们可以说,(px,py) 位置上的像素落在第 0 个校准板表面上的 X[0],X[1] 坐标上。

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

OpenCV项目点的逆向 的相关文章

  • 在 QtCreator 中将 OpenCV 2.3 与 Qt 结合使用

    随着 OpenCV 2 3 版本终于发布 我想在我的系统上编译并安装这个最新版本 由于我经常使用 Qt 和 QtCreator 我当然希望能够在我的 Qt 项目中使用它 我已经尝试了几种方法几个小时 但总是出现错误 第一次尝试 使用WITH
  • 我可以使用 openCV 比较两张不同图像上的两张脸吗?

    我对 openCV 很陌生 我看到它可以计算出脸部并返回一个矩形来指示脸部 我想知道 openCV 是否可以访问两张包含一张脸的图像 并且我希望 openCV 返回这两个人是否相同的可能性 Thanks OpenCV 不提供完整的人脸识别引
  • 无法在 Windows 7 机器中使用 OpenCV 2.4.3、Python 2.7 打开“.mp4”视频文件

    我目前正在进行一个涉及读取 mp4 视频文件的项目 我遇到的问题是它在Windows 7机器上使用Python 2 7 32位 OpenCV 2 4 3 cv2 pyd 代码片段如下 try video cv2 VideoCapture v
  • 如何将输出视频保存到 OpenCV 中的文件中

    我想将输出视频保存到文件中而不是显示它并尝试使用 cvcaptureimage 但仍然无法获得结果 include
  • 指纹奇异点检测

    我正在尝试确定指纹的核心点和增量点 我正在使用庞加莱指数方法 但我无法成功检测到这一点 而且我不明白为什么 First I divide the image in 15x15 blocks then I calculate the x an
  • 检查图像中是否有太薄的区域

    我正在尝试验证雕刻机的黑白图像 更多的是剪贴画图像 不是照片 我需要考虑的主要事情之一是区域的大小 或线条的宽度 因为机器无法处理太细的线条 所以我需要找到比给定阈值更细的区域 以此图为例 竖琴的琴弦可能太细而无法雕刻 我正在阅读有关 Ma
  • OpenCV 2.3 与 VS 2008 - 鼠标事件

    强制性 我是新手 有一份涉及编程的工作 并且我一边工作一边自学 不用说 作为一名老师 我经常犯彻底的错误 我现在所处的位置 我创建了 Graph 类 它 令人惊讶的是 制作了图表 但现在我想通过单击鼠标来修改图形 但我似乎无法让鼠标处理程序
  • 仅获取图像中的外部轮廓

    我有这段代码 可以在图像中绘制轮廓 但我只需要外部轮廓 import cv2 import numpy as np camino C Users Usuario Documents Deteccion de Objetos 123 jpg
  • OpenCV 跟踪器:模型未在函数 init 中初始化

    在视频的第一帧 我运行一个对象检测器 它返回对象的边界框 如下所示
  • 如何绘制更大的边界框和仅裁剪边界框文本 Python Opencv

    我正在使用 easyocr 来检测图像中的文本 该方法给出输出边界框 输入图像如下所示 Image 1 Image 2 使用下面的代码获得输出图像 But I want to draw a Single Bigger bounding bo
  • iOS 上的 OpenCV - VideoCapture 属性始终返回 1

    我一直在尝试构建一个简单的 OpenCV iOS 应用程序 该应用程序从捆绑包中加载视频并查询其帧数 持续时间等 然后它将尝试从中获取各个帧 不幸的是 当我使用VideoCapture类中 所有属性返回值 1 然后我尝试导航到frame 1
  • 在 Python 中将 OpenCV 帧流式传输为 HTML

    我正在尝试从 opencv Pyt hon 中的 URL 读取视频 然后逐帧处理它 然后将其发送到 HTML 页面 But I am only getting the first frame after that the program g
  • 如何使用 colorchecker 在 opencv 中进行颜色校准?

    我有数码相机获取的色彩检查器图像 我如何使用它来使用 opencv 校准图像 按照以下颜色检查器图像操作 您是想问如何进行颜色校准或如何使用 OpenCV 进行校准 为了进行颜色校准 您可以使用校准板的最后一行 灰色调 以下是您应该逐步进行
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • 如何使用 opencv.omnidir 模块对鱼眼图像进行去扭曲

    我正在尝试使用全向模块 http docs opencv org trunk db dd2 namespacecv 1 1omnidir html用于对鱼眼图像进行扭曲处理Python 我正在尝试适应这一点C 教程 http docs op
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 如何将多行文本插入到框架/图像中

    我使用 C 和 OpenCV 创建了一个框架 并想在其中插入几行文本 使用以下代码 putText frame My text here cvPoint 30 30 FONT HERSHEY COMPLEX SMALL 0 8 cvScal
  • 如何使用 python 定位和读取 Data Matrix 代码

    我正在尝试读取微管底部的数据矩阵条形码 我试过libdmtx http libdmtx sourceforge net 它有 python 绑定 当矩阵的点是方形时工作得相当好 但当矩阵的点是圆形时工作得更糟 如下所示 另一个复杂问题是在某

随机推荐

  • JavaScript:通过类方法创建和销毁类实例

    我试图弄清楚如何通过类方法删除对象 我希望能够创建一个具有从内存中释放对象的 destroy 方法的类 到目前为止 我所做的研究还没有结论 我知道垃圾收集最终会处理该对象 但我想要一种更明确的方法来销毁它 这可能吗 class constr
  • 如何返回满足特定事件序列的行?

    我正在尝试提取满足特定事件序列的 UserID 的记录 如果用户有一个 JOIN 然后是一个后续的 CANCEL 然后是一个后续的 JOIN 我想在结果集中返回它们 我需要根据需要一次运行此查询一天 或一次运行几天 下表显示了满足和不满足该
  • 如何使用scanf限制输入长度

    在此程序中 我采用了大小为 3 4 的维字符数组 只要我每行输入 3 个字符 它就可以正常工作 例如 如果我输入abc abd abd我得到相同的输出 但如果我在第一行 第二行或第三行输入更多字母 则会出现错误 我应该如何检查二维中的空字符
  • 如何防止NFC标签克隆?

    我正在使用 NFC 标签制作一个应用程序 并且必须防止 NFC 标签被克隆 我见过许多其他 NFC 标签 当尝试克隆时 会显示弹出消息 克隆受到限制 标签由密钥保护 我希望我的 NFC 标签具有相同的安全性 这取决于您使用的标签类型以及您想
  • NSOpenPanel runModal 崩溃?

    我有一个基于此论坛上找到的代码的例程 FSRef useOpenFileToGetFSRef NSString fileName requiredFileType NSString requiredFileType FSRef fileFS
  • 轴标签与表达式的 R 对齐

    我想绘制一个变量名称及其符号 由于某些变量的名称很长 因此我尝试将换行符与轴标签混合使用 这会导致对齐中发生有趣的事情 par mar c 1 12 1 1 plot y 1 6 1 6 yaxt n ylim c 1 6 ylab axi
  • 从面板中删除关键侦听器

    是否可以清除我放在我的监听器JPanel 当我调用一个方法时 我放了一个KeyListener在面板上 但是当我退出此方法时 我想清除该侦听器 这是我的方法 private void stopBall final Graphics2D g2
  • VScode 抱怨 Java 项目没有显式编码集

    直到最近我一直使用 vscode 没有任何问题 现在没有错误出现 一些变量永远不会改变颜色 我不断收到错误消息 项目 没有明确的编码集 我不知道我需要做什么来修复它 就在几分钟前 我也遇到了同样的问题 这是我修复它的方法 单击齿轮图标 单击
  • 更新 cabal-install,但版本没有改变

    目前我正在使用 cabal install 1 16 0 我尝试更新 cabal install 因为有人告诉我有更新版本的 ghc 7 6 1 可用 除了这条消息之外 安装结果非常成功 警告 无法在 Users MyName Librar
  • 对 flatList 中的项目进行排序

    在我的 React Native 应用程序中 我显示了我的办公室提供的服务以及这些服务在平面列表中的位置 我还在同一个公寓列表中显示了从该人当前地址开始的服务里程 我希望这些服务按里程排序 下面是我的屏幕数据 以下地点提供服务 123 Te
  • 将 ftable(列联表)转换为 R 中的数据帧

    我正在生成一个ftable 通过在xtabs命令的结果上运行ftable 并且我得到以下内容 Var1 Var2 date group 2007 01 01 q1 1 9 q2 2 8
  • @jsonview of jackson 不使用 jax-rs

    我写了以下代码 class A public static class Public Entity class public class B JsonView A Public class int a int b public class
  • 如何强制关闭串口连接?

    我有通过 USB 串行通信连接到 PC 的设备 我正在执行以下步骤 启动设备 开机 设备将在我的 PC 中检测为 COMx 名称 开始我的申请 基于COM PID VID 我连接到设备 进行沟通 到目前为止我没有遇到任何问题 当我关闭设备时
  • 接口的扩展方法的优先级是否低于不太具体的扩展方法?

    我有以下扩展类 public static class MatcherExtensions public static ExecMatcher
  • 收益率返回与返回 IEnumerable

    我注意到阅读时有一些好奇的事情IDataReader在我无法理解的 using 语句中 虽然我确信答案很简单 为什么在里面时using SqlDataReader rd 如果我直接执行yield return阅读器在阅读期间保持打开状态 但
  • BinaryFormatter 和反序列化复杂对象

    无法反序列化以下对象图 当在 BinaryFormmater 上调用反序列化方法时 会发生该异常 System Runtime Serialization SerializationException The constructor to
  • 如何从本机应用程序的 azure Active Directory 获取客户端密钥以使用 One Drive 业务 API?

    我正在开发一个 Outlook 插件 我想在其中使用 One Drive API 我轻松获得了使用 API 进行 One Drive 个人帐户的客户端 ID 和客户端密钥 但是 当我在 Azure Active Directory 中注册
  • PHP 比较日期时间值

    在我的 PHP 应用程序中 我尝试比较日期时间值 如下所示 if datetime from db lt date Y m d H i s then do something 两个值的格式相同 我不明白的是为什么它只比较日期而忽略时间 日期
  • Rails 3.1 中可以使用 << 运算符插入多个对象吗?

    我可以写以下内容吗 raw data categories each do category obj categories lt lt category end 如下所示 obj categories lt lt raw data cate
  • OpenCV项目点的逆向

    我有一个面向棋盘的相机 我知道这些点的世界 3D 位置以及相机图像上相应投影点的 2D 位置 所有世界点都属于同一平面 我使用solvePnP Matx33d camMat Matx41d distCoeffs Matx31d rvec M