基于OpenCV的双目测距系统实现

2023-11-18

基于OpenCV的双目测距系统实现

The BinocularMeasure System Based on OpenCV


Abstract:This passage mainly describes how to measure distanceby two camera,which bases on OpenCV library.

Key words: OpenCV; Measure Distance

摘  要本文主要描述的是利用Intel 的开源计算机视觉库OpenCV实现双目测距系统。

关键词: OpenCV;双目测距

1     总体设计方案

首先需要两个一样的摄像头,再使用其采集各大约20张左右摄像头的棋盘图,注意每张图片都要在不同的角度,不同的距离(相对摄像头而言)进行采集。然后进行双目摄像头标定,获得两个摄像头的内外参数,矫正摄像头获得的目标图像,最后进行立体匹配,通过鼠标点击获取该点的三维坐标(坐标原点是左摄像头的光心)。

2     双目摄像机标定

首先我们需要标定板,标定板可以通过打印棋盘图再粘到平整的板上。注意棋盘角点数量尽可能多,里我使用的是7 X 9个角点,每个方格的尺寸是2.50cmX 2.50cm。在OpenCV中调用findChessboardCorners()函数找到棋盘角点信息,再使用drawChessboardCorners()函数画出角点,调用cornerSubPix()函数得到棋盘角点的亚像素坐标,最后使用stereoCalibrate()函数进行双目标定,得出两个摄像头的内外参数。


部分代码:

doublerms = stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1],

                   cameraMatrix[0], distCoeffs[0],

                   cameraMatrix[1], distCoeffs[1],

                    imageSize,R, T, E, F,

                   TermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, 1e-5),

                   CV_CALIB_FIX_ASPECT_RATIO +

                   CV_CALIB_ZERO_TANGENT_DIST +

                   CV_CALIB_SAME_FOCAL_LENGTH +

                   CV_CALIB_RATIONAL_MODEL +

                   CV_CALIB_FIX_K3 + CV_CALIB_FIX_K4 + CV_CALIB_FIX_K5);

cout << "done with RMS error="<< rms << endl;

3     立体校正

这里我使用的是立体校正Bouguet算法,其目的是能简单地使左右图像中的每幅重投影次数最小且重投影畸变最大,使左右图像观测面积最大,从而使立体匹配更加准确和快速。OpenCV通过stereoRectify()函数完成校正功能,最后调用函数initUndistortRectifyMap()生成图像矫正所需要的映射矩阵。


部分代码:

                   stereoRectify(M1,D1, M2, D2, img_size, R, T, R1, R2, P1, P2, Q, CALIB_ZERO_DISPARITY, -1,img_size, &roi1, &roi2);

                   Mat map11,map12, map21, map22;

                   initUndistortRectifyMap(M1,D1, R1, P1, img_size, CV_16SC2, map11, map12);

                   initUndistortRectifyMap(M2,D2, R2, P2, img_size, CV_16SC2, map21, map22);

4     立体匹配和测距

在进行立体矫正后,立体匹配能在同一极线上检测左右摄像机图像的相同特征,并得出视差图,其中视差值是在匹配时具有相同特征点在x坐标轴的差值,利用该值可通过三角相似定理得出目标距离。在这里,我使用的是post-filtering过滤方法的stereobm算法生成视差图,该过滤方法能校准视差图的边缘与源图像和从高到低的置信区间半遮挡得到视差值。相对于普通的stereobm算法,从图中可以很清楚地看出增加post-filtering过滤方法的视差图非常的平滑,完整。

部分代码:

Ptr<StereoBM>left_matcher = StereoBM::create(max_disp,wsize);

wls_filter= createDisparityWLSFilter(left_matcher);

Ptr<StereoMatcher>right_matcher = createRightMatcher(left_matcher);

cvtColor(left_for_matcher,  left_for_matcher,  COLOR_BGR2GRAY);

cvtColor(right_for_matcher,right_for_matcher, COLOR_BGR2GRAY);

left_matcher->compute(left_for_matcher, right_for_matcher,left_disp);

right_matcher->compute(right_for_matcher,left_for_matcher,right_disp);

    我们要获得物体的三维信息,只需要调用reprojectImageTo3D()函数,我们要输入利用post-filtering过滤方法的stereobm算法得出的视差图(Mat 类数据),以及上述标定得出的外参数Q,最后我们可以得出物体的三维坐标(保存的数据为Mat类)。最后我们要将得出Y轴坐标进行翻转。

