欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

[双目视觉] SGBM 算法应用(Python 版本)

最编程 2024-03-31 07:46:18
...
import numpy as np import cv2 import random import math # 加载视频文件 capture = cv2.VideoCapture("./car.avi") WIN_NAME = 'Deep disp' cv2.namedWindow(WIN_NAME, cv2.WINDOW_AUTOSIZE) # 读取视频 fps = 0.0 ret, frame = capture.read() while ret: # 开始计时 t1 = time.time() # 是否读取到了帧,读取到了则为True ret, frame = capture.read() # 切割为左右两张图片 frame1 = frame[0:480, 0:640] frame2 = frame[0:480, 640:1280] # 将BGR格式转换成灰度图片,用于畸变矫正 imgL = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY) imgR = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY) # 重映射,就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。 # 依据MATLAB测量数据重建无畸变图片,输入图片要求为灰度图 img1_rectified = cv2.remap(imgL, left_map1, left_map2, cv2.INTER_LINEAR) img2_rectified = cv2.remap(imgR, right_map1, right_map2, cv2.INTER_LINEAR) # 转换为opencv的BGR格式 imageL = cv2.cvtColor(img1_rectified, cv2.COLOR_GRAY2BGR) imageR = cv2.cvtColor(img2_rectified, cv2.COLOR_GRAY2BGR) # ------------------------------------SGBM算法---------------------------------------------------------- # blockSize 深度图成块,blocksize越低,其深度图就越零碎,0<blockSize<10 # img_channels BGR图像的颜色通道,img_channels=3,不可更改 # numDisparities SGBM感知的范围,越大生成的精度越好,速度越慢,需要被16整除,如numDisparities # 取16、32、48、64等 # mode sgbm算法选择模式,以速度由快到慢为:STEREO_SGBM_MODE_SGBM_3WAY、 # STEREO_SGBM_MODE_HH4、STEREO_SGBM_MODE_SGBM、STEREO_SGBM_MODE_HH。精度反之 # ------------------------------------------------------------------------------------------------------ blockSize = 8 img_channels = 3 stereo = cv2.StereoSGBM_create(minDisparity=1, numDisparities=64, blockSize=blockSize, P1=8 * img_channels * blockSize * blockSize, P2=32 * img_channels * blockSize * blockSize, disp12MaxDiff=-1, preFilterCap=1, uniquenessRatio=10, speckleWindowSize=100, speckleRange=100, mode=cv2.STEREO_SGBM_MODE_HH) # 计算视差 disparity = stereo.compute(img1_rectified, img2_rectified) # 归一化函数算法,生成深度图(灰度图) disp = cv2.normalize(disparity, disparity, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U) # 生成深度图(颜色图) dis_color = disparity dis_color = cv2.normalize(dis_color, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U) dis_color = cv2.applyColorMap(dis_color, 2) # 计算三维坐标数据值 threeD = cv2.reprojectImageTo3D(disparity, Q, handleMissingValues=True) # 计算出的threeD,需要乘以16,才等于现实中的距离 threeD = threeD * 16 # 鼠标回调事件 cv2.setMouseCallback("depth", onmouse_pick_points, threeD) #完成计时,计算帧率 fps = (fps + (1. / (time.time() - t1))) / 2 frame = cv2.putText(frame, "fps= %.2f" % (fps), (0, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) cv2.imshow("depth", dis_color) cv2.imshow("left", frame1) cv2.imshow(WIN_NAME, disp) # 显示深度图的双目画面 # 若键盘按下q则退出播放 if cv2.waitKey(20) & 0xff == ord('q'): break # 释放资源 capture.release() # 关闭所有窗口 cv2.destroyAllWindows()