Yunet的具体介绍在上一篇博客,里面包含了基本介绍已经github的代码地址,这篇是基于opencv的用Yunet运行视
视频运行Yunet
原始demo.py
if__name__ == "__main__":
model = YuNet(modelPath=args.model,
inputSize=[320, 320],
confThreshold=args.conf_threshold,
nmsThreshold=args.nms_threshold,
topK=args.top_k,
backendId=args.backend,
targetId=args.target)
# If input is an image
if args.input is not None: # 图片测试入口
image = cv.imread(args.input)
h, w, _ = image.shape
# Inference
model.setInputSize([w, h])
results = model.infer(image)
# Print results
print('{} faces detected.'.format(results.shape[0]))
for idx, det in enumerate(results):
print('{}: {:.0f} {:.0f} {:.0f} {:.0f} {:.0f} {:.0f} {:.0f} {:.0f} {:.0f} {:.0f} {:.0f} {:.0f} {:.0f} {:.0f}'.format(
idx, *det[:-1])
)
# Draw results on the input image
image = visualize(image, results)
# Save results if save is true
if args.save:
print('Resutls saved to result.jpg\n')
cv.imwrite('result.jpg', image)
# Visualize results in a new window
if args.vis:
cv.namedWindow(args.input, cv.WINDOW_AUTOSIZE)
cv.imshow(args.input, image)
cv.waitKey(0)
else: # Omit input to call default camera
deviceId = 0
cap = cv.VideoCapture(deviceId)
w = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
h = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
model.setInputSize([w, h])
tm = cv.TickMeter()
while cv.waitKey(1) < 0:
hasFrame, frame = cap.read()
if not hasFrame:
print('No frames grabbed!')
break
# Inference
tm.start()
results = model.infer(frame) # results is a tuple
tm.stop()
# Draw results on the input image
frame = visualize(frame, results, fps=tm.getFPS())
# Visualize results in a new Window
cv.imshow('YuNet Demo', frame)
tm.reset()
视频demo.py
1.初始化视频读取对象
cap = cv.VideoCapture(video_path) 初始化视频读取对象`
2. 设置循环一直读取
设置循环一直读取while true
3. 视频图像化
cap = cv.VideoCapture(video_path) `视频图像化准备,实例化一个图像对象
4.获取视频基本信息
# 读取视频的相关参数 帧数 高 宽
fps_ = int(cap.get(cv.CAP_PROP_FPS))
size = (int(cap.get(cv.CAP_PROP_FRAME_WIDTH)),int(cap.get(cv.CAP_PROP_FRAME_HEIGHT)))
5.按帧数读取视频
之前在这里卡了几天,因为读取视频显示的时候一直卡在第一帧,无法更新,最后尝试了读取特定帧数
count = 0 # 循环外设置一个变量,用来控制读取的帧数每循环一次加一
# 读取指定帧数
frame_cap = count
cap.set(cv.CAP_PROP_POS_FRAMES, frame_cap) # 读取count帧
ret, image = cap.retrieve() # retrieve返回的就是指定帧数的图像
6. 判断有无对象
if results is not None : # 检测到是否存在人脸框
print('{} faces detected.'.format(results.shape[0]))
for idx, det in enumerate(results):
print('{}: {:.0f} {:.0f} {:.0f} {:.0f} {:.0f} {:.0f} {:.0f} {:.0f} {:.0f} {:.0f} {:.0f} {:.0f} {:.0f} {:.0f}'.format(
idx, *det[:-1])
)
else: # 不加这一步会报错,当一帧没有检测到人脸时results.shape就会报错,因为没有results对象
results = []
results返回的是一个数组类型,存的是检测到的人脸框的数据
7. 显示图像 保存视频
cv.imshow(args.input, image) # 显示
cv.waitKey(30) # 设置等待时间
cap.release()
fourcc = cv.VideoWriter_fourcc('M', 'P', '4', 'V') # 初始化视频保存对象
out = cv.VideoWriter(r"result.mp4", fourcc, fps_, size) # 保存的名字 对象 帧数 大小
out.write(image) # 写入图片
count += 0.5 # 帧数没显示一次加1帧
out.release() # 释放输出窗口
cv.destroyAllWindows()
8.视频取帧
count += 5
每运行一次软件重新读取时加的帧数,这里的数字加的越大,播放出来的视频就越流畅