1、概要

在计算机视觉上,模型要想训练的好,必要的前提需要有大量的图片数据做支撑,我使用公开的人脸攻击视频数据集进行图片采集并进行训练,但是有一个问题需要处理,大量的视频数据集是手机拍摄的,但是我们使用opencv在采集视频每帧数据的时候有一个问题,由于不知道视频旋转方向导致后期的图片无法识别人脸头像进行训练,所以我们需要知道每个视频的旋转角度,然后将采集的每帧图片进行旋转矫正,用于后续的训练。

2、解决

我们通过ffmpeg模块可打印出手机拍摄的视频的信息,例如分辨率,大小,旋转角度等等信息,python中 通过调用info = ffmpeg.probe(file_name)方法可获取视频信息,视频的信息是一个json类型数据,我们可以在打印的信息中找到相关角度的信息,获取角度并实现对视频获取的图片进行翻转,同时我也对其进行了一个方法封装请往下看 。

{'streams': [{'index': 0, 'codec_name': 'h264', 'codec_long_name': 'H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10', 'profile': 'High', 'codec_type': 'video', 'codec_tag_string': 'avc1', 'codec_tag': '0x31637661', 'width': 480, 'height': 640, 'coded_width': 480, 'coded_height': 640, 'closed_captions': 0, 'has_b_frames': 2, 'sample_aspect_ratio': '1:1', 'display_aspect_ratio': '3:4', 'pix_fmt': 'yuv420p', 'level': 30, 'chroma_location': 'left', 'refs': 1, 'is_avc': 'true', 'nal_length_size': '4', 'r_frame_rate': '30/1', 'avg_frame_rate': '30/1', 'time_base': '1/15360', 'start_pts': 0, 'start_time': '0.000000', 'duration_ts': 182272, 'duration': '11.866667', 'bit_rate': '353103', 'bits_per_raw_sample': '8', 'nb_frames': '356', 'disposition': {'default': 1, 'dub': 0, 'original': 0, 'comment': 0, 'lyrics': 0, 'karaoke': 0, 'forced': 0, 'hearing_impaired': 0, 'visual_impaired': 0, 'clean_effects': 0, 'attached_pic': 0, 'timed_thumbnails': 0}, 'tags': {'rotate': '270', 'language': 'eng', 'handler_name': 'VideoHandler', 'vendor_id': '[0][0][0][0]'}, 'side_data_list': [{'side_data_type': 'Display Matrix', 'displaymatrix': '\n00000000:            0      -65536           0\n00000001:        65536           0           0\n00000002:            0    31457280  1073741824\n', 'rotation': 90}]}, {'index': 1, 'codec_name': 'aac', 'codec_long_name': 'AAC (Advanced Audio Coding)', 'profile': 'LC', 'codec_type': 'audio', 'codec_tag_string': 'mp4a', 'codec_tag': '0x6134706d', 'sample_fmt': 'fltp', 'sample_rate': '48000', 'channels': 2, 'channel_layout': 'stereo', 'bits_per_sample': 0, 'r_frame_rate': '0/0', 'avg_frame_rate': '0/0', 'time_base': '1/48000', 'start_pts': 0, 'start_time': '0.000000', 'duration_ts': 586752, 'duration': '12.224000', 'bit_rate': '128097', 'nb_frames': '575', 'disposition': {'default': 1, 'dub': 0, 'original': 0, 'comment': 0, 'lyrics': 0, 'karaoke': 0, 'forced': 0, 'hearing_impaired': 0, 'visual_impaired': 0, 'clean_effects': 0, 'attached_pic': 0, 'timed_thumbnails': 0}, 'tags': {'language': 'eng', 'handler_name': 'SoundHandler', 'vendor_id': '[0][0][0][0]'}}], 'format': {'filename': './video/G_NT_HS_g_E_2_13.mp4', 'nb_streams': 2, 'nb_programs': 0, 'format_name': 'mov,mp4,m4a,3gp,3g2,mj2', 'format_long_name': 'QuickTime / MOV', 'start_time': '0.000000', 'duration': '12.258000', 'size': '734419', 'bit_rate': '479307', 'probe_score': 100, 'tags': {'major_brand': 'isom', 'minor_version': '512', 'compatible_brands': 'isomiso2avc1mp41', 'encoder': 'Lavf56.19.101'}}}

