视频运行Yunet 人脸检测

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
每运行一次软件重新读取时加的帧数,这里的数字加的越大,播放出来的视频就越流畅
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值