目录
介绍
最开始的目的是啥呢:我想在我的ubuntu20.04下安装conda,然后通过coda先创建python3.8环境,在该环境下安装intel RealSense d435i驱动,给python安装上librealsense2环境,让他可以使用深度相机d435i三个摄像头,最好顺带把opencv装了,这样可以测试是否安装好了,然后再在改conda的环境下装入pytorch,同时也在改环境下装入yolov8,同时测试能否正常使用yolov8提供的检测模型
遇到的困难和自己的解决方式
我的要求比较多,然后第一次是直接装的心态炸了,后买又静下心来取看他们的官网:https://www.intelrealsense.com/sdk-2/
他这这里有个documention,就是文档,你可以翻译成中文,打开linux下你可以看到他对ubuntu的要求,但是这不是我想要的,我想要的是python环境下的
往下滑,找到python,进入安装环境
打开python安装,有意思的出来了,他给了两种方式,一种通过pip安装,一种是源码构建,我之前用的ubuntu22.04想源码构建,然后可以使用它提供的官方软件,可是代码里面一直用不了,后面我发现原来conda下也能用pip
文件传输
如果ubuntu是在自己电脑下的,可以启动共享文件夹,先右键1,会出来设置,进入设置按照步骤添加共享文件夹,启动ubuntu后,
输入指令启动共享文件夹:sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other
有可能需要 sudo mkdir -p /mnt/htfgs
另外一种方式,ubuntu不是你电脑上的,但你需要先保证它已经连上网了,同时电脑要和他处于同一个网络下,通过ifconfig查看ubuntu下的ip,通过FileZilla进行传输,记得端口为22,点击快速连接后,通过拖动可以实现文件传输
conda下载和创建python环境
https://www.anaconda.com/download
进入官网后,直接点skip可以看到下载的界面,下载成功后会有一个.sh文件,通过你的方法传输到ubuntu里面去,或者直接通过ubuntu下浏览器打开下载地址下,或者通过上面的方法进行文件传输
进行安装和环境配置
sh + 安装包名字
在2出按entry,3出有个More,直接q可以退出,后面4输入yes,再后面5点击entry,后面还有个6,问你是否需要初始化,我一般选no,然后再去配置bashrc文件,如果选yes,就不需要配置了,只需要重新打开一个终端,会有base,后面直接输入下面创建包的指令就行了
如果5后面选择yes,则不用进行这步操作,注意第二句放到文件末尾,后面保存就行,第四句是启动conda环境,选择了yes直接新建终端就有了,如果vi使用上下,出现A,B,之类,可以用下面的指令(
)
sudo vi ~/.bashrc
export PATH=~/anaconda3/bin:$PATH
source ~/.bashrc
source activate
conda下 创建环境python
第一句是格式,第二句是创建包,选择python3.8环境,因为yolov8最低要求要python3.8以上,现在yolo5去官网下的好像也要python3.8以上了,第三句是进入环境,注意进入环境要做base的基础上
conda create -n your_env_name python=X.X
conda create -n yolo python=3.8
conda activate yolo
下载pycharm,让pycharm使用conda环境
官网地址
https://www.jetbrains.com/pycharm/download/?section=linux#section=linux
滑动到最下面,选择免费的社区版,下载.tar.gz(linux),下载好后,解压,将文件复制,然后sh运行,注意文件名字,名字可能因为官方更新不一样,注意改动,第一次启动这个sh,会弹出界面,先接受,后面选择don't send,后面在主界面选择open,选择一个自己想存代码的文件夹,然后trust
sudo mkdir /opt/pycharm
tar -xzvf pycharm-community-2024.2.1.tar.gz
sudo mv pycharm-community-2024.2.1 /opt/pycharm/
cd /opt/pycharm/
sh pycharm-community-2024.2.1/bin/pycharm.sh
更改pycharm的编译环境
点击确定后,可以看到右下角环境名字改变
创建桌面图标
不创建的话,每次只能去原文件通过sh启动
安装基本配置环境
记住需要在conda中的yolo环境中安装,就是你创建的python环境
先安装深度摄像头驱动
pip install pyrealsense2
再安装opecv
conda install -c conda-forge opencv
然后安装pytorch,这个可以去官网选择,我的ubuntu没有GPU,所以就直接选择了cpu的,官网地址如下,如果你想旋转GPU,需要去确定自己的指令,你的指令和我我这个指令肯定是不一样的
conda install pytorch torchvision torchaudio cpuonly -c pytorch
然后安装yolov8,这是官网地址:https://github.com/ultralytics/ultralytics
下载的话,可以通过git,或者直接下载:git clone https://github.com/ultralytics/ultralytics,然后就是安装他,先安装基础环境,注意在conda环境中
pip install -U pip setuptools wheel
pip install numpy opencv-python pillow matplotlib pyyaml tqdm
pip install scipy
然后安装下载好的包,名字git下在和直接下载估计名字不一样
cd ultralytics-main/
pip install -e .
使用和测试
首先需要去下载yolov8x.pt,越下面的精度越高,但算法越高,耗时越高,我就直接用yolov8n.pt,我把我的代码也给出来,把这个和文件你的代码放同一个文件就可以直接用了,下载方法可以参考别人这个博客:下载yolov8权重文件(.pt)文件_yolov8s.pt下载-CSDN博客
代码
这个前这段注释是测试摄像头能否使用,只是单纯的拍摄功能,为啥给出这个呢,因为有时候直接用下面的深度识别,供电供不上,我就想用这个试下有没有问题,后面在重新插拔,来启动深度识别,注意usb需要选择usb3.0以上,我的是usb3.1
# import pyrealsense2 as rs
# import numpy as np
# import cv2
#
# # 配置RealSense管道
# pipeline = rs.pipeline()
# config = rs.config()
#
# # 启用颜色流(RGB)
# config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)
#
# # 启动管道
# pipeline.start(config)
#
# try:
# while True:
# # 获取摄像头帧
# frames = pipeline.wait_for_frames()
# color_frame = frames.get_color_frame()
#
# if not color_frame:
# continue
#
# # 转换为NumPy数组
# color_image = np.asanyarray(color_frame.get_data())
#
# # 使用OpenCV显示图像
# cv2.imshow('RealSense RGB', color_image)
#
# # 按下 'q' 键退出
# if cv2.waitKey(1) & 0xFF == ord('q'):
# break
#
# finally:
# # 停止管道
# pipeline.stop()
#
# # 释放 OpenCV 窗口
# cv2.destroyAllWindows()
import cv2
from ultralytics import YOLO
import pyrealsense2 as rs
import numpy as np
# 初始化 YOLOv8 模型
model = YOLO('yolov8n.pt')
# 配置 RealSense D435i 摄像头
pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)
# 开始视频流
pipeline.start(config)
# 获取相机的深度传感器
align_to = rs.stream.color
align = rs.align(align_to)
try:
while True:
# 从摄像头获取帧
frames = pipeline.wait_for_frames()
aligned_frames = align.process(frames) # 对齐深度图到彩色图
depth_frame = aligned_frames.get_depth_frame()
color_frame = aligned_frames.get_color_frame()
if not depth_frame or not color_frame:
continue
# 将帧转换为 NumPy 数组格式
color_image = np.asanyarray(color_frame.get_data())
depth_image = np.asanyarray(depth_frame.get_data())
# 使用 YOLOv8 模型进行推理
results = model.predict(source=color_image, show=False)
# 获取检测到的每个物体的边界框坐标、置信度和类别
for result in results:
boxes = result.boxes # 获取边界框列表
for box in boxes:
# 获取坐标、类别和置信度
x1, y1, x2, y2 = map(int, box.xyxy[0]) # 边界框的左上角 (x1, y1) 和右下角 (x2, y2)
conf = box.conf[0] # 置信度
cls = int(box.cls[0]) # 类别索引
label = model.names[cls] # 类别名称
# 计算目标的中心点
cx = (x1 + x2) // 2
cy = (y1 + y2) // 2
# 获取中心点的深度值
depth = depth_frame.get_distance(cx, cy)
# 将像素坐标和深度转换为相机坐标系中的3D坐标
depth_intrin = depth_frame.profile.as_video_stream_profile().intrinsics # 获取相机内参
point = rs.rs2_deproject_pixel_to_point(depth_intrin, [cx, cy], depth) # 获取3D坐标
# 打印物体的空间坐标(3D坐标)
print(f"物体: {label}, 置信度: {conf:.2f}, 2D中心坐标: ({cx}, {cy}), 3D空间坐标: {point}")
# 在图像上绘制边界框和标签
cv2.rectangle(color_image, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(color_image, f'{label} {conf:.2f}', (x1, y1 - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
# 显示推理后的图像
cv2.imshow('YOLOv8 Real-Time Detection with Depth', color_image)
# 按键 'q' 退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
finally:
# 停止视频流
pipeline.stop()
cv2.destroyAllWindows()
效果:下面输出的是他的坐标,只不过是单纯的一个物体坐标