研电赛项目之双目测距,涉及matlab相机标定,opencv多线程编程,摄像头读取,行人检测、BM立体匹配等等

1 前言

今年参加了十五届研电赛,前天刚提交了作品,还有几天就答辩了,趁这几天总结一下这一个多月的收获。

本次研电赛作品为汽车行驶防碰撞系统,主要面向大型汽车在低速行驶场景下的防碰撞问题,通过双目相机测量驾驶员视野盲区中主要障碍物与车身之间的最近距离,以及检测盲区视野中是否出现行人,并通过显示屏实时显示检测画面和扬声器语音播放的方式及时警示驾驶员,防止车辆发生碰撞事故。

针对的大型汽车有客运汽车、大货车、校车、公交车、消防车、挖掘机等等,这些车辆的特点就是体积大,体现在车长、车高都比较突出。因为车辆本身的原因,驾驶员的盲区也比较多,在倒车,转弯时,很可能因为盲区的原因而无法看到部分障碍物而造成碰撞事故,如果有行人出现在盲区内,但是驾驶员是注意不到的,那更是一种灾难。

目前,市面上传统的解决方法是安装倒车影像,或者倒车雷达,或者在车辆前后方安装摄像头捕捉实时画面,但是这些方法在功能上都单一,存在一定的不足。比如倒车影像只有倒车引导线和倒车画面,无法测量距离,普通的倒车雷达的测量距离比较短,只有5米左右,且无法做到在盲区全覆盖,实时画面就只是一个单纯的摄像头拍摄,没有任何处理,因此,针对大型汽车存在视野盲区面积大,危险性大,容易给行人带来安全隐患的问题,为改进当前的倒车影像、雷达等传统手段的不足,我们团队开发了汽车行驶防碰撞系统,本系统的的核心技术为双目测距。

2 双目相机制作

双目相机的两个摄像头必须参数一致,型号完全相同,且光心处于同一水平线上,即保持前行平行,可以淘宝直接购买,也可自己购买两个相机,设计好一前一后两块铝板,相机放在两块铝板之间,自己安装双目相机。淘宝直接购买的话两相机之间的距离固定,如果自己制作相机,可以根据自己的需求控制两相机之间的距离,一般来说,在一定范围内,两相机距离越远,双目能探测到的距离也就越长(实际上与相机焦距也有关系)。

3 相机标定

在本系统的设计中,相机是获取外界信息的唯一传感器,系统在车前安装一对双目,车后安装一对双目,在车后最上方还安装有一个广角取景相机(拍摄角度更大,可达到170度,正常人眼的观察视角为120度,鱼眼相机的范围为360度),一共安装有5个USB摄像头。由于相机镜头自身的工艺特性,造成拍摄的图片会存在畸变失真现象,为校正这种失真需要获取相机的特性参数,即内参(焦距、主点、畸变系数)。同时系统需要利用双目对拍摄的图像进行立体匹配和3D重建以获取目标离相机镜头的距离信息,即将像素坐标系映射到世界坐标系,所以还需要获取相机外参(旋转矩阵R,平移矩阵T)。相机标定的目的就是为了获取这些参数。

3.1 图像采集

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2020/7/16 16:42
# @Author : LiShan
# @File : imageCollect.py
# @Software: PyCharm
# @description:通过左右两个相机拍照采集图像并保存到指定目录(用于相机标定前的采集图像工作)
import cv2
import os

cv2.namedWindow("left", 0)
cv2.namedWindow("right", 0)
cv2.moveWindow("left", 0, 0)
cv2.moveWindow("right", 801, 0)
cv2.resizeWindow("left", 800, 600)
cv2.resizeWindow("right", 800, 600)
left_camera = cv2.VideoCapture(1)
right_camera = cv2.VideoCapture(2)

# 设置左右摄像头的分辨率
left_camera.set(3, 800)
left_camera.set(4, 600)
right_camera.set(3, 800)
right_camera.set(4, 600)

# 拍照次数
counter = 1

# 棋盘格尺寸
pattern = (7, 5)

# 拍照文件目录
folder = 'D:/img/img_back/'
if os.path.exists(folder):
    pass
else:
    os.makedirs(folder)


def shot(pos, frame):
    global counter
    path = folder + pos + "_" + str(counter) + ".bmp"
    cv2.imwrite(path, frame)
    print("snapshot saved into: " + path)


while True:
    ret1, left_frame = left_camera.read()
    ret2, right_frame = right_camera.read()
    cv2.imshow("left", left_frame)
    cv2.imshow("right", right_frame)

    key = cv2.waitKey(1)
    if key == ord('q'):
        break
    # 按下s键,拍摄当前图像
    elif key == ord('s'):
        shot("left", left_frame)
        shot("right", right_frame)
        counter += 1