部分代码:

reprojectImageTo3D(disparity,xyz, Q, true);

for(int y = 0; y < xyz.rows; ++y)

{

           for (int x = 0; x < xyz.cols; ++x)

           {

                    cv::Point3f point = xyz.at<cv::Point3f>(y,x);

                    point.y = -point.y;

                    xyz.at<cv::Point3f>(y, x) = point;

           }

}

最后我们通过鼠标的点击来获取我们想要得到某个点的三维信息。

  

 

 

 

经过多次测量发现,在离摄像头20cm-30cm处,误差基本在0.5mm内。采取的操作方法是摄像头固定,按规律移动物体,测出三位坐标,发现得出原点坐标不是摄像头的光心处,但这并不影响实际的测量结果。摄像头不变,坐标原点固定。

5     结束语

该测量系统只在短范围内测量,实验还存在误差,接下来要做的是不断的改进程序和关注OpenCV_Contrib发布的最新算法。还有的是用Qt+OpenCV编写GUI程序,跟六轴机械臂结合,机械臂能通过摄像头识别和测量出物体的空间坐标,最终实现抓取过程。


参考文献:

[1] 基于OpenCV的双目测距系统_王浩.caj

[2] http://docs.opencv.org/3.1.0/d6/d55/tutorial_table_of_content_calib3d.html#gsc.tab=0

[3] http://docs.opencv.org/3.1.0/d3/d14/tutorial_ximgproc_disparity_filtering.html#gsc.tab=0



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

