刚开始学习关于双目立体视觉系统三维重建方面的知识,大都是采取了很多大佬的文章,所以写篇文章做个总结。目前只是找出一个可执行的方案,不是说去掌握其中的每一个细节,掌握完细节后,再去落地,关于精确掌握各个部分,是之后进一步的研究,而不是目前所做的事。在完成项目的过程中,若遇到问题,就带着问题去解决,这样效率高。
此篇文章会涉及到相关程序的编写,其中的相关细节,比如说变量的问题,在编写的过程中需要搞清楚,不然会出现问题。
首先进行双目标定之前,先看怎样能够在连接了双目相机的情况下驱动左右两个相机(通过usb),注意在下载opencv-python与opencv-contrib-python两个包时,一定下载与python的版本相对应的包版本,以下提供关于如何下载的文章以及两个包的下载地址:
(18条消息) Python3.6下安装opencv_考古学家lx(李玺)的博客-优快云博客_python3.6对应的opencv版本
Links for opencv-python (tsinghua.edu.cn)
Links for opencv-contrib-python (tsinghua.edu.cn)
双目相机驱动程序如下:
# -*- coding: utf-8 -*-
import cv2 as cv
import time
AUTO = False # 自动拍照,或手动按s键拍照
INTERVAL = 2 # 自动拍照间隔
cv.namedWindow("left")
cv.namedWindow("right")
camera = cv.VideoCapture(1) #这里的0表示使用电脑内置摄像头,1表示使用双目相机
# 设置分辨率 左右摄像机同一频率,同一设备ID;左右摄像机总分辨率1280x480;分割为两个640x480、640x480
camera.set(cv.CAP_PROP_FRAME_WIDTH, 1280)
camera.set(cv.CAP_PROP_FRAME_HEIGHT, 480)
counter = 0
utc = time.time()
folder = "./Saveimage/" # 拍照文件目录
def shot(pos, frame):
global counter
path = folder + pos + "_" + str(counter) + ".jpg"
cv.imwrite(path, frame)
print("snapshot saved into: " + path)
while True:
ret, frame = camera.read()
# 裁剪坐标为[y0:y1, x0:x1] HEIGHT*WIDTH
left_frame = frame[0:480, 0:640]
right_frame = frame[0:480, 640:1280]
cv.imshow("left", left_frame)
cv.imshow("right", right_frame)
now = time.time()
if AUTO and now - utc >= INTERVAL:
shot("left", left_frame)
shot("right", right_frame)
counter += 1
utc = now
key = cv.waitKey(1)
if key == ord("q"):
break
elif key == ord("s"):
shot("left", left_frame)
shot("right", right_frame)
counter += 1
camera.release()
cv.destroyWindow("left")
cv.destroyWindow("right")
拍照是输入法在英文状态下,按下s可以拍照,按下q退出,还有就是目前使用的双目相机不是鱼眼的,可能不需要进行畸变校正
对于双目立体视觉系统三维重建来说,分以下几个步骤:
一、双目标定
1.为什么要对双目相机进行标定?
参考链接:对双目相机进行标定的原因
2.双目标定有两种方式:
(1)opencv标定;
(2)matlab自带的标定工具箱(注意matlab里面有关于单目与双目的标定工具,别搞错了)。
在这里主要是研究关于matlab方面的标定,opencv标定没有研究,关于matlab标定的参考链接如下所示:
(18条消息) 双目摄像头Matlab参数定标_matlab双目相机标定_iNBC的博客-优快云博客
注意:双目相机标定里,一定要删除一些误差比较大的图片,可以参考以下链接:
(18条消息) matlab双目标定(详细过程)_双目标定步骤_西海岸看日出的博客-优快云博客
(误差很大:标定左下角有一个虚线,其中有些数据比虚线要高很多的要删掉,上述文章有说怎样删除误差大的操作)
二、图像校正
对双目相机进行标定之后,得到标定的相关数据,接下来就要进行图像的校正,图像校正方面主要是分为两个:
1.立体校正
在介绍立体校正的具体方法之前,让我们来看一下,为什么要进行立体校正?
答:双目相机系统主要的任务就是测距,而视差求距离公式是在双目系统处于理想情况下推导的,但是在现实的双目立体视觉系统中,是不存在完全的共面行对准的两个摄像机图像平面的。所以我们要进行立体校正。
立体校正的目的:把实际中非共面行对准的两幅图像,校正成共面行对准。