控制Tello无人机扫描条形码「建议收藏」

控制Tello无人机扫描条形码「建议收藏」一直想玩无人机,之前租了一个大疆的发现禁飞。好在最近发现了Tello,买来过了一把瘾。顺便试了下集成条形码扫描功能。现在有很多仓储管理会用到无人机来扫码做库存盘点。Python3控制Tello无人机DJI的官方GitHub仓库里已经放了示例代码dji-sdk/Tello-Python。不过这份代码只能支持Python2.7,而且也好久无人维护。要在Python3上运行这份代码需要做些修改。首先获取源码:gitclonehttps://github.com/dji-sdk/Tello-Py

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一直想玩无人机,之前租了一个大疆的发现禁飞。好在最近发现了Tello,买来过了一把瘾。顺便试了下集成条形码扫描功能。现在有很多仓储管理会用到无人机来扫码做库存盘点。

在这里插入图片描述

Python 3控制Tello无人机

DJI的官方GitHub仓库里已经放了示例代码dji-sdk/Tello-Python。不过这份代码只能支持Python 2.7,而且也好久无人维护。要在Python 3上运行这份代码需要做些修改。

首先获取源码:

git clone https://github.com/dji-sdk/Tello-Python.git

在vscode中打开工程,通过全局查找替换以下部分:

# 2.7
import Tkinter
# 3.7
import tkinter
 
# 2.7
print ""
# 3.7
print()
 
# 2.7
packet_data = ""
# 3.7
packet_data = bytes()

另外,h264解码库需要重新编译成Python 3的版本。我的环境是Windows,首先下载编译vcpkg:

git clone https://github.com/microsoft/vcpkg
cd vcpkg
bootstrap-vcpkg.bat

然后通过vcpkg安装ffmpeg

vcpkg.exe install ffmpeg:x64-windows

接下来编译h264解码库的Python模块:

git clone https://github.com/DaWelter/h264decoder.git
cd h264decoder
python setup.py build_ext --cmake-args="-DCMAKE_TOOLCHAIN_FILE=[path to vcpkg]/scripts/buildsystems/vcpkg.cmake"

现在可以用Python 3正常运行Tello的示例代码了:

python3 main.py

集成Python条形码识别SDK

条形码识别会占用CPU,如果运行在Python的线程中,由于Python的GIL会导致视频流卡顿。用Dynamsoft Python条形码识别SDK可以避免这种情况。因为提供的视频流解码接口是运行在C/C++线程上的:

  • start_video_mode()
  • append_video_frame()
  • stop_video_mode()

安装Python barcode SDK:

pip install dbr

tello.py文件中创建BarcodeReader对象:

from dbr import *
self.reader = BarcodeReader()
self.reader.init_license('LICENSE-KEY') # 获取license: https://www.dynamsoft.com/customer/license/trialLicense

设置参数以及回调函数:

parameters = self.reader.init_frame_decoding_parameters()
self.frameWidth = 640 # max: 960
self.frameHeight = 480 # max: 720
self.results = None
parameters.image_pixel_format = EnumImagePixelFormat.IPF_RGB_888
parameters.max_queue_length = 2
parameters.max_result_queue_length = 2
parameters.width = self.frameWidth
parameters.height = self.frameHeight
parameters.stride = self.frameWidth * 3
parameters.auto_filter = 1
self.reader.start_video_mode(parameters, self.on_barcode_result)

已知Tello的摄像头是720P的。我准备把得到的图像缩小到640×480。

在回调函数中保存结果,用于UI绘制:

def on_barcode_result(self, data):
    self.results = data

找到视频流接收函数_receive_video_thread()。把获得的帧缩小并放到解码队列里:

for frame in self._h264_decode(packet_data):
    self.frame = cv2.resize(frame, (self.frameWidth, self.frameHeight))
 
    try:
        ret = self.reader.append_video_frame(self.frame)
    except:
        pass

最后在析构函数中调用stop_video_mode()

def __del__(self):
    self.reader.stop_video_mode()

测试

我在办公室里做了测试。从显示效果来看,不是很理想,在光线较差的环境中,图像没有对焦:

在这里插入图片描述
此外,悬停也会出现问题。Tello无人机在办公室里悬停会漂移。

源码

https://github.com/yushulx/tello-drone

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170561.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 自制51单片机最小系统开发板[通俗易懂]

    自制51单片机最小系统开发板[通俗易懂]2.单片机最小系统介绍单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计

    2022年6月23日
    23
  • java学生选课管理系统源代码_java实现选课管理swing

    java学生选课管理系统源代码_java实现选课管理swing需求Java实现学生系统(实际上是学生、教师管理系统+学生选课系统两部分构成)需求如下:程序设计为让上述要求展开。源代码由于代码量较大,所有代码以百度网盘链接形式给出(永久有效)。百度网盘链接提取码:0713解压后里面的内容应该是这样的:它包含了所有部分的代码。这里我使用eclipse编程,他们的组织形式是:按照这个形式组织好,就可以运行啦,14+的jdk版本没有任何报错。我的jdk版本:效果简单(真的很简单)展示下运行效果。好了,我很懒所以就贴这些。有

    2022年10月15日
    0
  • 创建Windows Mobile上兼容性好的UI 程序[通俗易懂]

    创建Windows Mobile上兼容性好的UI 程序

    2022年3月11日
    33
  • window location href页面跳转的几种用法及其延展「建议收藏」

    window location href页面跳转的几种用法及其延展「建议收藏」一、location.href常见的几种形式self.location.href;//当前页面打开URL页面 window.location.href;//当前页面打开URL页面 this.location.href;//当前页面打开URL页面 location.href;//当前页面打开URL页面 parent.location.href;//在父页面打开新页面 top.loca…

    2022年7月12日
    27
  • redisson读写锁使用场景_Redisson酒店

    redisson读写锁使用场景_Redisson酒店读写锁一次只有一个线程可以占有写模式的读写锁,但是可以有多个线程同时占有读模式的读写锁.正是因为这个特性,当读写锁是写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞.当读写锁在读加锁状态时,所有试图以读模式对它进行加锁的线程都可以得到访问权,但是如果线程希望以写模式对此锁进行加锁,它必须直到所有的线程释放锁.通常,当读写锁处于读模式锁住状态时,如果有另外线程试图以写模式加锁,读写锁通常会阻塞随后的读模式锁请求,这样可以避免读模式锁长期占用,而等待的写模式

    2022年8月12日
    4
  • python表白代码,照片隐藏表白话语

    python表白代码,照片隐藏表白话语最近天气好冷,感觉整个人都是冰冰的!程序员如何用python“表白”自己的女神呢?一、具体过程1、代码思路先用cv2中的imread方法读取冰冰的照片,再用PIL的Image方法创建一个相同大小的图像(初始填充白色),最后在图片上每一个块加字。2、python完整代码#-*-coding:utf-8-*-fromPILimportImage,ImageDraw,ImageFontimp

    2022年5月5日
    88

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号