【python】图片标定+双目测距+SGBM+yolov8目标检测(一、图片标定)

步骤流程

  1. 相机校准:在使用双目测距系统之前,需要对两个摄像头进行校准。相机校准的目的是确定两个摄像头之间的内外参数,以及消除镜头畸变等因素。
  2. 使用sgbm算法创建深度图,视差图
  3. 使用yolov8目标检测算法获取检测目标的中心位置坐标
  4. 计算距离

相机校准

使用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()

  • 9
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
双目测距是一种通过双目摄像头获取左右眼视觉信息并计算出目标距离的技术。它可以应用于各种领域,如机器人导航、无人驾驶、工业测量等。配合YOLOv算法,可以实现更准确的目标距离测量和目标检测YOLOv是一种基于卷积神经网络的目标检测算法,可以实时地识别并定位多个目标对象。结合YOLOv算法和双目测距技术,可以首先使用YOLOv对图像中的目标对象进行检测和定位。然后,通过双目相机获取左右眼的图像,并计算出每个目标物体在左右眼图像中的像素位置差异。 通过像素位置差异可以计算出目标物体在不同眼镜头间的视差,进而利用三角形相似关系来计算出目标的实际距离。双目测距的原理是利用眼距和视差的关系来进行距离计算,而YOLOv则是通过深度学习算法来识别目标并获取目标的位置信息。 双目测距配合YOLOv的优势在于可以利用YOLOv算法进行快速和准确的目标检测,而双目测距则可以提供更精准的目标距离信息。这样可以在无人驾驶领域中用于障碍物检测和避障,帮助机器人导航系统更好地识别和规避障碍物,保障行车安全。在工业测量中,双目测距配合YOLOv可以进行精确的物体测量和位置定位,提高生产效率。 总而言之,双目测距配合YOLOv可以实现更准确、实时的目标检测和距离测量,对于智能导航、无人驾驶和工业测量等领域具有重要的应用价值。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值