探索双目视觉技术:从原理到实战的奇妙之旅
示例程序:关于双目视觉,标定,立体矫正,立体匹配(视差算法),点云,双目三维重建的原理以及代码已经打包成软件 直接运行即可 可实现标定匹配点云可视化测距目标检测yolo我看详细的视频效果 每一步都有教程可以直接用包含源码 可二次开发谨慎考虑最近搞了个超有意思的双目视觉相关的项目,打包成了软件,直接运行就能体验,今天来跟大家唠唠其中的门道。
示例程序:关于双目视觉,标定,立体矫正,立体匹配(视差算法),点云,双目三维重建的原理以及代码 已经打包成软件 直接运行即可 可实现标定匹配点云可视化测距目标检测yolo 我看详细的视频效果 每一步都有教程可以直接用 包含源码 可二次开发 谨慎考虑

最近搞了个超有意思的双目视觉相关的项目,打包成了软件,直接运行就能体验,今天来跟大家唠唠其中的门道。
双目视觉原理基础
双目视觉模拟人类双眼感知世界的方式,通过两个摄像头获取不同视角的图像,利用视差来计算物体的深度信息。就像我们的双眼,能让我们感知到物体的远近。
标定
标定是双目视觉的重要前期步骤。它的目的是确定相机的内部参数(如焦距、主点位置等)和外部参数(相机之间的相对位置和姿态)。通过标定,我们能更准确地从图像信息中计算出物体的真实位置。

在OpenCV中,标定代码大概长这样:
import cv2
import numpy as np
# 准备棋盘格角点的世界坐标
objp = np.zeros((6*7, 3), np.float32)
objp[:, :2] = np.mgrid[0:7, 0:6].T.reshape(-1, 2)
# 储存棋盘格角点的世界坐标和图像坐标
objpoints = [] # 世界坐标
imgpoints = [] # 图像坐标
# 读取标定图像
images = cv2.imread('calibration_images/*.jpg')
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 寻找棋盘格角点
ret, corners = cv2.findChessboardCorners(gray, (7, 6), None)
if ret == True:
objpoints.append(objp)
imgpoints.append(corners)
# 绘制并显示角点
cv2.drawChessboardCorners(img, (7, 6), corners, ret)
cv2.imshow('img', img)
cv2.waitKey(500)
cv2.destroyAllWindows()
# 标定相机
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
这段代码首先定义了棋盘格角点的世界坐标,然后遍历标定图像,寻找棋盘格角点,并将其世界坐标和图像坐标分别存储。最后使用cv2.calibrateCamera函数进行相机标定,得到相机的内参矩阵mtx、畸变系数dist等参数。
立体矫正
立体矫正的作用是让两个相机的图像平面平行且光轴平行,这样后续计算视差会更方便准确。简单来说,就是把两个摄像头拍到的图像“对齐”。
# 计算校正变换
R1, R2, P1, P2, Q, validPixROI1, validPixROI2 = cv2.stereoRectify(mtx1, dist1, mtx2, dist2, img_size, R, T, alpha=0)
# 计算映射表
map1x, map1y = cv2.initUndistortRectifyMap(mtx1, dist1, R1, P1, img_size, cv2.CV_32FC1)
map2x, map2y = cv2.initUndistortRectifyMap(mtx2, dist2, R2, P2, img_size, cv2.CV_32FC1)
# 进行图像校正
img1_rectified = cv2.remap(img1, map1x, map1y, cv2.INTER_LINEAR)
img2_rectified = cv2.remap(img2, map2x, map2y, cv2.INTER_LINEAR)
这里利用cv2.stereoRectify计算校正变换,cv2.initUndistortRectifyMap计算映射表,最后通过cv2.remap对图像进行校正。
立体匹配(视差算法)
立体匹配就是在两个校正后的图像中寻找对应的点,从而计算出视差。有很多算法可以实现,比如BM(Block Matching)算法。
stereo = cv2.StereoBM_create(numDisparities=16*4, blockSize=15)
disparity = stereo.compute(img1_rectified, img2_rectified)
这段代码使用cv2.StereoBM_create创建一个BM立体匹配器,设置参数numDisparities(视差范围)和blockSize(匹配块大小),然后通过compute方法计算视差图。
点云
通过视差图,我们可以进一步生成点云数据,将二维图像信息转化为三维空间信息。
points_3d = cv2.reprojectImageTo3D(disparity, Q)
cv2.reprojectImageTo3D函数根据视差图disparity和重投影矩阵Q将视差图重新投影到三维空间,得到点云数据points_3d。
双目三维重建
综合前面的步骤,我们就能实现双目三维重建,将物体的三维形状重建出来。
软件功能展示
我这个软件不仅实现了上述基础步骤,还集成了标定、匹配、点云可视化、测距、目标检测(用的yolo)等功能。每一步都有详细教程,小白也能轻松上手。而且软件包含源码,方便大家二次开发。不过二次开发还是要谨慎考虑,毕竟双目视觉涉及的知识点较多,要确保对原理和代码有足够了解。

总之,双目视觉技术在机器人导航、自动驾驶、三维建模等领域都有广泛应用,这次的项目算是对其一次深入探索,希望能给大家带来一些启发。



魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)