left_camera.release()
right_camera.release()
cv2.destroyWindow("left")
cv2.destroyWindow("right")

相机标定目标常用的方法是张正友棋盘标定法,在matlab中已经集成了自动化的标定工具箱和立体校正工具箱

 此外还可在官网下载matlab手动标定工具箱

http://www.vision.caltech.edu/bouguetj/calib_doc/download/index.html

手动标定工具箱官方使用说明 http://www.vision.caltech.edu/bouguetj/calib_doc/

自动标定的优点是速度快,但是精度较差,适合大量图片的标定,一键导入图片,点击自动校准按钮即可,再剔除误差较大的图像对,大约5分钟不到

手动标定相反,其优点是精度较好,但比较费时间,标定20对左右相机图片(40张)大概需要30分钟左右

本文采取的思路是两种方法相结合,采集了70对左右相机图片,然后通过自动标定工具箱筛选出20对,再对这20对图像进行手动标定

自动标定流程

点击Stereo Camera..

 点击Add Images,选择左右相机采集图片文件夹,填写所用棋盘方格边长(此边长根据自己的实际情况填写)

 此自动标定工具箱会自动剔除拍摄效果不好的图片,图中剔除了28对,留下了42对图片

按图中所示,选择3个径向畸变系数,计算偏差和切向畸变系数,最后点击菜单栏中绿色的三角形,校准相机参数

根据误差计算结果,选中误差最大的图像对,鼠标右键,逐渐移除误差较大的图像对,当移除到只剩20对图像时,选中菜单栏右侧的导出摄像机参数图标(绿色的√),并记下剩下的图像对编号,将剩下的图像重新放入一个文件夹,开始下一步的手动标定。

手动标定流程

 

未完待续

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: Matlab是一种常用的编程语言和环境,用于科学计算和工程应用。双目相机标定是一种用于精确测量和视觉定位的技术。而OpenCV是一个开源的计算机视觉库,提供了许多用于图像处理和计算机视觉的函数和工具。 要进行Matlab双目相机标定,我们可以通过访问OpenCV官网下载OpenCV库和相关教程来获得所需的功能和指导。方法如下: 1. 打开浏览器,输入 “OpenCV官网”并进入OpenCV官网。 2. 在官网主页上,找到下载链接或导航菜单中的“Downloads”(或“下载”)部分。 3. 点击下载链接,进入下载页面。 4. 在下载页面上,找到与您的操作系统和Matlab版本兼容的最新版本的OpenCV库。 5. 单击下载按钮,开始下载OpenCV库。 6. 下载完成后,将OpenCV库文件保存到您选择的目录中。 7. 解压缩下载的文件,将相关文件和文件夹复制到您的Matlab工作目录中。 8. 打开Matlab,创建并打开一个新的脚本文件。 9. 在脚本文件中,编写适当的Matlab代码来使用OpenCV库进行双目相机标定。 10. 运行脚本文件,在Matlab命令窗口或图形用户界面中查看和分析结果。 通过在Matlab中使用OpenCV库,您可以利用双目相机标定来获得相机的内部和外部参数,例如相机矩阵、畸变系数和旋转矩阵。这些参数可以用于立体视觉应用中,如深度估计、立体匹配和三维重建。 在进行双目相机标定之前,建议您先阅读相关的OpenCV教程和Matlab文档,以了解更多关于双目相机标定OpenCV库的细节和使用方法。这样能够更好地理解和应用这些技术,以获得准确且可靠的结果。 ### 回答2: 对于Matlab双目相机标定,可以通过从OpenCV官网下载相关的库和软件包来实现。OpenCV是一种开源的计算机视觉库,提供了丰富的功能和工具,包括双目相机标定。 首先,打开OpenCV官网(https://opencv.org/)并导航到下载页面。在下载页面上,你可以找到适合你操作系统的最新版本的OpenCV库和软件包。 选择合适的版本后,点击下载按钮,下载文件并保存到本地。 下载完成后,解压缩文件,找到对应的库文件和示例代码来进行Matlab双目相机标定。这个过程可能因为各操作系统的不同而有所差异。 在解压缩的文件中,找到包含示例代码和相关函数的文件夹。在这个文件夹中,你可以找到一个名为“stereo_calibrate”的示例代码或函数,用于双目相机标定。 在Matlab中打开这个示例代码或函数。根据你的需求,可以根据具体要求调整代码或函数的输入参数,如相机矩阵、畸变系数和图像坐标等。 然后,你可以使用这个示例代码或函数来读取双目相机的图像,提取图像特征,计算图像的匹配点对,并进行相机参数的标定。 最后,你可以使用标定后的相机参数来进行三维重建、深度估计或其他相关任务。 总之,通过从OpenCV官网下载相关的库和软件包,可以为Matlab提供双目相机标定的功能,方便实现双目视觉相关应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乐观的lishan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值