-
2021-09-16 15:26:18
前言
首先进行双目定标,获取双目摄像头内部的参数后,进行测距。本次的双目视觉测距,基于SGBM算法。
注意:双目定标的效果会影响测距的精准度,建议大家在做双目定标时,做好一些(尽量让误差小)
如果不太了解双目视觉原理,建议先看看这篇文章:一篇文章认识《双目立体视觉》
目录
更多相关内容 -
双目测距 BM算法 Python版
2021-09-17 10:57:04首先进行双目定标,获取双目摄像头内部的参数后,进行测距。本次的双目视觉测距,基于BM算法。 注意:双目定标的效果会影响测距的精准度,建议大家在做双目定标时,做好一些(尽量让误差小) 如果不太了解双目视觉...前言
首先进行双目定标,获取双目摄像头内部的参数后,进行测距。本次的双目视觉测距,基于BM算法。
注意:双目定标的效果会影响测距的精准度,建议大家在做双目定标时,做好一些(尽量让误差小)
如果不太了解双目视觉原理,建议先看看这篇文章:一篇文章认识《双目立体视觉》
目录
-
完全python实现双目标定、测距
2018-09-07 16:19:48程序完全是由python3+opencv实现的,包括标定板图像采集,单目相机标定,双目相机标定,立体矫正,SGBM立体匹配,生成视差图像。测距并非采用opencv传统三维函数,通过记录实验数据,对实验数据进行多项式拟合,通过... -
python+openCV实现双目视差图及测距
2020-11-28 06:31:10right.jpg") height, width= imgL.shape[0:2]#读取相机内参和外参 config =stereoconfig.stereoCameral() map1x, map1y, map2x, map2y, Q=getRectifyTransform(height, width, config) iml_rectified, imr_rectified...importcv2importnumpy as npimportstereoconfigdefgetRectifyTransform(height, width, config):#读取矩阵参数
left_K =config.cam_matrix_left
right_K=config.cam_matrix_right
left_distortion=config.distortion_l
right_distortion=config.distortion_r
R=config.R
T=config.T#计算校正变换
if type(height) != "int" or type(width) != "int":
height=int(height)
width=int(width)
R1, R2, P1, P2, Q, roi1, roi2=cv2.stereoRectify(left_K, left_distortion, right_K, right_distortion,
(width, height), R, T, alpha=0)
map1x, map1y=cv2.initUndistortRectifyMap(left_K, left_distortion, R1, P1, (width, height), cv2.CV_32FC1)
map2x, map2y=cv2.initUndistortRectifyMap(right_K, right_distortion, R2, P2, (width, height), cv2.CV_32FC1)returnmap1x, map1y, map2x, map2y, Q#畸变校正和立体校正
defrectifyImage(image1, image2, map1x, map1y, map2x, map2y):
rectifyed_img1=cv2.remap(image1, map1x, map1y, cv2.INTER_AREA)
rectifyed_img2=cv2.remap(image2, map2x, map2y, cv2.INTER_AREA)returnrectifyed_img1, rectifyed_img2#视差计算
defsgbm(imgL, imgR):#SGBM参数设置
blockSize = 8img_channels= 3stereo= 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)#计算视差图
disp =stereo.compute(imgL, imgR)
disp= np.divide(disp.astype(np.float32), 16.)#除以16得到真实视差图
returndisp#计算三维坐标,并删除错误点
defthreeD(disp, Q):#计算像素点的3D坐标(左相机坐标系下)
points_3d =cv2.reprojectImageTo3D(disp, Q)
points_3d= points_3d.reshape(points_3d.shape[0] * points_3d.shape[1], 3)
X=points_3d[:, 0]
Y= points_3d[:, 1]
Z= points_3d[:, 2]#选择并删除错误的点
remove_idx1 = np.where(Z <=0)
remove_idx2= np.where(Z > 15000)
remove_idx3= np.where(X > 10000)
remove_idx4= np.where(X < -10000)
remove_idx5= np.where(Y > 10000)
remove_idx6= np.where(Y < -10000)
remove_idx=np.hstack(
(remove_idx1[0], remove_idx2[0], remove_idx3[0], remove_idx4[0], remove_idx5[0], remove_idx6[0]))
points_3d=np.delete(points_3d, remove_idx, 0)#计算目标点(这里我选择的是目标区域的中位数,可根据实际情况选取)
ifpoints_3d.any():
x=np.median(points_3d[:, 0])
y= np.median(points_3d[:, 1])
z= np.median(points_3d[:, 2])
targetPoint=[x, y, z]else:
targetPoint= [0, 0, -1]#无法识别目标区域
returntargetPoint
imgL= cv2.imread("_left.jpg")
imgR= cv2.imread("_right.jpg")
height, width= imgL.shape[0:2]#读取相机内参和外参
config =stereoconfig.stereoCameral()
map1x, map1y, map2x, map2y, Q=getRectifyTransform(height, width, config)
iml_rectified, imr_rectified=rectifyImage(imgL, imgR, map1x, map1y, map2x, map2y)
disp=sgbm(iml_rectified, imr_rectified)
cv2.imshow("disp", disp)
target_point= threeD(disp, Q)#计算目标点的3D坐标(左相机坐标系下)
print(target_point)
-
Python双目相机测距,行人检测,用于倒车辅助系统.zip
2022-06-22 13:41:56Python双目相机测距,行人检测,用于倒车辅助系统.zip -
BM算法实现双目视觉测距--python实现
2022-04-22 18:51:03python实现双目相机的深度测距,获取点的三维坐标。在完成对双目摄像头的标定之后,获得标定的矩阵包括左右相机的内参数矩阵、畸变矩阵、旋转矩阵和平移矩阵。将其放入代码中,如下所示:
import cv2 import numpy as np # 左相机内参 left_camera_matrix = np.array([(426.61499943, 0, 337.77666426), (0, 426.50296492, 254.57967858), (0, 0, 1)]) # 左相机畸变系数:[k1, k2, p1, p2, k3] left_distortion = np.array([[1.64160258e-02 ,1.90313751e-02 ,3.85843636e-05 ,-6.81027605e-04, -7.77682876e-02]]) # 右相机内参 right_camera_matrix = np.array([( 428.37039364, 0, 335.14944239), (0, 428.26149388, 253.70369704), (0, 0, 1)]) # 右相机畸变系数:[k1, k2, p1, p2, k3] right_distortion = np.array([[1.18624707e-02 , 2.92395356e-02 , 7.84349618e-04 ,-4.59924352e-05, -8.34482148e-02]]) # om = np.array([-0.00009, 0.02300, -0.00372]) # R = cv2.Rodrigues(om)[0] # 旋转矩阵 R = np.array([(9.99999401e-01 ,-1.08818183e-03 , 1.21838861e-04), (1.08825693e-03 , 9.99999217e-01, -6.18081935e-04), (-1.21166180e-04 , 6.18214157e-04 , 9.99999802e-01)]) # 平移向量 T = np.array([[-59.98598553], [-0.81926245], [0.12784464]]) doffs = 0.0 size = (640, 480) R1, R2, P1, P2, Q, validPixROI1, validPixROI2 = cv2.stereoRectify(left_camera_matrix, left_distortion, right_camera_matrix, right_distortion, size, R, T) left_map1, left_map2 = cv2.initUndistortRectifyMap(left_camera_matrix, left_distortion, R1, P1, size, cv2.CV_16SC2) right_map1, right_map2 = cv2.initUndistortRectifyMap(right_camera_matrix, right_distortion, R2, P2, size, cv2.CV_16SC2)
在进行立体标定和平行校正。代码如下:
img1_rectified = cv2.remap(frame1, left_map1, left_map2, cv2.INTER_LINEAR, cv2.BORDER_CONSTANT) img2_rectified = cv2.remap(frame2, right_map1, right_map2, cv2.INTER_LINEAR, cv2.BORDER_CONSTANT)
也可以不用,如果你的相机的平行相机的话,这一步做不做都可以。
完成之后在看一下BM算法:
# BM numberOfDisparities = ((640 // 8) + 15) & -16 # 640对应是分辨率的宽 stereo = cv2.StereoBM_create(numDisparities=16*10, blockSize=7) # 立体匹配 stereo.setROI1(camera_configs.validPixROI1) stereo.setROI2(camera_configs.validPixROI2) stereo.setPreFilterCap(50) stereo.setBlockSize(9) stereo.setMinDisparity(0) stereo.setNumDisparities(numberOfDisparities) stereo.setTextureThreshold(10) stereo.setUniquenessRatio(15) stereo.setSpeckleWindowSize(200) stereo.setSpeckleRange(32) stereo.setDisp12MaxDiff(8) 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) # 归一化函数算法 threeD = cv2.reprojectImageTo3D(disparity, camera_configs.Q, handleMissingValues=True) # 计算三维坐标数据值 threeD = threeD * 16
这块就是计算三维坐标了,其中stereo里的都是算法的参数,可以进行调节,找到一种效果好的参数组合即可,当然建议设置一个滑块调节,这样调节起来比较方便,如何设置滑块进行参数调节,我将在另一篇博客中介绍。
cv2.setMouseCallback(WIN_NAME, onmouse_pick_points, threeD) cv2.imshow("left", frame1) cv2.imshow(WIN_NAME, disp) # 显示深度图的双目画面
这样就可以进行展示了,是建立在左相机的坐标系下进行计算和展示。
通过鼠标点击输入像素坐标信息,通过BM算法进行对应点的匹配,再根据平行视图的计算公式进行计算,即可得三维坐标了,这样需要乘以16进行换算才是真实坐标。
鼠标点击输入函数如下,其中xy也可以自己设置输入,进行对应坐标的计算:
def onmouse_pick_points(event, x, y, flags, param): if event == cv2.EVENT_LBUTTONDOWN: threeD = param print('\n像素坐标 x = %d, y = %d' % (x, y)) print("世界坐标xyz 是:", threeD[y][x][0] / 1000.0, threeD[y][x][1] / 1000.0, threeD[y][x][2] / 1000.0, "m") distance = math.sqrt(threeD[y][x][0] ** 2 + threeD[y][x][1] ** 2 + threeD[y][x][2] ** 2) distance = distance / 1000.0 # mm -> m print("距离是:", distance, "m")
cv2.setMouseCallback(WIN_NAME, onmouse_pick_points, threeD)
把这些函数组合一下就可以得到整个函数了,图片输入识别深度和摄像头实时识别都是可以的,计算速度快,实际测量的话,感觉精度还行,当然是短距离。效果的话没有SGBM算法好的,但是胜在计算速度快。
完整的代码如下了,最重要的就是。
# -*- coding: utf-8 -*- import numpy as np import cv2 import camera_configs import random import math cap = cv2.VideoCapture(0) cap.set(3, 1280) cap.set(4, 480) # 打开并设置摄像头 # 鼠标回调函数 def onmouse_pick_points(event, x, y, flags, param): if event == cv2.EVENT_LBUTTONDOWN: threeD = param print('\n像素坐标 x = %d, y = %d' % (x, y)) # print("世界坐标是:", threeD[y][x][0], threeD[y][x][1], threeD[y][x][2], "mm") print("世界坐标xyz 是:", threeD[y][x][0] / 1000.0, threeD[y][x][1] / 1000.0, threeD[y][x][2] / 1000.0, "m") distance = math.sqrt(threeD[y][x][0] ** 2 + threeD[y][x][1] ** 2 + threeD[y][x][2] ** 2) distance = distance / 1000.0 # mm -> m print("距离是:", distance, "m") WIN_NAME = 'Deep disp' cv2.namedWindow(WIN_NAME, cv2.WINDOW_AUTOSIZE) while True: ret, frame = cap.read() frame1 = frame[0:480, 0:640] frame2 = frame[0:480, 640:1280] # 割开双目图像 imgL = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY) # 将BGR格式转换成灰度图片 imgR = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY) # cv2.remap 重映射,就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。 # 依据MATLAB测量数据重建无畸变图片 img1_rectified = cv2.remap(imgL, camera_configs.left_map1, camera_configs.left_map2, cv2.INTER_LINEAR) img2_rectified = cv2.remap(imgR, camera_configs.right_map1, camera_configs.right_map2, cv2.INTER_LINEAR) imageL = cv2.cvtColor(img1_rectified, cv2.COLOR_GRAY2BGR) imageR = cv2.cvtColor(img2_rectified, cv2.COLOR_GRAY2BGR) # BM numberOfDisparities = ((640 // 8) + 15) & -16 # 640对应是分辨率的宽 stereo = cv2.StereoBM_create(numDisparities=16*10, blockSize=7) # 立体匹配 stereo.setROI1(camera_configs.validPixROI1) stereo.setROI2(camera_configs.validPixROI2) stereo.setPreFilterCap(50) stereo.setBlockSize(9) stereo.setMinDisparity(0) stereo.setNumDisparities(numberOfDisparities) stereo.setTextureThreshold(10) stereo.setUniquenessRatio(15) stereo.setSpeckleWindowSize(200) stereo.setSpeckleRange(32) stereo.setDisp12MaxDiff(8) 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) # 归一化函数算法 threeD = cv2.reprojectImageTo3D(disparity, camera_configs.Q, handleMissingValues=True) # 计算三维坐标数据值 threeD = threeD * 16 # threeD[y][x] x:0~640; y:0~480; !!!!!!!!!! cv2.setMouseCallback(WIN_NAME, onmouse_pick_points, threeD) cv2.imshow("left", frame1) cv2.imshow(WIN_NAME, disp) # 显示深度图的双目画面 key = cv2.waitKey(1) if key == ord("q"): break cap.release() cv2.destroyAllWindows()
-
YOLOV5 + 双目测距(python)
2022-05-12 15:02:05大致流程: 双目标定→双目校正→双目匹配→yolov5识别→深度测距 找到目标识别源代码中输出障碍物坐标框的代码段。 找到双目测距代码中计算障碍物深度的代码段。 将1中得到的障碍物框依次输入到2中的代码段中,得到... -
python、opencv 双目视觉测距代码
2021-02-05 07:52:25两个部分,一个是相机的参数设置,一个是测距运用matlab里面的stereo Camera Calibrator APP进行拍照 拍个30多张,然后拉线,留个10-20张进行计算,把双目摄像机的数据填到camera_configs.py里面camera_configs.py... -
Python-OpenCV双目测距代码实现以及参数解读
2021-04-16 16:22:431、双目相机拍照后使用Matlab进行双目标定 主要参考:https://blog.csdn.net/dulingwen/article/details/98071584 感谢大佬的分享!!!(*≧ω≦)!! Python-openCV 中cv2.StereoSGBM_create()参数的含义 参考:... -
使用OpenCV/python进行双目测距
2021-01-28 17:49:57在作SLAM时,但愿用到深度图来辅助生成场景,因此要构创建体视觉,在这里使用OpenCV的Stereo库和python来进行双目立体视觉的图像处理。python立体标定应用标定数据转换成深度图标定在开始以前,须要准备的固然是两个... -
双目测距Python-OpenCV代码及详细解释
2021-12-02 16:12:29一 双目测距的基本流程 双目标定-->立体校正(含消除畸变)-->立体匹配-->视差计算-->深度计算/3D坐标计算 二 双目标定 参照之前的文章求出相册的内参,外参以及畸变函数,其中内参包括左右相机的fx... -
OpenCV实现双目测距
2021-01-12 04:17:54原理图示原理很简单,利用了相似三角形计算距离,所以双目测距的主要任务在于前期摄像头的定标、双目图像点的特征匹配上。常用做法具体步骤1.双目定标和校正,获得摄像头的参数矩阵摄像头定标一般都需要一个放在... -
双目测距理论及其python实现
2019-09-03 23:19:09一、双目测距基本流程 双目测距属于双目SLAM的一个应用领域。 关于双目测距的基本原理,其实并不复杂,但说起来内容也不少,其核心原理就是三角测量,三角测量在土地测量、天文测量等领域都得到了广泛应用,是一种... -
yolov5+stereo双目识别原始测距代码
2022-04-23 12:58:54可以先+Q,在下载哦~ 首先pip install -r rerequirements.txt 搭建好yolov5的环境 搭建好yolov5的环境后直机运行 python detect_and_stereo_video_003.py -
双目摄像头实现双目测距
2021-12-11 11:35:20(1)相机标定:需要对双目相机进行标定,得到两个相机的内外参数、单应矩阵。 (2) 双目校正:根据标定结果对原始图像进行校正,校正后的两张图像位于同一平面且互相平行。 (3)双目匹配:对校正后的两张图像进行像素... -
sift算法实现双目测距
2011-11-13 21:23:58用opencv以及sift算法实现的双目测距工程,测量误差在500mm-1000mm时达到5mm以内 -
双目三维重建系统(双目标定+立体校正+双目测距+点云显示)Python
2021-11-13 11:23:19 本博客将实现Python版本的双目三维重建系统,项目代码实现包含:`双目标定`,`立体校正(含消除畸变)`,`立体匹配`,`视差计算`和`深度距离计算/3D坐标计算` 的知识点。...支持双目相机标定:stereo_camera -
Opencv-Python 笔记——双目测距(一)
2019-10-08 20:05:35Opencv-Python 笔记——双目测距 在假期着手的双目视觉的项目,笔记记在我的印象笔记里。现因为项目需要我把它放在CSDN上,有几张图片无法从印象笔记里导出来所以把链接放在这里,做的时候参考了不少前辈的工作,... -
(记录)单双目相机标定及三角测量实现(Python OpenCV)
2022-01-10 10:00:53参考https://temugeb.github.io/opencv/python/2021/02/02/stereo-camera-calibration-and-triangulation.html -
双目测距、重构(基于MATLAB和opencv-python)
2019-08-18 10:27:19双目测距、重构 楼主之前用的SFM来进行重构,但是得到的是视差图,点云和实物存在比例关系,单目的还是不能解决scale这个问题的。所以今天用双目的来进行重构,期间遇到了很多坑,实属难受。 双目测距过程大致可以... -
学习笔记:使用opencv做双目测距(相机标定+立体匹配+测距).
2020-11-28 06:31:14最近在做双目测距,觉得有必要记录点东西,所以我的第一篇博客就这么诞生啦~双目测距属于立体视觉这一块,我觉得应该有很多人踩过这个坑了,但网上的资料依旧是云里雾里的,要么是理论讲一大堆,最后发现还不知道... -
双目视觉测距原理,数学推导及三维重建资源
2021-12-13 01:26:47点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达作者:Naruto_Q来源:CSDN先说一下单/双目的测距原理区别:单目测距原理先通过图像匹配进行目标识别(各种车型、... -
【ZED】从零开始使用ZED相机(五):Opencv+Python实现相机标定(双目)
2022-02-17 17:00:41同样Opencv+Python实现双目相机的标定,单目标定详见【ZED】从零开始使用ZED相机(五):Opencv+Python实现相机标定(单目) 1 cv2.stereoCalibrate 函数介绍 调用方法 stereoCalibrate(objectPoints, imagePoints1,... -
opencv实现双目视觉测距
2017-12-26 11:47:21最近一直在研究双目视觉测距,资料真的特别多网上,有matlab 的,python的,C++的,但个人感觉都不详细,对于小白,特别不容易上手,在这里我提供一个傻瓜式教程吧,利用matlab来进行标注,图形界面,无须任何代码,... -
【单目测距和双目测距比较】
2022-04-29 09:52:10单目测距和双目测距比较单/双目方案的优势与难点单目测距双目测距双目测距实现步骤实现过程 单/双目方案的优势与难点 单目测距 **优点:**单目的优势在于成本较低,对计算资源的要求不高,系统结构相对简单。 缺点:... -
python+opencv+matlab实现双目标定和测距
2021-01-11 11:14:20在anaconda新建环境opencv下安装opencv-python库:pip install opencv-python -i https://pypi.douban.com/simpl 在anaconda新建环境opencv下安装opencv库:conda install opencv windows10 下安装M... -
Matlab双目相机标定
2022-04-01 14:50:06现在有许多双目相机在出厂时就已经标定好了,用户拿到手后可以直接使用,例如Intel Realsense系列。但是有些相机出厂的时候并没有完成标定工作,因而这个时候就需要我们自己来标定。由于笔者曾改装过一个双目相机,...