使用深度相机D435i+YOLOv8实现物体三维坐标实时显示

一、获取相机内参

下列指令为获取相机内参指令,输入此指令前需要获得相机的深度帧和彩色帧数据。

如何使用vsCode打开intel D435i深度相机

# 获取相机内参
depth_intrinsics = depth_frame.profile.as_video_stream_profile().intrinsics
color_intrinsics = color_frame.profile.as_video_stream_profile().intrinsics
# 命令行打印相机内参显示
print("Depth Intrinsics:", depth_intrinsics)
print("Color Intrinsics:", color_intrinsics)

显示结果为:

Depth Intrinsics: [ 640x480  p[322.02 236.768]  f[391.288 391.288]  Brown Conrady [0 0 0 0 0] ]
Color Intrinsics: [ 640x480  p[328.884 240.065]  f[606.697 606.756]  Inverse Brown Conrady [0 0 0 0 0] ]

其中:640x480是像素宽度x像素高度; p[322.02 236.768]为主点(镜头光轴与图像平面的交点)的坐标; f[391.288 391.288]为焦距参数;Brown Conrady [0 0 0 0 0]分别表示畸变模型与畸变系数

二、关于 result.boxes.xywh.tolist()的xywh的解释

关于boxes = result.boxes.xywh.tolist(),可以在result源码里面找到相关的定义如下,可以看出相应的x,y为中心点坐标,w为宽度,h为高度

三、自动根据相机内参和xywh计算相应的深度数据

