A.使用VSCode新建一个python程序video2picture.py实现对视频的读取抽帧。 B.导入相应的python模块。 C.通过opencv打开视频流。 D.使视频流进行逐帧显示。 E.通过python创建三个文件images,labels,checkfile。 F.通过跳帧(每5帧抽取一帧)保存到images里边,图片的命名格式为视频名_*.jpg,*代表(00001到10000)的数字。 G.对抽取到本地的帧通过labelimg根据检测任务需求进行标注,生成xml文件。 H.利用命令或代码将xml文件移植到labels文件夹下 I.通过python对xml文件进行解析,读取标注信息。 J.将标注信息画到对应的图片上进行显示。 K.标注框显示采用逐框进行显示。 L.逐框显示完后将图片保存到checkfile文件夹下。 必要的注释及录制说明代码
时间: 2024-02-19 22:02:43 浏览: 115
以下是实现视频读取抽帧并进行标注和显示的Python代码,包括必要的注释及录制说明:
```python
# 导入Python模块
import cv2
import os
import xml.etree.ElementTree as ET
import numpy as np
# 定义视频文件名和路径
video_name = 'test.mp4'
video_path = os.path.join(os.getcwd(), video_name)
# 定义保存抽取图片、标注和标注后图片的文件夹路径
image_folder = 'images'
label_folder = 'labels'
check_folder = 'checkfile'
# 创建文件夹
if not os.path.exists(image_folder):
os.makedirs(image_folder)
if not os.path.exists(label_folder):
os.makedirs(label_folder)
if not os.path.exists(check_folder):
os.makedirs(check_folder)
# 打开视频文件
cap = cv2.VideoCapture(video_path)
# 定义帧数计数器
count = 0
# 循环读取帧
while cap.isOpened():
# 读取一帧
ret, frame = cap.read()
# 每5帧抽取一帧
if count % 5 == 0:
# 保存图片
image_name = os.path.join(image_folder, '{}_{:05d}.jpg'.format(video_name.split('.')[0], count))
cv2.imwrite(image_name, frame)
# 使用labelimg进行标注
# 生成xml文件名
xml_name = os.path.join(label_folder, '{}_{:05d}.xml'.format(video_name.split('.')[0], count))
# 移动xml文件到labels文件夹下
os.system('mv {}.xml {}'.format(xml_name.split('.')[0], label_folder))
# 读取xml文件
tree = ET.parse(xml_name)
root = tree.getroot()
# 获取图片尺寸
height, width, channels = frame.shape
# 遍历xml文件中的标注信息
for obj in root.findall('object'):
# 获取标注框信息
bndbox = obj.find('bndbox')
xmin = int(bndbox.find('xmin').text)
ymin = int(bndbox.find('ymin').text)
xmax = int(bndbox.find('xmax').text)
ymax = int(bndbox.find('ymax').text)
# 在图片上绘制标注框
cv2.rectangle(frame, (xmin, ymin), (xmax, ymax), (0, 255, 0), 2)
# 保存标注后的图片
check_name = os.path.join(check_folder, '{}_{:05d}.jpg'.format(video_name.split('.')[0], count))
cv2.imwrite(check_name, frame)
# 计数器加1
count += 1
# 按q键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放视频流和窗口
cap.release()
cv2.destroyAllWindows()
```
以上代码实现了对视频文件的读取、抽帧、标注和显示,并将抽取到的图片保存到images文件夹下,标注信息保存到labels文件夹下,标注后的图片保存到checkfile文件夹下。在代码中使用了labelimg工具进行标注,通过解析xml文件将标注信息画到对应的图片上进行显示。标注框的显示采用逐框进行显示。
阅读全文