基于OpenCV的双目测距系统实现 的相关文章

  • Aruco 标记与 openCv,获取 3d 角坐标?

    我正在使用 opencv 3 2 检测打印的 Aruco 标记 aruco estimatePoseSingleMarkers corners markerLength camMatrix distCoeffs rvecs tvecs 这将
  • 增加图像亮度而不溢出

    我在尝试增加图像亮度时遇到问题 这是原始图像 我想要得到的图像是这样的 现在使用以下代码增加亮度 image cv2 imread home wni vbshare tmp a4 index2 png 0 if sum image 0 le
  • Ubuntu OpenCV 无法编译

    我正在尝试使用以下命令编译 OpenCV 3 2 1 cmake DCMAKE BUILD TYPE Release DBUILD SHARED LIBS OFF DCMAKE INSTALL PREFIX usr local DOPENC
  • 为 Visual Studio 安装 openCV 2.4 for C/C++

    我一整天都在尝试在 Windows 7 上的 C C 上安装 Visual Studio 2010 的 OpenCV 版本 2 4 1 和 2 4 2 我一直在关注这个教程 http docs opencv org trunk doc tu
  • 使用 OpenCV 查找重叠/复杂的圆

    我想计算红圈半径 图2 我在使用 OpenCV 的 HoughCircles 找到这些圆圈时遇到了麻烦 如图所示 2 我只能使用 HoughCircles 找到中心以黑色显示的小圆圈 original fig 2 由于我知道红色圆圈的中心
  • 如何将 OpenCV 等待键与 Chaquopy 一起使用

    我正在尝试使用 Chaquopy 将计算机视觉应用程序移植到 Android 当我尝试运行脚本时 以下行中出现以下错误 cv2 waitKey 100 打印到嵌入式 python 控制台的错误是 java chaquopy CQPEnv c
  • 带有 OpenCV 的增强现实 SDK [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何使用requirements.txt 在 Heroku python Web 应用程序中安装 Dlib?

    我构建了一个涉及机器学习的 Python Flask Web API 但在 Heroku 上部署它时遇到了很多挫折 问题是 我的应用程序依赖于 Dlib 一个库 我似乎找不到在我的 Heroku 服务器中安装的方法 我正在试图解决这个问题
  • 使用相位相关和对数极坐标变换获得旋转位移

    我一直在编写一个脚本 它使用 cv2 计算两个图像之间的旋转位移phaseCorrelate method 我有两张图像 第二张是第一张图像的 90 度旋转版本 加载图像后 我将它们转换为对数极坐标 然后将它们传递到phaseCorrela
  • 收据褪色部分可以恢复吗?

    我有一些包含一些扫描收据的文件 我需要使用 OCR 从中提取文本 由于收据上打印的文字在一段时间后会褪色 导致收据上的某些文字不清晰 影响OCR结果 褪色单词的一些示例 有什么方法可以恢复褪色的部分 以便提高 OCR 结果吗 我在OpenC
  • 计算两个描述符之间的距离

    我正在尝试计算已计算的两个描述符之间的距离 欧几里得或汉明 问题是我不想使用匹配器 我只想计算两个描述符之间的距离 我正在使用 OpenCV 2 4 9 并且我的描述符存储在 Mat 类型中 Mat descriptors1 Mat des
  • opencv中矩阵的超快中值(与matlab一样快)

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

    我试图找到该图像的轮廓 但是该方法查找轮廓只返回1轮廓 轮廓突出显示image 2 我正在努力寻找all外部轮廓就像这些圆圈 里面有数字 我究竟做错了什么 我可以做什么来实现它 image 1 image 2 以下是我的代码的相关部分 th
  • 使用 opencv warpPerspective() 生成道路的自上而下视图

    我正在尝试实施逆透视映射计算与道路上另一辆车的距离 我知道在应用该函数之前我需要生成一个包含源点和目标点的变换矩阵warpPerspective 但我不知道如何计算目的地点 我在这个论坛和其他网站中搜索 但无法将第一张图片转换为第二张图片
  • 来自 OpenCV 的外部参数

    我正在使用 OpenCV 来校准立体相机对 我拍摄了各种校准照片 并且使用 cv2 calibrateCamera 对内在参数进行了令人满意的拟合 然而 目前尚不清楚如何获取外部参数 该函数仅返回cameraMatrix 尽管它很有用 但实
  • OpenCV的拼接模块可以拼接平行运动相机拍摄的图像吗?

    我想知道是否缝合 http docs opencv org modules stitching doc stitching html http docs opencv org modules stitching doc stitching
  • 使用Python的工业视觉相机[关闭]

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

    我从相距一定距离的两台相同品牌的相机捕获了两张图像 捕获了相同的场景 我想计算两个相机之间的现实世界旋转和平移 为了实现这一点 我首先提取了两张图像的 SIFT 特征并进行匹配 我现在有基本矩阵也单应性矩阵 然而无法进一步进行 有很多混乱
  • opencv 2.3.* 读取不工作

    我无法让 imread 工作 与这个人有同样的问题 OpenCV imwrite 2 2 在 Windows 7 上导致异常 并显示消息 OpenCV 错误 未指定错误 无法找到指定扩展名的编写器 https stackoverflow c
  • 仅获取图像中的外部轮廓

    我有这段代码 可以在图像中绘制轮廓 但我只需要外部轮廓 import cv2 import numpy as np camino C Users Usuario Documents Deteccion de Objetos 123 jpg

随机推荐

  • 【小程序】实现经典2048小游戏

    概述 经典小游戏2048 2048小游戏对于逻辑要求还是很有技术含量的 有兴趣的可以看看 详细 以前学习时写的小游戏2048 技术含量还是不错的 有兴趣的可以看看 2048已经封装好了 在主页面直接引入文件可以直接调用 演示图 调用wxml
  • 设计圆和圆柱体

    编写一个完整的Java Application 程序 包含类Circle Cylinder Main 具体要求如下 1 编写类Circle 表示圆形对象 包含以下成员 属性 radius 私有 double型 圆形半径 方法 Circle
  • Python3.X出现AttributeError: module 'urllib' has no attribute 'urlopen'错误

    研究用Python写爬虫 下载一个网页 报错代码如下 import urllib def getHtml url page urllib urlopen url html page read return html html getHtml
  • 导致事务@Transactional失效的5种场景

    一个程序中不可能没有事务 而 Spring 中 事务的实现方式分为两种 编程式事务和声明式事务 又因为编程式事务实现相对麻烦 而声明式事务实现极其简单 所以在日常项目中 我们都会使用声明式事务 Transactional 来实现事务 Tra
  • 英文学术论文写作——模式识别方向(笔记)

    文章目录 文章结构 英文写作tips Latex小技巧 英文学术论文写作经验几乎为0 在老师和师兄们的帮助下 学习到了如何撰写文章 仅限于模式识别方向的 文章结构 文章除去abstract acknowledgment以及reference
  • 深度学习目标检测综述学习

    目录 0 摘要 1 引言 2 背景 2 1 问题描述 2 2 目标检测中的关键挑战 3 数据集以及评价指标 3 1 数据集 1 PASCAL VOC 07 12 2 ILSVRC 3 MS COCO 4 Open Image 3 2 指标
  • vue一行代码实现富文本编辑器

    vue中我们可以使用tinymce第三方组件 第一 我们先将tinymce下载下来 下载链接 https pan baidu com s 15hvafdE7czBM9Wdu5sh9Ow 提取码 kv48 然后引入两个文件到我们项目中 第二部
  • 第十一届蓝桥杯 ——互质(gcd求最大公约数)

    gcd最大公约数 Rudy的博客 CSDN博客 gcdhttps blog csdn net xiaoyue article details 83239172 ops request misc 257B 2522request 255Fid
  • go语言exec包调用shell命令

    工程中需要用到ffmpeg 想直接用exec包调用shell命令 本来以为很简单 结果折腾了一下午 最后查到了解决方案 假如之前执行报错的语句为 cmd exec Command echo helloworld out err cmd Ou
  • 智能时代悄然到来刷脸支付逐渐成为潮流

    随着人脸识别 人工智能 物联网 大数据等前沿技术的迅速发展 智能时代已悄然到来 刷脸支付也逐渐成为一种潮流 如今 刷脸支付愈发常见 除了乘车刷脸 看病刷脸外 值机 安检 登机也都可以刷脸了 机场不用排长队 不用身份证 仅需一张脸即可登机的刷
  • rabbitmq web界面报错 Access refused

    赋予权限就好了 rabbitmqctl set permissions p 当前登录账户的账号
  • 态势感知与态势理解

    几个星期前 我与我的一个机构同事碰面 讨论了最新的备受瞩目的袭击事件 他向我提到了一个新词 态势理解 在USB提案中做了8个月的工作后 我对催吐流行语并不陌生 这个词立即引起了人们的注意 但是由于我一直在讨论几天 所以这个词本身正在赢得信誉
  • 【MLOps】第 2 章 : MLOps中的人

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 备战2023蓝桥国赛-传纸条

    题目描述 解析 这道题想了我好久 一开始我是想假如只走一条路线 从 1 1 走到 m n 这种问题该怎么解决呢 针对这种问题我是设了dp k i j 表示走了k步到达 i j 的好心程度之和的最大值 然后根据这个来写出转移方程来计算 后面就
  • Nginx 队列双向链表结构 ngx_quene_t

    队列链表结构 队列双向循环链表实现文件 文件 src core ngx queue h c 在 Nginx 的队列实现中 实质就是具有头节点的双向循环链表 这里的双向链表中的节点是没有数据区的 只有两个指向节点的指针 需注意的是队列链表的内
  • JVM安全退出(如何优雅的关闭java服务)

    https tech imdada cn 2017 06 18 jvm safe exit utm source tuicool utm medium referral 背景 用户 货都到了 购物车里怎么还有刚买的东西 what 产品 有用
  • 如何助力金融贷款企业实现精准营销获客

    无论是哪个行业 吸引客户都是核心 许多公司的线下渠道面临着许多障碍 以至于他们不得不采用在线客户获取方法 受影响最大的行业之一是贷款行业 如何获得准确的贷款客户资源 如何赢得客户已经成为企业的一大痛点 过去 信贷员经常使用电话营销 本地促销
  • IP(OSPF综合实验)

    一 实验 1 R4为ISP 其上只能配置IP地址 R4与其他所有直连设备间使用公有IP 2 R3 R5 6 7为MGRE环境 R3为中心站点 3 整个OSPF环境IP地址自定义 4 所有设备均可访问R4的环回 5 减少LSA的更新量 优化
  • apache Commons-beanutils的使用

    1 背景 在java开发过程中 经常会与javabean打交道 像Entity pojo vo dto等等 java应用非常讲究分层架构 因此在各层之间bean的传输与转换非常的繁琐 比如 Student stu new Student s
  • 基于OpenCV的双目测距系统实现

    基于OpenCV的双目测距系统实现 The BinocularMeasure System Based on OpenCV Abstract This passage mainly describes how to measure dist