如何使用OpenCV通过solvePnP估计距离?

2024-04-11

我尝试估计相机和用于校准的棋盘之间的距离。但棋盘上点的 Z 值(993 - 1021 毫米)有很大不同。棋盘与相机平行,因此我预计相机中心和棋盘平面上任何点之间的 Z 值应该相同。

我做错了什么?

Code:

import numpy
import cv2

#from cv2.calibrateCamera.
imagePoints = numpy.array([[185.38619995, 88.96965027],
                           [215.52053833, 89.59921265],
                           [245.42134094, 90.34884644],
                           [275.23474121, 90.67272186],
                           [304.63644409, 91.27327728],
                           [333.90859985, 91.75786591],
                           [185.34030151, 118.99983978],
                           [215.52850342, 119.46482849],
                           [245.514328, 119.89020538],
                           [275.03085327, 120.42667389],
                           [304.64593506, 120.67990112],
                           [333.73968506, 121.14579773],
                           [185.34428406, 148.93850708],
                           [215.58241272, 149.32409668],
                           [245.4022522, 149.86160278],
                           [275.17852783, 149.81486511],
                           [304.5428772, 150.28009033],
                           [333.79421997, 150.35099792],
                           [185.18565369, 178.83206177],
                           [215.445755, 179.09082031],
                           [245.40261841, 179.29736328],
                           [275.07699585, 179.61761475],
                           [304.49923706, 179.56680298],
                           [333.78756714, 179.81796265],
                           [185.00271606, 208.8531189],
                           [215.40895081, 208.91560364],
                           [245.23666382, 209.10614014],
                           [275.06970215, 209.07598877],
                           [304.59561157, 209.13166809],
                           [333.90438843, 209.09313965],
                           [184.86560059, 238.93251038],
                           [215.23825073, 238.76199341],
                           [245.25619507, 238.73907471],
                           [274.97564697, 238.73266602],
                           [304.59933472, 238.72055054],
                           [333.96078491, 238.68598938],
                           [184.71801758, 269.20956421],
                           [215.05563354, 268.91809082],
                           [245.1418457, 268.70123291],
                           [274.9392395, 268.59295654],
                           [304.65649414, 268.48577881],
                           [333.98513794, 268.29562378],
                           [184.43510437, 299.72283936],
                           [214.71133423, 299.52212524],
                           [244.97724915, 298.88729858],
                           [275.03652954, 298.61529541],
                           [304.74026489, 298.40454102],
                           [334.23959351, 298.21008301]])

objectPoints = numpy.array([[0., 0., 0.],
                           [0.083, 0., 0.],
                           [0.16599999, 0., 0.],
                           [0.24899998, 0., 0.],
                           [0.33199999, 0., 0.],
                           [0.41499999, 0., 0.],
                           [0., 0.083, 0.],
                           [0.083, 0.083, 0.],
                           [0.16599999, 0.083, 0.],
                           [0.24899998, 0.083, 0.],
                           [0.33199999, 0.083, 0.],
                           [0.41499999, 0.083, 0.],
                           [0., 0.16599999, 0.],
                           [0.083, 0.16599999, 0.],
                           [0.16599999, 0.16599999, 0.],
                           [0.24899998, 0.16599999, 0.],
                           [0.33199999, 0.16599999, 0.],
                           [0.41499999, 0.16599999, 0.],
                           [0., 0.24899998, 0.],
                           [0.083, 0.24899998, 0.],
                           [0.16599999, 0.24899998, 0.],
                           [0.24899998, 0.24899998, 0.],
                           [0.33199999, 0.24899998, 0.],
                           [0.41499999, 0.24899998, 0.],
                           [0., 0.33199999, 0.],
                           [0.083, 0.33199999, 0.],
                           [0.16599999, 0.33199999, 0.],
                           [0.24899998, 0.33199999, 0.],
                           [0.33199999, 0.33199999, 0.],
                           [0.41499999, 0.33199999, 0.],
                           [0., 0.41499999, 0.],
                           [0.083, 0.41499999, 0.],
                           [0.16599999, 0.41499999, 0.],
                           [0.24899998, 0.41499999, 0.],
                           [0.33199999, 0.41499999, 0.],
                           [0.41499999, 0.41499999, 0.],
                           [0., 0.49799997, 0.],
                           [0.083, 0.49799997, 0.],
                           [0.16599999, 0.49799997, 0.],
                           [0.24899998, 0.49799997, 0.],
                           [0.33199999, 0.49799997, 0.],
                           [0.41499999, 0.49799997, 0.],
                           [0., 0.58099997, 0.],
                           [0.083, 0.58099997, 0.],
                           [0.16599999, 0.58099997, 0.],
                           [0.24899998, 0.58099997, 0.],
                           [0.33199999, 0.58099997, 0.],
                           [0.41499999, 0.58099997, 0.]])