【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于YOLOv5+Intel_Realsense_D435i开发的物体之间三维距离测量python源码+项目说明.zip 结合YOLOv5对Intel_Realsense_D435i 进行开发,实现实时检测物体之间的三维距离 [yolov5]:实时目标检测算法 [Intel Relsense D435i深度摄像头](https://www.intelrealsense.com/zh-hans/depth-camera-d435i/):Intel使用realsense(实感)技术开发出来的的深度摄像头,可以获取目标的三维信息 ## 1.Use and Environment: 如果您想直接使用,请使用yolov5_D435i_2.0 yolov5_D435i_1.0是本人学习时的版本。 ### Environment: 1.一个可运行yolov5的环境 2.一个Intel realsense D435i相机,pyrealsense2和各种依赖库 ``` 1. could run yolov5 2. pip install -r requirements.txt 3. pip install pyrealsense2 ``` ### Use: 配置yolov5_D435i_2.0/config/yolov5s.yaml,运行yolov5_D435i_2.0/config/main2.py即可 yolov5_D435i_2.0/config/yolov5s.yaml: ``` weight: "weights/yolov5s.pt" # 输入图像的尺寸 input_size: [640,480] # 类别个数 class_num: 80 # 标签名称 class_name: [ 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush' ] # 阈值设置 threshold: iou: 0.45 confidence: 0.6 # 计算设备 # - cpu # - 0 <- 使用GPU device: '0' target: ['person']#检测哪些类别之间的距离 which objects you want to detect ``` ## 2.Attenion ...
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
### 使用双目相机标定获取三维坐标的方法 #### 一、准备工作 为了成功实现基于双目相机的三维坐标重建,前期准备至关重要。这不仅涉及硬件设备的选择,还包括软件环境搭建以及必要的理论知识掌握。 - **硬件方面**:选用一对具有相同分辨率和焦距特性的摄像头作为双目系统的组成部分;确保两台摄像机之间保持固定距离并安装在同一水平线上。 - **软件支持**:推荐使用MATLAB或Python中的OpenCV库来处理图像数据及执行后续算法操作[^3]。 #### 二、相机内部参数与外部参数标定 利用张正友棋盘格法或其他有效手段完成对两个摄像单元各自内参(如焦距f、主点偏移cx/cy等)及其相对位姿(旋转矩阵R和平移向量t)的精确测定。此过程可通过调用Matlab自带工具箱函数`stereoParameters`来进行自动化校准流程,在“Camera-centric”模式下直观检验所得模型是否合理反映真实场景布局情况。 ```python import cv2 as cv from matplotlib import pyplot as plt # 加载已保存好的立体相机参数文件 stereo_params = cv.FileStorage('stereo_parameters.xml', cv.FILE_STORAGE_READ) cameraMatrix1 = stereo_params.getNode('M1').mat() distCoeffs1 = stereo_params.getNode('D1').mat() cameraMatrix2 = stereo_params.getNode('M2').mat() distCoeffs2 = stereo_params.getNode('D2').mat() R = stereo_params.getNode('R').mat() # 旋转向量 T = stereo_params.getNode('T').mat() # 平移向量 E = stereo_params.getNode('E').mat() # 本质矩阵 F = stereo_params.getNode('F').mat() # 基础矩阵 ``` #### 三、极线矫正 经过上述步骤后所获得的一对标记图像是未经任何几何变换处理过的原始素材,因此有必要实施进一步优化措施——即所谓的“极线矫正”。该技术旨在消除因视角差异而产生的扭曲效应,使得来自不同视角下的特征点能够沿同一直线分布,从而简化匹配任务难度并提高精度[^2]。 ```python # 计算重映射网格 R1, R2, P1, P2, Q, validPixROI1, validPixROI2 = \ cv.stereoRectify(cameraMatrix1=cameraMatrix1, distCoeffs1=distCoeffs1, cameraMatrix2=cameraMatrix2, distCoeffs2=distCoeffs2, imageSize=(imgL.shape[1], imgL.shape[0]), R=R, T=T, alpha=-1) mapx1, mapy1 = cv.initUndistortRectifyMap( cameraMatrix1, distCoeffs1, R1, P1, (imgL.shape[1], imgL.shape[0]), cv.CV_32FC1) mapx2, mapy2 = cv.initUndistortRectifyMap( cameraMatrix2, distCoeffs2, R2, P2, (imgR.shape[1], imgR.shape[0]), cv.CV_32FC1) # 应用重映射 dst_imgL = cv.remap(imgL, mapx1, mapy1, interpolation=cv.INTER_LINEAR) dst_imgR = cv.remap(imgR, mapx2, mapy2, interpolation=cv.INTER_LINEAR) ``` #### 四、立体匹配寻找视差图 采用半全局块匹配(SGBM)或者其他高效的算法策略构建稠密视差场,它是连接二维平面至三维空间的关键桥梁之一。具体来说就是对于每一对经由极线矫正后的左右影像而言,找到最佳对应的像素位置组合,并据此推导出相应的深度信息。 ```python left_matcher = cv.StereoSGBM_create(minDisparity=0, numDisparities=96, blockSize=7, uniquenessRatio=10, speckleWindowSize=100, speckleRange=32, disp12MaxDiff=1, P1=8 * 3 * window_size ** 2, P2=32 * 3 * window_size ** 2) right_matcher = cv.ximgproc.createRightMatcher(left_matcher) wls_filter = cv.ximgproc.createDisparityWLSFilter(matcher_left=left_matcher) wls_filter.setLambda(80000) wls_filter.setSigmaColor(1.2) displ = left_matcher.compute(dst_imgL, dst_imgR).astype(np.float32)/16 dispr = right_matcher.compute(dst_imgR, dst_imgL).astype(np.float32)/16 filteredImg = wls_filter.filter(displ, dst_imgL, None, dispr) plt.imshow(filteredImg, 'gray') plt.colorbar() plt.show() ``` #### 五、计算三维坐标 最后一步则是依据之前求得的各项系数以及当前时刻的具体视差值d,借助三角测量原理反推出目标物体在世界坐标系内的确切方位。此处需注意的是Q为四元数形式表示的基础投影矩阵,它综合考虑到了所有参与运算的因素影响[^1]。 ```python points_3D = cv.reprojectImageTo3D(filteredImg, Q) colors = cv.cvtColor(dst_imgL, cv.COLOR_BGR2RGB) mask_map = filteredImg > filteredImg.min() output_points = points_3D[mask_map] output_colors = colors[mask_map] def create_output(vertices, colors, filename): colors = colors.reshape(-1, 3) vertices = np.hstack([vertices.reshape(-1, 3), colors]) ply_header = '''ply format ascii 1.0 element vertex %(vert_num)d property float x property float y property float z property uchar red property uchar green property uchar blue end_header ''' with open(filename, 'wb') as f: f.write((ply_header % dict(vert_num=len(vertices))).encode('utf-8')) np.savetxt(f, vertices, fmt='%f %f %f %d %d %d ') create_output(output_points, output_colors, 'out.ply') print('%s saved' % 'out.ply') ```
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值