import ffmpeg# 旋转角度获取
def get_video_rotate_angle(file_name):""" Get video rotate angle """try:info = ffmpeg.probe(file_name)return 360 - int(info['streams'][0]['tags']['rotate'])except KeyError as e:return 0except Exception as e:return -1

3、处理

解决了获取视频旋转角度的问题剩下的就能够剩下的问题便可迎刃而解,我们需要将视频按照每帧获取并在获取之前需要知道该视频是否是被旋转了的,并且通过上述封装方法获取旋转角度,使用imutils.rotate_bound(img,angle)进行图片翻转,使用dlib的68点定位获取每个图的人脸进行保存,为了提高执行效率,我们使用线程池对数据集进行处理,所有代码我放在下面。

# -*- coding: utf-8 -*-
"""
@Time    : 2021/10/11 11:13
@Author  : liwei
@Description:
"""
import cv2
import imutils
import ffmpeg
import os
import dlib
import time
import threadpool
# 旋转角度获取
def get_video_rotate_angle(file_name):""" Get video rotate angle """try:info = ffmpeg.probe(file_name)return 360 - int(info['streams'][0]['tags']['rotate'])except KeyError as e:return 0except Exception as e:return -1# 保存图片
def save_image(image, addr):address = addr + '.jpg'cv2.imwrite(address, image)# 获取视频每帧图片并旋转抠取人像
def get_video_image(videoName, savePath, angle, detector, predictor):# 读帧videoCapture = cv2.VideoCapture(videoName)date = time.strftime("%Y-%m-%d %H:%M:%S")# 计数i = 0print('{} save image start'.format(videoName))while True:success, img = videoCapture.read()try:if success:i = i + 1# save_image(img, savePath + "_" + str(i))# 旋转图片if angle > 0:img = imutils.rotate_bound(img, angle)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)dets = detector(gray, 1)for face in dets:shape = predictor(img, face)chang = []kuan = []# 遍历所有点,打印出其坐标,并圈出来for pt in shape.parts():chang.append(pt.x)kuan.append(pt.y)# 调节人像大小x1, x2 = max(chang) + 60, min(chang) - 65minSize = min(kuan)y1, y2 = max(kuan) + 100, minSize - int(minSize/2)cropped = img[y2 + 1:y1, x2 + 1:x1]if cropped.shape[1] > 200:cv2.imwrite(savePath + "_" + str(i) + '.jpg', cropped)print(date + " " + savePath + "_" + str(i) + '.jpg')#cropped = cv2.resize(cropped, (IMAGE_SIZE, IMAGE_SIZE), cv2.INTER_CUBIC)else:print('{} {} total {} images'.format(date, videoName, i))print('{} {} image save end'.format(date, videoName))breakexcept Exception as e:continuevideoCapture.release()cv2.destroyAllWindows()def main(f):dirName = f.split("_")[0]videoName.add(dirName)# 不存在目录先创建videoDir = VIDEO_OUTPUT_IMAGE + dirNametry:if not os.path.exists(videoDir):os.mkdir(videoDir)except FileExistsError:print("目录存在")# 获取视频旋转角度angle = get_video_rotate_angle(VIDEO_PATH + f)# 按帧截图get_video_image(VIDEO_PATH + f, videoDir + "/" + f, angle, detector, predictor)if __name__ == '__main__':# 常量# TEST = "./test/"VIDEO_PATH = "./video/flv/"# VIDEO_PATH = "./test/"# VIDEO_OUTPUT_IMAGE = './output/face_image/'VIDEO_OUTPUT_IMAGE = './output/test/'FACE_MODEL = "./model/shape_predictor_68_face_landmarks.dat"IMAGE_SIZE = 64# 变量videoName = set()# 人脸分类器detector = dlib.get_frontal_face_detector()# 获取人脸检测器predictor = dlib.shape_predictor(FACE_MODEL)# 获取文件夹下视频videoFileList = os.listdir(VIDEO_PATH)# 开始计时start_time = time.time()pool = threadpool.ThreadPool(2)requests = threadpool.makeRequests(main, videoFileList)[pool.putRequest(req) for req in requests]pool.wait()# 结束时间end_time = time.time()print('%s' % (end_time - start_time))

