【发疯毕设日志day5(下)】大疆tello火影手势结印起飞数据采集代码逐句分析

文章描述了一个Python程序,通过DJITelloPy库控制Tello无人机,采集手势图片数据进行Yolo模型的训练。程序定期(每1秒)拍摄并保存图片,直到达到预设数量。
摘要由CSDN通过智能技术生成

1.数据(手势图片)采集

1.0 注意事项

1.1 代码分析

首先是导入一些包 cv2、numpy、time、djitellopy

做了一个类叫collect

1.在__init__()里对tello进行初始化
    def __init__(self):
        # tello初始化
        self.tello = Tello()
        self.tello.connect()
        self.tello.streamon()
2.定义主函数main

        定义变量last_col_time  是最近一次的收集图片时间  初始化为None

 def main(self,label_id=1,counts=3):

        index = 1
        last_col_time =  None
3.在main函数里通过while语句进行读取视频帧等一系列的操作。

        当last_col_time =None  表示图片采集还未开始,

        我们运行程序就是要采集图片,所以把运行到此处的时间赋值给last_col_time

        用flip函数对视频帧进行镜像翻转

            if last_col_time is None:
                last_col_time =  time.time()

            # 翻转
            frame = cv2.flip(frame, 1)
用if语句判断index 和counts的关系

        collect.main(1,15)表示我采集第一个动作采集15张

        用counts来计数表示计划采集多少张

        index是目前采集了多少张

if index < counts+1:
    .......
         做一个时间判断 。

                如果不做时间判断,视频是非常快的,1s可能就采集15张了。

                我们想让它间隔一段时间(1s)再采集一下。

now =time.time()
if now -last_col_time >1:
    #当前时间距离上一次采集时间已经大于1s了,那么我可以继续采集

               采集完我们得到了一张图片,我们想保存一下它,

                文件名的格式是1_1.jpg   1_2.jpg  1_3.jpg  这种

                用cv的写文件命令cv2.imwrite(filename,frame) 保存这一帧的画面

                

  # 每隔1秒采集一张: 1_1.jpg, 1_2.jpg
                    filename = './trainingImgs/{}_{}.jpg'.format(label_id,index)
                    cv2.imwrite(filename,frame)

                   然后更新last_col_time  变成此次采集的时间now

                    打印一下电量,因为电量太低的话有可能就会失败

                    battery = self.tello.get_battery()

                    print('成功采集:{},飞机电量:{}'.format(filename,battery))

                index自增+1.

'''
yolo 动作训练图片采集程序
'''
import cv2
import numpy as np
import time
# tello
from djitellopy import Tello

class Collect:
    def __init__(self):
        # tello初始化
        self.tello = Tello()
        self.tello.connect()
        self.tello.streamon()


    def main(self,label_id=1,counts=3):

        index = 1
        last_col_time =  None

        while True:
            # 读取视频帧
            frame = self.tello.get_frame_read().frame
            
            if last_col_time is None:
                last_col_time =  time.time()

            # 翻转
            frame = cv2.flip(frame, 1)

            if index < counts+1:
                now = time.time()
                if now - last_col_time > 1:
                    # 每隔1秒采集一张: 1_1.jpg, 1_2.jpg
                    filename = './trainingImgs/{}_{}.jpg'.format(label_id,index)
                    cv2.imwrite(filename,frame)
                    
                    last_col_time = now

                    # 获取电量
                    battery = self.tello.get_battery()

                    print('成功采集:{},飞机电量:{}'.format(filename,battery))

                    index +=1


            else:
                
                break
                
            
            # 显示
            cv2.imshow('demo', frame)
            if cv2.waitKey(10) & 0xFF == ord('q'):
                break
            
        cv2.destroyAllWindows()


        
# 实例化
collect = Collect()
# 给你准备5s
time.sleep(5)
# 标签为1,采集15张
collect.main(3,30)

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值