cameraMatrix = numpy.array([[364.21551784, 0., 253.82602981],
                            [0., 363.51882052, 206.4493302],
                            [0., 0., 1.]])

distortionCoefficient = numpy.array([[0.09360905, -0.37480762, 0.00147107, -0.00132464, 0.25238534]])

Z = numpy.zeros((48))
retval,R, T = cv2.solvePnP(objectPoints,imagePoints,cameraMatrix,distortionCoefficient) #from chessboard coordinate space to camera coordinate space
R,jacobian = cv2.Rodrigues(R) #from R-vector to R-matrix
for i in range(0,48):
    point = numpy.dot(objectPoints[i],R) + numpy.matrix.transpose(T)
    Z[i] = point[0,2] * 1000 #Z-value to mm

print(Z.max() - Z.min())
print(Z)

与棋盘的图像


嗯,看来是我的错误。尽管我试图纠正它,但板子可能并不真正与相机平行。如果我们查看计算出的 Z 坐标,我们可以看到 Z 坐标从右下角到左上角线性减小。

print(numpy.round(Z.reshape(8,6)))

[[ 1013.  1009.  1005.  1001.   997.   993.]
 [ 1014.  1010.  1006.  1002.   998.   994.]
 [ 1015.  1011.  1007.  1003.  1000.   996.]
 [ 1016.  1012.  1009.  1005.  1001.   997.]
 [ 1018.  1014.  1010.  1006.  1002.   998.]
 [ 1019.  1015.  1011.  1007.  1003.   999.]
 [ 1020.  1016.  1012.  1008.  1004.  1001.]
 [ 1021.  1017.  1013.  1010.  1006.  1002.]]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用OpenCV通过solvePnP估计距离? 的相关文章

  • 带有 OpenCV 的增强现实 SDK [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 屏幕截图中低分辨率文本的 OCR

    我正在编写一个 OCR 应用程序来从屏幕截图图像中读取字符 目前 我只关注数字 我的方法部分基于这篇博文 http blog damiles com 2008 11 basic ocr in opencv http blog damiles
  • C++ OpenCV 2.3 中缺少 MoveWindow()

    我正在使用 OpenCV 2 3 的 C 版本 并且正在努力完成一项基本任务 我想做的是创建一个窗口并将其移动到屏幕上的特定位置 例如使用 cv namedWindow My Window 1 cv MoveWindow My Window
  • 在 Python 3.5 64 位上通过 pip 安装 OpenCV

    我尝试安装 OpenCV 但找不到任何合适的 pip 软件包 我决定上网查找有关如何安装它的官方文档 并发现this https opencv python tutroals readthedocs io en latest py tuto
  • opencv createsamples没有错误,但是没有找到样本

    我在用着this http coding robin de 2013 07 22 train your own opencv haar classifier html教程 我正在根据我的正面图像创建大量样本 我正在使用 Windows 这是
  • 查找彼此接近的对象边界

    我正在研究一个计算机视觉问题 其中问题的第一步是找到物体彼此靠近的位置 例如 在下图中 我感兴趣的是找到灰色标记的区域 Input Output 我目前的方法是首先反转图像 然后通过侵蚀进行形态梯度跟随 然后删除一些不感兴趣的轮廓 脚本如下
  • 如何在Python中使用tcp套接字发送和接收网络摄像头流?

    我正在尝试重新创建这个项目 https github com hamuchiwa AutoRCCar 我拥有的是服务器 我的电脑 和客户端 我的树莓派 我所做的与原始项目不同的是我尝试使用一个简单的网络摄像头而不是树莓派摄像头将图像从我的
  • TensorFlow - 为什么这个 softmax 回归没有学到任何东西?

    我的目标是用 TensorFlow 做大事 但我正在尝试从小事做起 我有一些小的灰度方块 有一点噪音 我想根据它们的颜色对它们进行分类 例如 3 个类别 黑色 灰色 白色 我编写了一个小 Python 类来生成正方形和 1 hot 向量 并
  • opencv中矩阵的超快中值(与matlab一样快)

    我正在 openCV 中编写一些代码 想要找到一个非常大的矩阵数组 单通道灰度 浮点数 的中值 我尝试了几种方法 例如对数组进行排序 使用 std sort 和选择中间条目 但与 matlab 中的中值函数相比 它非常慢 准确地说 在 ma
  • Opencv matchTemplate 和 np.where():仅保留唯一值

    继带有马里奥硬币的 opencv 教程 https opencv python tutroals readthedocs io en latest py tutorials py imgproc py template matching p
  • Opencv未找到所有轮廓

    我试图找到该图像的轮廓 但是该方法查找轮廓只返回1轮廓 轮廓突出显示image 2 我正在努力寻找all外部轮廓就像这些圆圈 里面有数字 我究竟做错了什么 我可以做什么来实现它 image 1 image 2 以下是我的代码的相关部分 th
  • 提高 pytesseract 从图像中正确识别文本的能力

    我正在尝试使用读取验证码pytesseract模块 大多数时候它都能提供准确的文本 但并非总是如此 这是读取图像 操作图像以及从图像中提取文本的代码 import cv2 import numpy as np import pytesser
  • OpenCV的拼接模块可以拼接平行运动相机拍摄的图像吗?

    我想知道是否缝合 http docs opencv org modules stitching doc stitching html http docs opencv org modules stitching doc stitching
  • 在 QtCreator 中将 OpenCV 2.3 与 Qt 结合使用

    随着 OpenCV 2 3 版本终于发布 我想在我的系统上编译并安装这个最新版本 由于我经常使用 Qt 和 QtCreator 我当然希望能够在我的 Qt 项目中使用它 我已经尝试了几种方法几个小时 但总是出现错误 第一次尝试 使用WITH
  • Python中最相似的人脸识别

    如何使用Python和OpenCV来查找面部相似 我已成功使用 OpenCV 和 Python 使用 Haar Cascades 从多张照片中提取人脸 我现在有一个图像目录 所有这些都是不同人的面孔 我想做的是拍摄一张样本图像 然后看看它最
  • OpenCV 仅围绕大轮廓绘制矩形?

    第一次发帖 希望我以正确的方式放置代码 我正在尝试检测和计算视频中的车辆 因此 如果您查看下面的代码 我会在阈值处理和膨胀后找到图像的轮廓 然后我使用 drawContours 和矩形在检测到的轮廓周围绘制一个框 我试图在 drawCont
  • 来自连接到远程机器的相机的 Opencv 流

    我正在用 python 开发一个 wx 应用程序 用于流式传输和显示来自两个不同网络摄像头的视频 这工作正常 但现在我需要在不同的场景中执行此操作 其中两个摄像头连接在通过网络连接的 Windows 上运行的单独计算机中 我的应用程序将在机
  • OpenCV 3 中的 FLANN 错误

    我运行的是 Ubuntu 14 04 我正在尝试使用 openCV 3 运行 FLANN 但出现错误 下面的所有内容都是通过使用 AKAZE 和 ORB 进行尝试的 但代码来自我尝试使用 ORB 的情况 我使用 ORB 来查找描述符和关键点
  • 使用 OpenCV 和/或 Numpy 对两个图像进行 Alpha 混合 [重复]

    这个问题在这里已经有答案了 我想将一个填充纯色的半透明矩形添加到已加载的半透明 PNG 中 这是我正在使用的输入图像示例 该图像加载了标准cv2 IMREAD UNCHANGED标志 以便完美保留 alpha 通道 该输入图像存储在imag
  • uri 警告中缺少端口:使用 Python OpenCV cv2.VideoCapture() 打开文件时出错

    当我尝试流式传输 ipcam 时 出现了如下所示的错误 tcp 000000000048c640 uri 中缺少端口 警告 打开文件时出错 build opencv modules videoio src cap ffmpeg impl h

随机推荐

  • Visual Studio 2019 中的工具版本

    我正在做几个项目从VS2010到VS2019的迁移 这些项目的 vcxprojs 中有工具版本 4
  • 如何监控Bolt的待处理队列的大小?

    我的拓扑有一两个瓶颈 Storm UI 中的容量指标对于识别这些非常有用 但我对 Bolt 队列的大小更感兴趣 我的理解是每个螺栓有两个队列 一个用于待执行的元组 另一个用于待发出的元组 是否可以监控这些队列的大小 我在网上找到了一些关于向
  • 为什么 scanf() 需要“%lf”来表示双精度数,而 printf() 只需使用“%f”就可以了?

    为什么会这样scanf 需要l in lf 当读一个double when printf 可以使用 f 无论它的参数是否是double or a float 示例代码 double d scanf lf d printf f d 因为对于采
  • 如何在执行android仪器测试时在cmd控制台中打印日志

    我在windows系统上打开cmd 然后输入 adb shell am instrument w com demo uia test android support test runner AndroidJUnitRunner 运行 And
  • const_cast 有用吗?

    最近我发现一段 C 代码可以有效地执行以下操作 char pointer const char constPointer const cast
  • 如何从 WebStorm 中运行 nodemon?

    我想用nodemon https github com remy nodemon从 WebStorm IDE 版本 7 中 Nodemon 监视源文件夹中的一个或多个文件 并在其中一个源文件发生更改时重新启动节点进程 本例中为 Expres
  • 使用 name(object) <- 向量重命名 xts 对象标头的 R 代码

    我是 R 学习新手 我的一些 R 代码有问题 为了您的方便 我放置了所有代码 以便您可以看到我正在尝试做的事情的逻辑 我的问题是重命名我的 xts 对象 Monthly Quotes 的标头 据我所知 当股票代码无效时 getsymbols
  • 原生 JS 相当于 jQuery 委托

    动态创建的 dom 元素上的事件委托的本机实现是什么 我尝试查看 jQuery 源代码 但无法遵循 on method 注意 目前我在创建 dom 元素后附加事件处理程序 这看起来很标准 但我喜欢 jQuery 的方式 on使用此语法处理动
  • 如何修复“找不到模块 vue-cli-service.js”?

    我正在设置一个新的 Vue 项目 当我运行命令时npm run serve进入CMD 出现如下错误 Error Cannot find module C Users Bram Wicherink vue cli service bin vu
  • 我们如何在 Swift 中实现等待/通知

    在Java中 我们可以这样做 synchronized a while condition false a wait time critical section do something 上面是一个条件同步块 它等待条件成功才能执行临界区
  • WPF 中的多重拖放 - 示例/示例/教程?

    我正在寻找一个示例或任何现成的解决方案 我可以将其集成到现有的应用程序中并使用多重拖放功能 当涉及到将多个项目从 ListBox 之类的控件拖放到另一个 ListBox 时 我在互联网上找到的大多数解决方案都不能很好地工作 谁能指出我的解决
  • 为什么值类型存储在堆栈中?

    为什么 C Net 更喜欢使用堆栈来存储值类型 这种设计背后的主要原因是什么 是因为对堆栈的读 写操作更好地利用了机器处理器吗 另外 也许你可以证明为什么其他人不可以 埃里克 利珀特讨论了这个here https learn microso
  • 自定义字体 Ionic 2

    因此 我尝试在 Ionic 2 应用程序中使用自定义字体 但由于某种原因 它显示的内容不正确 我的字体是 GothamRounded 因此我将所有 ttf svg otf 和 eot 文件复制到 Ionic 项目的 www fonts 文件
  • Apache和Nodejs跨域ajax问题

    我正在开发一个应用程序 其中我使用了托管在同一台机器上的两台服务器 其中一台是 apache 它将作为基本主机来服务 php 页面 另一台 Nodejs 用于其余 api 的通信 整个应用程序构建在backbone marionette r
  • Groovy:从两个范围创建二维数组

    我想创建这个 1 1 1 2 1 3 2 1 6 3 使用 GroovyConsole 我一直在尝试这样的事情 def blob 1 6 collect i gt 1 3 collect j gt i j println blob blob
  • javascript项目将自身拼接出列表

    如果我有一个对象数组 是否有任何方法可以让该项目将自身从包含它的数组中拼接出来 例如 如果一个坏人死了 他会将自己从活跃的敌人阵列中剔除出来 我可能听起来很疯狂 但这种能力会极大地简化我的代码 所以我希望有一些很酷的东西 您将这样做的方式如
  • Word JS api 访问被拒绝(ContentControl.select、Body.getHtml)

    我正在尝试通过js选择内容控制select 功能 docs https dev office com reference add ins word contentcontrol selectselectionmode selectionmo
  • Codeigniter 错误“无法使用提供的设置连接到数据库服务器”

    当我尝试在我的域上上传此项目时 我遇到错误 无法使用提供的设置连接到您的数据库服务器 我已经检查了我的配置文件 and 数据库 php文件且所有信息均正确 将 db debug 设置为 false 解决了我的问题 我用的是雪豹 编辑 db
  • Javascript - 调用 ASP.NET WebService - 服务器方法“methodName”失败

    我已经尝试解决这个问题有一段时间了 但尚未成功 我有一个基本的 ASP NET WebService 我试图从 javascript 调用它 using System using System Web using System Web Se
  • 如何使用OpenCV通过solvePnP估计距离?

    我尝试估计相机和用于校准的棋盘之间的距离 但棋盘上点的 Z 值 993 1021 毫米 有很大不同 棋盘与相机平行 因此我预计相机中心和棋盘平面上任何点之间的 Z 值应该相同 我做错了什么 Code import numpy import