python 使用opencv标注视频,同时截取帧保存为图片。
pip install opencv-python -i https://mirrors.aliyun.com/pypi/simple/ 必要
pip3 install pillow 必要redis和request不是必须的,这是其他流程需要所以引用
pip3 install redis 非必要
pip install requests -i https://mirrors.aliyun.com/pypi/simple/ 非必要
方法一、直接截图并标注视频
# 视频标注
import cv2
import os
import numpy
import ast
from PIL import Image, ImageDraw, ImageFont
import redis
import json
import requests
#接收java参数
# fromPath = argv[1]
# toPath = argv[2]
# dirPath = argv[3]
# key_prefix = argv[4]
# redisIp = 'argv[5]'
fromPath = 'E:\\ztest\\200M20201116114531.mp4'
toPath = 'E:\\ztest\\200M20201116114531_test.mp4'
dirPath = 'E:/ztest/pic/'
key_prefix = 'fimename'
redisIp = ''
video = fromPath
result_video = toPath
# 给图片添加汉字
def cv2ImgAddText(img, text, left, top, text_color, text_size):
if isinstance(img, numpy.ndarray):
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(img)
fontText = ImageFont.truetype("msyh.ttc", text_size, encoding="utf-8")
draw.text((left, top), text, text_color, font=fontText)
return cv2.cvtColor(numpy.asarray(img), cv2.COLOR_RGB2BGR)
# redis存值
def setToRedis(key, value):
r = redis.StrictRedis(host=redisIp, port=6379, db=0)
r.set(key, value)
# redis取值
def getFromRedis(key):
r = redis.StrictRedis(host=redisIp, port=6379, db=0)
return r.get(key)
#发送请求并传参
def sendRequest(fileName):
url = 'http://localhost:8188/test'
data = {'fileName': key_prefix}
requests.get(url, data)
# 获取txt内容
# with open(txt_path, 'r', encoding='utf-8') as f:
# content = f.read()
# content = ast.literal_eval(content)
# 读取视频
cap = cv2.VideoCapture(video)
# 获取视频帧率
fps_video = cap.get(cv2.CAP_PROP_FPS)
# 设置写入视频的编码格式
fourcc = cv2.VideoWriter_fourcc("H", "2", "6", "4")
# 获取视频宽度
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
# 获取视频高度
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
videoWriter = cv2.VideoWriter(result_video, fourcc, fps_video, (frame_width, frame_height))
frame_id = 0
# 获取视频帧数
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
# 获取帧的间隔
frame_interval = 1
for i in range(frame_count):
ret, frame = cap.read()
# 每隔frame_interval帧进行一次截屏操作
if i % 1 == 0:
x1 = 110
y1 = 150
x2 = 200
y2 = 250
text = '哈哈'
# 添加中文
frame = cv2ImgAddText(frame, text, (x1), (y1), (55, 255, 155), 40)
# 矩形框
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 4)
# 截图
cv2.imwrite(dirPath + '/' + str(i) + '.jpg', frame)
# 将标注内容写入视频
videoWriter.write(frame)
# 执行结束释放资源
cap.release()
视频结果在这里插入图片描述
截图结果