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)