DIY一个基于树莓派和Python的无人机视觉跟踪系统

27 篇文章 29 订阅
5 篇文章 3 订阅

 

DIY一个基于树莓派和Python的无人机视觉跟踪系统

无人机通过图传将航拍到的图像存储并实时传送回地面站几乎已经是标配。如果想来点高级的——在无人机上直接处理拍摄的图像并实现自动控制要怎么实现呢?其实视觉跟踪已经在一些高端的消费级无人机上有了应用,不过玩现成的永远没有自己动手来劲;)。前段时间DIY了一个无人机三轴云台的视觉跟踪系统,除去云台花了¥370,本文将设计思路与实验效果分享出来。

一、基本配置

1.1 硬件

  • 计算平台:树莓派3 (¥219.00)
  • 摄像头:USB网络摄像头(¥108.00)
  • 云台:参考上一篇博文FY650的组装
  • JoyStick摇杆:用于测试和干预云台(¥8.00)
  • Arduino UNO开发板:用于JoyStick输出信号的采集与AD转换并与树莓派串口通信(¥35.00)

1.2 软件

  • 编程语言:Python
  • 集成开发环境1:Eclipse,在windows平台上的视觉算法编程调试
  • 集成开发环境2:Geany,在Linux平台上的算法与云台联调

1.3 准备知识

前面的几篇博文分别介绍了这个系统用到的基本知识:

二、设计步骤

2.1 云台调试

(1) 搭建一个用JoyStick控制云台转动的系统

因为树莓派GPIO没有模拟输入口,因此JoyStick接Arduino完成输入模拟信号的AD转换,并将转换后的信号通过串口发送给树莓派。通过这个系统结合示波器,搞清楚了所用云台转动控制的原理和控制信号特征。云台调试阶段系统连接图如下所示。最终通过树莓派的GPIO控制云台俯仰和水平转动。一开始想用Gopro作为视频采集设备,但查了很多资料也尝试了各种方法发现暂时没法实现(如果有的话请留言告诉我:),因此换了个便宜的网络摄像头。

Gopro可以通过wifi将图像实时传给手机或pad,就是不能传给树莓派。

(2) 编写云台控制算法

根据上一步得到的云台控制信号特征,编写云台控制算法。输入是目标中心与图像中心的偏移量△x,△y,输出为云台俯仰、水平的控制变量dx,dy。

是的,摄像头外壳是纸糊的-_-。

2.2 算法调试

(1) 在windows平台上写跟踪算法

USB摄像头接上电脑用Eclipse写跟踪算法,输出偏差量等参数调试。

(2) 拷贝算法到树莓派调试

因为树莓派有多个GPIO可连云台,因此云台跟踪控制必须要在树莓派上调试。Python多平台部署的优点在这就体现出来了,直接将算法拷贝到树莓派即可运行调试。调试过程稍有点复杂,一开始的效果不好,耐心调,耐心改算法,效果也就慢慢出来了。

 

动起来的效果我们来看看下面的内容。

三、跟踪演示

室内跟踪效果

 


跟踪效果截图:

目前云台和摄像头已经装上650无人机,航拍时的效果还有待实验。欢迎留言或邮件iracer@163.com讨论:)

转载请注明出处(本文更新链接):http://blog.csdn.net/iracer/article/details/54837636


新书终于面市啦,《机器学习原理与编程实战》连接原理与实战:

https://blog.csdn.net/iracer/article/details/116051674?spm=1001.2014.3001.5501

  • 80
    点赞
  • 510
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
当然可以!以下是一个基于树莓派使用Python编写的简单视觉识别雾的代码示例: ```python import cv2 import numpy as np def detect_fog(image): # 转换为灰度图像 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 应用高斯滤波平滑图像 blurred = cv2.GaussianBlur(gray, (5, 5), 0) # 使用拉普拉斯算子检测边缘 laplacian = cv2.Laplacian(blurred, cv2.CV_64F) # 应用阈值处理 _, thresh = cv2.threshold(laplacian, 20, 255, cv2.THRESH_BINARY) # 统计白色像素点数量 white_pixels = np.sum(thresh == 255) # 计算白色像素点所占比例 total_pixels = thresh.shape[0] * thresh.shape[1] fog_ratio = white_pixels / total_pixels return fog_ratio # 打开摄像头 cap = cv2.VideoCapture(0) while True: # 读取帧 ret, frame = cap.read() # 如果成功读取帧 if ret: # 调用雾检测函数 fog_ratio = detect_fog(frame) # 显示结果 cv2.putText(frame, f"Fog Ratio: {fog_ratio:.2f}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2) cv2.imshow('Fog Detection', frame) # 按下 'q' 键退出 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头并关闭窗口 cap.release() cv2.destroyAllWindows() ``` 这段代码使用OpenCV库进行图像处理,通过计算图像中白色像素点的比例来判断是否存在雾。你可以将树莓派连接到摄像头并运行此代码,它将实时显示雾的比例。 请注意,这只是一个简单的示例代码,可能无法适用于所有场景。对于更复杂的雾检测任务,你可能需要使用更高级的算法和技术。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值