具有 OpenCV 对象跟踪功能的自主火星探测器

DOIT SUPER
转载
发布时间: 2025-06-14 16:28:20 | 阅读数 0收藏数 0评论数 0
封面
由 Raspberry Pi 3、Open CV 物体识别、超声波传感器和齿轮直流电机驱动。这款探测车可以追踪任何经过训练的物体,并在任何地形上移动。

准备工作:

材料:

所需材料


  1. Raspberry Pi(除 0 外的任何型号)
  2. Raspberry PI 相机或网络摄像头
  3. L293D电机驱动IC
  4. 机器人轮子 (7x4cm) X 4
  5. 减速直流电机 (150RPM) X 4
  6. 底盘用 PVC 管


工具:

所需软件


  1. 使用 Putty 连接 Pi
  2. Open CV 进行物体识别


1

介绍

1.视频介绍https://www.youtube.com/embed/Km9eo4kZGuY?feature=oembed&autoplay=1

2.在本教程中,我们将构建一个自主火星探测器,它可以使用在 Raspberry Pi 3 上运行的 Open CV 软件识别物体并跟踪它们,并可以选择使用网络摄像头设备或原始 Raspberry Pi 摄像头。它还配备了一个安装在伺服器上的超声波传感器,以便在摄像头无法工作的黑暗环境中跟踪其路线。从 Pi 接收到的信号被发送到电机驱动器 IC (L293D),该 IC 驱动安装在用 PVC 管制成的车身上的 4 个 150RPM 直流电机。

2

建造流动站底盘

要构建这个 PVC 底盘,你需要


  1. 2 x 8 英寸
  2. 2 x 4 英寸
  3. 4 个 T 型接头


将 PVC 管排列成梯子状结构,然后插入 T 型接头。您可以使用 PVC 密封剂使接头更加牢固。

齿轮直流电机使用夹具与 PVC 管底盘连接,然后使用螺钉将轮子与电机连接。


3

构建超声波测距仪组件

超声波测距仪组件采用 HC-SR04 超声波传感器与微型伺服电机连接而成。电缆预先与超声波传感器连接,然后放入塑料外壳中,并通过螺钉与伺服电机连接。

4

原理图和电气连接

请按照所附的电路图进行电气连接。

5

SSH 和 Open CV 安装

现在,我们需要通过 SSH 连接到我们的树莓派,以便安装所需的软件。我们将从通过 SSH 连接到我们的树莓派开始。确保您的树莓派连接到与您的 PC 相同的路由器,并且您知道路由器为其分配的 IP 地址。现在,打开命令提示符或 PUTTY(如果您使用的是 Windows)并运行以下命令。

ssh pi@192.168.1.6

你的 Pi 的 IP 可能不同,我的是 192.168.1.6。

现在,输入您的默认密码 - “raspberry”

现在,您已通过 SSH 连接到您的 Pi,让我们开始使用此命令进行更新。

sudo apt-get 更新 && sudo apt-get 升级

现在让我们安装所需的开发人员工具,

sudo apt-get 安装 build-essential cmake pkg-config

接下来,我们需要安装一些图像 I/O 包,以帮助我们的 Pi 从磁盘获取各种图像格式。

sudo apt-get 安装 libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev

现在,一些用于获取视频、直播和优化 OpenCV 性能的软件包

sudo apt-get 安装 libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get 安装 libxvidcore-dev libx264-dev
sudo apt-get 安装 libgtk2.0-dev libgtk-3-dev
sudo apt-get 安装 libatlas-base-dev gfortran

我们还需要安装 Python 2.7 和 Python 3 头文件,以便我们可以使用 Python 绑定编译 OpenCV

sudo apt-get 安装 python2.7-dev python3-dev

下载 OpenCV 源代码

光盘〜
wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.3.0.zip
解压opencv.zip

下载 opencv_contrib 存储库

wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.3.0.zip
解压缩 opencv_contrib.zip

还建议使用虚拟环境来安装 OpenCV。

sudo pip 安装 virtualenv virtualenvwrapper
sudo rm -rf ~/.cache/pip

现在,virtualenv 和 virtualenvwrapper 已经安装完毕,我们需要更新 ~/.profile 以在底部包含以下几行

导出 WORKON_HOME=$HOME/.virtualenvs<br>
导出 VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
源 /usr/local/bin/virtualenvwrapper.sh

创建你的 Python 虚拟环境

mkvirtualenv cv-p python2

切换到创建的虚拟环境

源 ~/.profile
工作简历

安装 NumPy

pip 安装 numpy
编译并安装 OpenCV
cd ~/opencv-3.3.0/
mkdir 构建
光盘制作
cmake -D CMAKE_BUILD_TYPE=RELEASE \<br>
-D CMAKE_INSTALL_PREFIX=/usr/本地\
-D INSTALL_PYTHON_EXAMPLES=开启
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.3.0/模块\
-D BUILD_EXAMPLES=ON..

最后编译OpenCV

制作-j4

此命令运行完成后,您需要做的就是安装它。

sudo 进行配置
sudo ldconfig
6

运行 Rover 的 Python 代码

1.观看视频链接:https://www.youtube.com/embed/eMqlzxwc7zI?feature=oembed&autoplay=1

2.创建一个名为tracker.py的Python文件,并向其中添加以下代码。

sudo nano 跟踪器.py

代码:

#ASAR 计划
#该程序跟踪一个红球并指示树莓派跟随它。
导入系统
sys.path.append('/usr/local/lib/python2.7/site-packages')
导入cv2
将 numpy 导入为 np
导入操作系统
导入 RPi.GPIO 作为 IO