python通过手机拍摄的视频图片进行人脸头像采集相关推荐

  1. face_recognition、opencv中haar人脸特征:视频/图片 进行 人脸检测/人脸识别

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) import face_recognition import ...

  2. 如何使用python爬取百度图片_【Python】爬取百度图片进行人脸识别

    importos,cv2,requests,json,re,timeimporttensorflow as tffrom bs4 importBeautifulSoupdefcheck_path(pa ...

  3. python视频图片识别算法_python利用Opencv进行人脸识别(视频流+图片)

    首先:需要在在自己本地安装opencv具体步骤可以问度娘 如果从事于开发中的话建议用第三方的人脸识别(推荐阿里) 1.视频流中进行人脸识别 # -*- coding: utf-8 -*- import ...

  4. 使用OpenCV-python识别图片视频中的人脸和眼睛

    文章目录 思路和核心代码 识别图像中的人脸 识别视频中的人脸和眼睛 思路和核心代码 思路如下: 首先需要一个训练好的人脸和眼睛特征数据库,用于识别人脸和眼睛 识别出人脸和眼睛之后,返回所在的区域(一般 ...

  5. python如何爬取网页视频_快就完事了!10分钟用python爬取网站视频和图片

    原标题:快就完事了!10分钟用python爬取网站视频和图片 话不多说,直接开讲!教你如何用Python爬虫爬取各大网站视频和图片. 638855753 网站分析: 我们点视频按钮,可以看到的链接是: ...

  6. Python 计算机视觉(十六)—— 图像和视频中的人脸识别

    参考的一些文章以及论文我都会给大家分享出来 -- 链接就贴在原文,论文我上传到资源中去,大家可以免费下载学习,如果当天资源区找不到论文,那就等等,可能正在审核,审核完后就可以下载了.大家一起学习,一起 ...

  7. python做审计底稿视频_最新Python教学视频,每天自学俩小时,让你offer拿到手软...

    2020最新Python零基础到精通资料教材,干货分享,新基础Python教材,看这里,这里有你想要的所有资源哦,最强笔记,教你怎么入门提升!让你对自己更加有信心,重点是资料都是免费的,免费!!! 如 ...

  8. Python+OpenCV 调用手机摄像头并实现人脸识别

    文章内容: 1.windows 环境下安装 OpenCV 机器视觉环境搭建: 2.基于通过 Python+OpenCV调用手机摄像头并实现人脸检测识别. 目录 1 实验环境 2 实验准备 2.1 下载 ...

  9. 如何在python中显示电脑中的图片-python如何实现多个图片显示在屏幕上?

    pygame的三个方法(屏幕上显示需要的图片) yuhu102319582018-12-16 python将多幅图片显示在一张图片上 wugui1111116282018-06-15 iOS 图片显示 ...

最新文章

  1. 基础数据结构【一】————数组
  2. 输出链表倒数第K个节点
  3. python——正则表达式
  4. SAP进销存难点分析及对策
  5. maven package自己主动部署包
  6. 北斗导航 | 卫星导航系统时间转换:闰年(附C源代码)
  7. VTK:PolyData之PointCellIds
  8. c# 修改系统日期格式
  9. 妙趣横生算法 3:寻找相同元素的指针
  10. 空降了一位CTO,不到3个月,就被发现是一地鸡毛
  11. WPF控件获得焦点时去除虚线框
  12. mysql 12_Navicat for MySQL12免费版
  13. 基于AHP(层次分析法)确定权值的模糊综合评价
  14. 计算机主机号怎么产看,怎么查看笔记本电脑出厂编号
  15. 【用PROTEUS仿真点亮LED项目】
  16. 【React】一路走来并持续竞走
  17. 海尔电视 android,海尔电视怎么投屏
  18. 「解析」Self-Attention 关键点
  19. BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡
  20. 模式识别:最小错误率贝叶斯决策分类

热门文章

  1. 淘宝吱口令效果实现,获取系统剪贴板内容
  2. ERROR: Could not build wheels for numpy which use PEP 517 and cannot be installed directly
  3. 搞懂分布式技术28:微服务(Microservice)那点事
  4. 生动化你的表达——DuerOS中的SSML应用
  5. 查找SCI期刊的JCR缩写
  6. Entering emergency mode. Exit the shell to continue
  7. NLP基础-wangdong
  8. Android逆向:去除RE管理器4.41及车来了广告
  9. 项目经理培训后的一点感概
  10. allergro音乐术语什么意思_音乐术语大全