步骤流程
- 相机校准:在使用双目测距系统之前,需要对两个摄像头进行校准。相机校准的目的是确定两个摄像头之间的内外参数,以及消除镜头畸变等因素。
- 使用sgbm算法创建深度图,视差图
- 使用yolov8目标检测算法获取检测目标的中心位置坐标
- 计算距离
相机校准
使用matlab进行校准
获得标定图片
按下按键空格保存图片,将左右两个摄像头的图片分别保存
# -*- coding: utf-8 -*-
import cv2
import time
camera = cv2.VideoCapture(0)
# 设置分辨率 左右摄像机同一频率,同一设备ID;左右摄像机总分辨率2560x720;分割为两个1280x720
camera.set(cv2.CAP_PROP_FRAME_WIDTH, 2560)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
num=0
while True:
ret, frame = camera.read()
# 裁剪坐标为[y0:y1, x0:x1] HEIGHT*WIDTH
left_frame = frame[0:720, 0:1280]
right_frame = frame[0:720, 1280:2560]
cv2.imshow("left_frame ", left_frame )
cv2.imshow("right_frame ", right_frame )
if cv2.waitKey(1) & 0xFF == ord(' '):
cv2.imwrite('./images/left_images/'+str(num)+'.png',img=left_frame)
cv2.imwrite('./images/right_images/' + str(num) + '.png', img=right_frame)
print("images_save")
num+=1
elif cv2.waitKey(1) & 0xFF == 27:
break
cv2.destroyAllWindows()
camera.release()
matlab标定
标定图片效果展示
将校准后的相机内参复制到代码中
import cv2
import numpy as np
# # 加载相机参数
K_L = np.array([[724.298599316217 ,0 ,636.649543515655],
[0 ,725.259333661568 ,300.379160050881],
[0 ,0 ,1]])
K_R = np.array([[729.938101182192, 0, 574.732420710052],
[0 ,731.188334738551, 290.944378209093],
[0 ,0 ,1]])
newCameraMatrix_l = np.array([[724.298599316217, 0, 640],
[0, 725.259333661568, 360],
[0, 0, 1]])
newCameraMatrix_r = np.array([[729.938101182192, 0, 640],
[0, 731.188334738551, 360],
[0, 0, 1]])
# 畸变系数,K1、K2、K3为径向畸变,P1、P2为切向畸变
dist_coeffs_L = np.array([[0.0883525071083177 ,-0.103953270058449 ,0.0403065973589225,0.000323856565496780,0]])
dist_coeffs_R = np.array([[0.103436996514563, -0.181194399708597, -7.93769896630812e-05, 0.000385968542927152 ,0]])
# 设置分辨率 左右摄像机同一频率,同一设备ID;左右摄像机总分辨率2560x720;分割为两个1280x720
camera = cv2.VideoCapture(0)
camera.set(cv2.CAP_PROP_FRAME_WIDTH, 2560)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
num=0
while True:
ret, frame = camera.read()
# 裁剪坐标为[y0:y1, x0:x1] HEIGHT*WIDTH
left_frame = frame[0:720, 0:1280]
right_frame = frame[0:720, 1280:2560]
# 校正图像
undistorted_image_L = cv2.undistort(left_frame, K_L, dist_coeffs_L,newCameraMatrix_l)
undistorted_image_R = cv2.undistort(right_frame, K_R, dist_coeffs_R,newCameraMatrix_r)
# 显示校正结果
cv2.imshow('left Image', left_frame )
cv2.imshow('right Image', right_frame )
cv2.waitKey(1)
cv2.destroyAllWindows()