基于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的双目测距系统实现 的相关文章

  • 从 PyCharm IDE 运行 Django 项目时出现“ImportError:没有名为 cv2 的模块”

    我正在从 PyCharm 运行一个 Django 项目 其配置设置为使用 virtualenv 中的 Python 解释器 该解释器依赖于 opencv 当我运行时 该网站在本地运行良好django admin py runserver 但
  • Opencv - Features2D + 单应性不正确的结果

    我在将检测到的物体的轮廓放置在正确的位置时遇到了一些问题 就好像坐标位于错误的位置一样 我将粗麻布设置为 2000 并过滤了小于最小距离 3 倍的匹配 任何帮助 将不胜感激 运行匹配和单应性的结果 代码示例如下 public static
  • 如何使用 Python 3 在 OpenCV 3 上正确加载 cv2.KeyPoint 和描述符?

    有一天 我不得不恢复一个使用 OpenCV 3 和 Python 2 7 的旧项目 在此代码中 要加载 cv2 KeyPoint 我执行以下操作 import numpy as np import cPickle import cv2 ke
  • 如何使用 python cv2 api 将 xy 点格式化为 unactorPoints?

    我在格式化要传递给 unactorPoints 的 x y 点列表时遇到问题 opencv 2 4 1 该错误消息是 C 特定的 并抱怨点数组不是 CV 32FC2 类型 我不应该能够传入 Nx2 numpy 数组吗 import cv2
  • 将 RGB 转换为黑色或白色

    我如何在Python中获取RGB图像并将其转换为黑白图像 不是灰度 我希望每个像素要么是全黑 0 0 0 要么是全白 255 255 255 流行的 Python 图像处理库中是否有任何内置功能可以完成此任务 如果不是 最好的方法是循环遍历
  • 如何在没有 OpenCv Manager 的情况下运行 OpenCV 代码

    我正在使用 OpenCV4Android 版本 2 4 10 并在 Samsung Galayx GT I9300 上测试我的代码 我遇到的问题是 我必须从 Play 商店下载 Opencv Manager 以便我的 opencv 代码运行
  • 从一个 Mat 复制到另一个 Mat 仅接近黑色像素

    I have Mat difference其中有一些黑色像素 或者几乎是黑色像素 gt 如果发生地震 建筑物会移动等 并且Mat current它由具有自然色彩的真实图像组成 我想替换中的像素Mat current这些黑色像素Mat dif
  • OpenCV Python 删除图像中的某些对象

    我正在使用带有 opencv 和 numpy 的 python 来检测天文中的星星 例如这个1 https i stack imgur com AKwEJ jpg图片 使用模板匹配 我可以用阈值检测星星 单击 2 2 https i sta
  • 使用 cvcreateimage 使用 opencv 创建简单的黑色图像

    来自 OpenCV 新手的非常基本的问题 我只想创建一个图像 每个像素设置为0 黑色的 我在 main 函数中使用了以下代码 IplImage imgScribble cvCreateImage cvSize 320 240 8 3 我得到
  • 如何获得垂直线穿过的完整内轴线?

    我有一个图像 我想获取穿过其中轴的像素 我尝试使用骨架化 and 中轴方法来获取它们 但这两种方法都返回比相应对象短的一维线 这是带有示例图像的代码 gt gt gt import skimage filter gt gt gt impor
  • Opencv - 找不到头文件

    我正在尝试使用 opencv 开始开发 问题是 到目前为止我几乎无法设置 opencv 因为我找不到它的头文件 我对此主题进行了一些研究 但没有一个真正有帮助 下面是一些链接 opencv2 包含文件在哪里 https stackoverf
  • 如何将 opencv mat 图像转换为 gdi 位图

    我想将 openCV Mat 文件转换为 GDI 位图图像 我找不到任何有关如何执行此操作的信息 我认为没有直接的方法可以做到这一点 但我希望它不涉及将其写入文件并读回 http opencv users 1802565 n2 nabble
  • 如何使用Java OpenCV

    我正在使用图像处理开始我的最后一年项目 并希望完成类似的事情this http www youtube com watch v EPai5f2sWaA 它是人体和物体检测的结合 我真的很想用 Java 来做 因为我在 C 方面的经验很少 I
  • Haar训练时正样本和负样本使用多少张图片?

    我已经阅读了大量有关 Haar 训练的内容 但我不清楚应该为正样本集和负样本集使用多少图像 我看到建议使用很多图像 有些人推荐数千张 我也不清楚正负样本图像的数量是否应该相同 这是关于 Haar 训练的最佳教程 你试过这个吗 http no
  • OpenCV 机器学习算法的 CSV 格式

    OpenCV 中的机器学习算法似乎使用以 CSV 格式读取的数据 参见示例这个 cpp文件 https code ros org trac opencv browser trunk opencv samples c tree engine
  • 使用 cv2 在 python 中创建多通道零垫

    我想用 cv2 opencv 包装器在 python 中创建一个多通道 mat 对象 我在网上找到了一些例子 其中 c Mat zeros 被 numpy zeros 替换 这看起来不错 但似乎没有多通道类型适合 看代码 import cv
  • 如何将k4a_image_t转换为opencv矩阵? (Azure Kinect 传感器 SDK)

    我开始尝试使用 Azure Kinect Sensor SDK 我经历了官方操作指南 https learn microsoft com en us azure Kinect dk about sensor sdk sensor sdk 我
  • OpenCV 读取视频文件时内存不足

    此示例从文件中读取视频cv2 VideoCapture在 python OpenCV 中内存不足 import cv2 cap cv2 VideoCapture file mp4 while True ret frame cap read
  • python openCV 中的人口普查变换

    我开始在一个与立体视觉相关的项目中使用 openCV 和 python 我找到了关于使用 openCV 在 C 中进行人口普查转换的文档页面 link http docs opencv org 3 1 0 d2 d7f namespacec
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的

随机推荐

  • 【小程序】实现经典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