python使用opencv提取视频文件,本地电脑摄像机,视频流中的人脸。保存为图片的测试代码
发布日期:2021-07-01 05:36:08
浏览次数:2
分类:技术文章
本文共 4061 字,大约阅读时间需要 13 分钟。
当前使用
系统:Windows 10 64
python 3.7.3
opencv 3.4.4
python官网:
opencv下载地址:
注意当前使用的异常吹方式:当前帧处理失败时,直接跳过当前帧,继续执行。请根据实际情况进行处理异常。
#-*- coding: UTF-8 -*-!pip install D:/study/tf/03/opencv_python-3.4.4.19-cp37-cp37m-win_amd64.whlimport cv2import pandas as pdfrom PIL import Image# 一个图片截取一张人脸def getface(path, save_path): cap = cv2.VideoCapture(path) classfier = cv2.CascadeClassifier("D:/study/tf/03/haarcascade_frontalface_alt2.xml") suc = cap.isOpened() # 是否成功打开 frame_count = 0 out_count = 0 while suc: try: frame_count += 1 #if out_count > 1000: #最多取出多少张 # break suc, frame = cap.read() #读取一帧 params = [] params.append(2) # params.append(1) grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #将当前桢图像转换成灰度图像 faceRects = classfier.detectMultiScale(grey, scaleFactor = 1.2, minNeighbors = 3, minSize = (32, 32)) #读取脸部位置 faceRects = classfier.detectMultiScale(grey, scaleFactor = 1.2, minNeighbors = 3, minSize = (28, 28), flags=cv2.CASCADE_SCALE_IMAGE) if len(faceRects) > 0: #大于0则检测到人脸 for faceRect in faceRects: #单独框出每一张人脸 x, y, w, h = faceRect image = frame[y - 10: y + h + 10, x - 10: x + w + 10] image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) #转为灰度图 #img_new = cv2.resize(image,(47,57), interpolation = cv2.INTER_CUBIC) #处理面部的大小 img_new = cv2.resize(image,(47,57), interpolation = cv2.INTER_CUBIC) #处理面部的大小 # cv2.imwrite('/home/coding/workspace/Data/'+ name +'/%d.jpg' % out_count, img_new, params) #存储到指定目录 cv2.imwrite(save_path + '%d.jpg' % out_count, img_new, params) #存储到指定目录 out_count += 1 print('成功提取'+ name +'的第%d个脸部'%out_count) #break #每帧只获取一张脸,删除这个即为读出截取图片的全部面部 except BaseException: print('exception ... continue') pass continue cap.release() cv2.destroyAllWindows() print('总帧数:', frame_count) print('提取脸部:',out_count)# 一个图片截取多张人脸def getfaceM(path): cap = cv2.VideoCapture(path) # classfier = cv2.CascadeClassifier("D:/study/tf/03/haarcascade_frontalface_alt2.xml") classfier = cv2.CascadeClassifier("D:/study/tf/03/haarcascade_frontalface_default.xml") suc = cap.isOpened() # 是否成功打开 frame_count = 0 out_count = 0 while suc: try: frame_count += 1 #if out_count > 599: #最多取出多少张 # break suc, frame = cap.read() #读取一帧 params = [] params.append(2) # params.append(1) grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #将当前桢图像转换成灰度图像 #读取脸部位置 faceRects = classfier.detectMultiScale(grey, scaleFactor = 1.2, minNeighbors = 3, minSize = (28, 28)) #大于0则检测到人脸 if len(faceRects) > 0: for faceRect in faceRects: #单独框出每一张人脸 for (x,y,w,h) in rects: x, y, w, h = faceRect image = frame[y - 10: y + h + 10, x - 10: x + w + 10] # cv2.rectangle(image, (x,y), (x+w,y+h), (0,255,0), 2) #转为灰度图 image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) #处理面部的大小,像素大小随其他软件处理设置 img_new = cv2.resize(image,(30,30), interpolation = cv2.INTER_CUBIC) cv2.imwrite('D:/tmp/aa/img/%d.jpg' % out_count, img_new, params) #保存图片 out_count += 1 print('成功提取'+ name +'的第%d个脸部'%out_count) break #每帧只获取一张脸,删除这个即为读出全部面部 except BaseException: print('exception ... continue') pass continue cap.release() cv2.destroyAllWindows() print('总帧数:', frame_count) print('提取脸部数量:',out_count) file_name = 'c' # a b c 0 # 0为本电脑摄像头 rtsp:@1/hks if __name__ == '__main__': print(cv2.__version__) print("D:/tmp/aa/"+ file_name +".mp4", 'D:/tmp/aa/img/') getface("D:/tmp/aa/"+ file_name +".mp4", 'D:/tmp/aa/img/') #参数为视频地址 #getfaceM("D:/tmp/aa/"+ file_name +".mp4", 'D:/tmp/aa/img/') #参数为视频地址
转载地址:https://openai.blog.csdn.net/article/details/100214158 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2024年04月29日 08时41分40秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
如何输入多组数据并输出每组数据的和?
2019-04-30
行阶梯型矩阵
2019-04-30
JAVA学习笔记6 - 数组
2019-04-30
【学习笔记】Android Activity
2019-04-30
location区段
2019-04-30
linux内存的寻址方式
2019-04-30
how2heap-double free
2019-04-30
MyBatisPlus简单入门(SpringBoot)
2019-04-30
xss-labs详解(上)1-10
2019-04-30
xss-labs详解(下)11-20
2019-04-30
Linux png转jpg (convert命令)
2019-04-30
CodeForces - 456C Boredom (dp)
2019-04-30
ACM 2013 长沙区域赛 Collision (几何)
2019-04-30
ACM 2014 鞍山区域赛 E - Hatsune Miku (dp)
2019-04-30
反向传播&梯度下降 的直观理解程序(numpy)
2019-04-30
ACM 2017 北京区域赛 J-Pangu and Stones(区间dp)
2019-04-30
java常用类 String面试题
2019-04-30
四线触摸屏原理
2019-04-30
腾讯AI语音识别API踩坑记录
2019-04-30
java.net.BindException: 无法指定被请求的地址
2019-05-01