IO.设置模式(IO.板)
IO.设置(7,IO.OUT)
IO.设置(15,IO.OUT)
IO.设置(13,IO.OUT)
IO.设置(21,IO.OUT)
IO.设置(22,IO.OUT)

def fwd():
IO.output(21,1)#左电机前进
IO.输出(22,0)
IO.output(13,1)#右电机前进
IO.输出(15,0)
定义bac():
IO.output(21,0)#左电机后退
IO.输出(22,1)
IO.output(13,0)#右电机后退
IO.输出(15,1)
定义 ryt():
IO.output(21,0)#左电机后退
IO.输出(22,1)
IO.output(13,1)#右电机前进
IO.输出(15,0)
定义lft():
IO.output(21,1)#左电机前进
IO.输出(22,0)
IO.output(13,0)#右电机后退
IO.输出(15,1)
定义stp():
IO.output(21,0)#左电机停止
IO.输出(22,0)
IO.output(13,0)#右电机停止
IO.输出(15,0)
######################################################################################################
定义主要():

capWebcam = cv2.VideoCapture(0) # 声明一个 VideoCapture 对象并关联到网络摄像头,0 => 使用第一个网络摄像头

# 显示原始分辨率
打印“默认分辨率 = ”+ str(capWebcam.get(cv2.CAP_PROP_FRAME_WIDTH))+“x”+ str(capWebcam.get(cv2.CAP_PROP_FRAME_HEIGHT))

capWebcam.set(cv2.CAP_PROP_FRAME_WIDTH, 320.0) # 将分辨率更改为 320x240,以加快处理速度
capWebcam.设置(cv2.CAP_PROP_FRAME_HEIGHT,240.0)

# 显示更新后的分辨率
打印“更新后的分辨率 = ”+ str(capWebcam.get(cv2.CAP_PROP_FRAME_WIDTH))+“x”+ str(capWebcam.get(cv2.CAP_PROP_FRAME_HEIGHT))

if capWebcam.isOpened() == False: # 检查 VideoCapture 对象是否已成功与网络摄像头关联
print "error: capWebcam not accessed successful\n\n" # 如果没有,则将错误消息打印到标准输出
os.system("pause") # 暂停直到用户按下某个键,以便用户可以看到错误消息
返回#并退出函数(退出程序)
# 结束

while cv2.waitKey(1) != 27 and capWebcam.isOpened(): # 直到按下 Esc 键或网络摄像头连接丢失
blnFrameReadSuccessfully, imgOriginal = capWebcam.read() # 读取下一帧

如果不是 blnFrameReadSuccessfully 或 imgOriginal 为 None: # 如果帧未成功读取
print "error: frame not read from webcam\n" # 将错误消息打印到标准输出
os.system("pause") # 暂停直到用户按下某个键,以便用户可以看到错误消息
break #退出while循环(退出程序)
# 结束

imgHSV = cv2.cvtColor(imgOriginal,cv2.COLOR_BGR2HSV) 复制代码

imgThreshLow = cv2.inRange(imgHSV,np.array([0, 135, 135]), np.array([18, 255, 255]))
imgThreshHigh = cv2.inRange(imgHSV,np.array([165, 135, 135]), np.array([179, 255, 255]))

imgThresh = cv2.添加(imgThreshLow,imgThreshHigh)

imgThresh = cv2.高斯模糊(imgThresh, (3, 3), 2)

imgThresh = cv2.dilate(imgThresh, np.ones((5,5),np.uint8))
imgThresh = cv2.erode(imgThresh, np.ones((5,5),np.uint8))

intRows,intColumns = imgThresh.shape

circles = cv2.HoughCircles(imgThresh, cv2.HOUGH_GRADIENT, 5, intRows / 4) # 用处理后的图像中的所有圆填充变量 circles

如果圆圈不为 None:# 此行是必需的,以防止程序在下一行崩溃(如果没有找到圆圈)
IO.输出(7,1)
for circle in circles[0]: # 对于每个圆圈
x, y, radius = circle # 拆分 x, y 和半径
print "球的位置 x = " + str(x) + ", y = " + str(y) + ", 半径 = " + str(radius) # 打印球的位置和半径
obRadius = int(半径)
x轴= int(x)
如果 obRadius>0&obRadius<50:
print("检测到物体")
如果 xAxis>100&xAxis<180:
打印(“对象居中”)
转发()
elif x轴> 180:
打印(“向右移动”)
ryt()
elif xAxis<100:
打印(“向左移动”)
左移()
别的:
stp()
别的:
stp()
cv2.circle(imgOriginal, (x, y), 3, (0, 255, 0), -1) # 在检测到的物体的中心绘制一个绿色的小圆圈
cv2.circle(imgOriginal, (x, y), radius, (0, 0, 255), 3) # 在检测到的物体周围绘制红色圆圈
# 结束
# 结束
别的:
IO.输出(7,0)

cv2.namedWindow("imgOriginal", cv2.WINDOW_AUTOSIZE) # 创建窗口,使用 WINDOW_AUTOSIZE 确定固定窗口大小
cv2.namedWindow("imgThresh", cv2.WINDOW_AUTOSIZE) # 或使用 WINDOW_NORMAL 允许窗口调整大小

cv2.imshow("imgOriginal", imgOriginal) # 显示窗口
cv2.imshow("imgThresh", imgThresh)
# 结束

cv2.destroyAllWindows()#从内存中删除窗口

返回

######################################################################################################
如果 __name__ == "__main__":
主要的()

现在剩下要做的就是运行该程序

python 跟踪器.py

恭喜!您的自动驾驶探测车已准备就绪!基于超声波传感器的导航部分将很快完成,我将更新此说明。

感谢阅读!

PY
asar.py
5.73KB
阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载