前言
参考:
从视频中提取图片:如何将视频逐帧提取成为一张张图片?
图片重命名:python文件批量改名
制作数据集:睿智的目标检测12——使用labeling进行目标检测数据集标注
批量修改标签名称:如何批量修改Pascal VOC数据集中xml标签中的标签名称
拍摄视频并提取图片
拍摄视频
getvedio.py
'''
python 录制mp4视频 by 郑瑞国
'''
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
## some videowriter props
sz = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
fps = 20
# fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
# fourcc = cv2.VideoWriter_fourcc('m', 'p', 'e', 'g')
fourcc = cv2.VideoWriter_fourcc(*'mpeg')
## open and set props
out = cv2.VideoWriter()
out.open('getvedio/16.mp4', fourcc, fps, sz, True)
while (True):
ret, frame = cap.read()
out.write(frame)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xff == ord('q'):
break
out.release()
cap.release()
cv2.destroyAllWindows()
提取图片
方法1:视频帧差法提取图片
frame_extract.py
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import os
import urllib
def frame_difference(frame1, frame2): #求取侦差
# f1, f2
f1 = cv2.resize(frame1, (416, 416))
f2 = cv2.resize(frame2, (416, 416))
f1 = cv2.cvtColor(f1, cv2.COLOR_BGR2GRAY)
f2 = cv2.cvtColor(f2, cv2.COLOR_BGR2GRAY) # 灰度化
f1 = cv2.threshold(f1, 128, 255, cv2.THRESH_BINARY)[1] # 二值化
f2 = cv2.threshold(f2, 128, 255, cv2.THRESH_BINARY)[1]
diff = cv2.absdiff(f1, f2) #求取差值
p = cv2.countNonZero(diff) / float(416 * 416)
return p
if __name__ == "__main__":
root = r'F:\0-0\Myyolo\vedio_img\getvedio'
threshold = 0.09 #阙值
frame_interval = 15 #帧间隔
save_root = r'F:\0-0\Myyolo\vedio_img\getvedio\img'
for c, path in enumerate(os.listdir(root)):
path = os.path.join(root, path)
video = cv2.VideoCapture(path)
count = 0
st, frame1 = video.read() #st,frame是获cv2.VideoCapture.read()方法的两个返回值。
st, frame2 = video.read() #其中st是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵。
while st:
if count % frame_interval == 0:
st, frame2 = video.read()
p = frame_difference(frame1, frame2) #求取侦差
print(p)
if p > threshold:
save_dir = os.path.join(save_root, os.path.splitext(os.path.basename(path))[0])
if not os.path.exists(save_dir): #如果目录不存在
os.makedirs(save_dir) #创建目录
print(save_dir)
#cv2.imencode(os.path.join(save_dir, str(count)+'.jpg'), frame1)
#cv2.imencode(str(count)+'.jpg', frame1)[1].tofile(save_dir)
cv2.imwrite(os.path.join(save_dir, str(count) + '.jpg'), frame1)
print('保存图片')
frame1 = frame2
st, frame2 = video.read()
count += 1
if st:
cv2.imshow("video%d"%c, frame2) #函数可以在窗口中显示图像。该窗口和图像的原始大小自适应(自动调整到原始尺寸)。
cv2.waitKey(100) #是一个和键盘绑定的函数,它的作用是等待一个键盘的输入(因为我们创建的图片窗口如果没有这个函数的话会闪一下就消失了,所以如果需要让它持久输出,我们可以使用该函数)。它的参数是毫秒级。该函数等待任何键盘事件的指定毫秒。如果您在此期间按下任何键,程序将继续进行。我们也可以将其设置为一个特定的键。
video.release() #发布软件资源 / 释放硬件资源
cv2.destroyAllWindows() #销毁我们创建的所有窗口。如果要销毁任何特定窗口,请使用函数cv2.destroyWindow(),其中传递确切的窗口名称作为参数。(应该是使用创建窗口时所使用的窗口名称,字符串类型。)
print("video%d"%c, "done!")
方法2:定时从视频截图
使用img_extract.py
# 每隔 多少 秒 提取视频中的图片到文件夹
# This is a sample Python script.
# Press Shift+F10 to execute it or replace it with your code.
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.
def print_hi(name):
# Use a breakpoint in the code line below to debug your script.
print(f'Hi, {name}') # Press Ctrl+F8 to toggle the breakpoint.
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
print_hi('PyCharm')
# See PyCharm help at https://www.jetbrains.com/help/pycharm/
# -*- coding: utf-8 -*-
import os
import cv2 ##加载OpenCV模块
def video2frames(pathIn: object = '',
pathOut: object = '',
only_output_video_info: object = False,
extract_time_points: object = None,
initial_extract_time: object

1127

被折叠的 条评论
为什么被折叠?



