中的所有面孔。最近写论文需要涉及到人脸提取操作。结合之前的人脸识别项目:Python自动识别人脸,将ffmpeg的电影一帧一帧的提取出来。自动提取电影中的所有面孔。我们知道机器学习和深度学习算法需要一定的数据量才能达到更好的效果。所以我们今天的函数可以主要用于一些人脸识别算法的训练集提取。1、准备使用ffmpeg提取视频中的图片。其安装方法如下:1.1在windows上安装ffmpeg:1.http://ffmpeg.zeranoe.com/bui...,点击下载构建按钮2.解压ffmpeg-20170418-6108805-win64-static.zip文件到指定目录;将解压文件目录下的bin目录(包括ffmpeg.exe)添加到path环境变量中(_本机->右键->属性->高级系统设置->环境变量->编辑路径用户变量->新建->输入bin目录的完整路径_);3、进入cmd,输入ffmpeg-version验证当前系统是否识别ffmpeg,查看ffmpeg的版本;如果可以,则安装成功。1.1在macOS上安装ffmpeg:1.Command+空格搜索终端(Terminal)2.输入以下命令安装homebrew:/usr/bin/ruby-e"$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/install/master/install)”3.输入以下命令安装ffmpeg:brewinstallffmpeg1.2安装OpenCV提取人脸模块:如果你已经安装了Python(如果没有,请阅读这篇文章:Super详细的Python安装指南),打开CMD/terminal(Termianl),输入以下命令进行安装:pipinstallopencv-python接下来,让我们先学习逐帧提取电影中的图片。2.提取图片FFmpeg从视频中提取图片非常简单,而且功能非常强大,可以选择多少秒提取一帧,或者每秒提取X帧。如果我们只需要每秒1帧,在CMD或者Terminal中输入如下命令:ffmpeg-ivideopath.mp4-r1image-%5d.jpg其中:-r1表示每秒取1帧image-%5d.jpg表示命名格式为image-00001.jpg如图:这样就可以得到视频中的帧图像:3.从图像中提取人脸如果你看过我之前的文章:Python自动识别人脸开启后,你就会知道用OpenCV提取人脸非常简单。它只需要你使用cv2.imread函数读取图片,然后使用训练好的分类器文件来获取人脸的位置。如下代码所示:defread_pic_save_face(sourcePath,targetPath,*suffix):"""提取图片中的人脸1.一张一张查看列表中的图片,找出人脸并写入目标文件夹2.haarcascade_frontalface_alt.xml是库训练的分类器文件3.下载opencv,xml文件可以在安装目录下找到或者关注Python实战宝典公众号后台回复电影提取人脸获取文件和源码@paramsourcePath:图片来源目录@paramtargetPath:人脸目标目录@param*suffix:图片后缀"""ImagePaths=get_all_path(sourcePath,*suffix)count=0face_cascade=cv2.CascadeClassifier('./haarcascade_frontalface_alt.xml')#classifierforimagePathinImagePaths:#遍历所有图像img=cv2.imread(imagePath)iftype(img)!=str:faces=face_cascade.detectMultiScale(img,1.1,5)iflen(faces):write_face(targetPath,faces)print('Find'+str(count-1)+'facestoDestination'+targetPath)获取到人脸的位置后,我们只需要将这部分位置写入新图片即可:defwrite_face(imagePath,targetPath,faces,count,img):"""将人脸图像写入到目标目录@paramimagePath:图片目录@paramtargetPath:目标目录@paramfaces:人脸数据@paramcount:number@paramimg:imagedata"""for(x,y,w,h)infaces:#设置人脸宽度大于16像素,去掉较小的faceifw>=16andh>=16:#使用时间戳和读取顺序作为文件名listStr=[str(int(time.time())),str(count)]fileName=''.join(listStr)#放大图片,根据坐标调整X=int(x)W=min(int(x+w),img.shape[1])Y=int(y)H=min(int(y+h),img.shape[0])f=cv2.resize(img[Y:H,X:W],(W-X,H-Y))cv2.imwrite(targetPath+os.sep+'%s.jpg'%fileName,f)count+=1print(imagePath+"haveface")怎么样,是不是很简单?完整代码如下:#-*-coding:utf8-*-importosimportcv2importtimedefget_all_path(dirpath,*后缀):"""所有路径@paramdirpath:目录@param*suffix:后缀"""PathArray=[]forr,ds,fsinos.walk(dirpath):forfninfs:ifos.path.后缀中的splitext(fn)[1]:fname=os.path.join(r,fn)PathArray.append(fname)returnPathArraydefwrite_face(imagePath,targetPath,faces,count,img):"""将人脸图片写入目标目录@paramimagePath:图片目录@paramtargetPath:目标目录@paramfaces:facePartialdata@paramcount:number@paramimg:imagedata"""for(x,y,w,h)infaces:#设置人脸宽度大于16像素,若w>=则移除较小的人脸16andh>=16:#使用时间戳和读取顺序作为文件名listStr=[str(int(time.time())),str(count)]fileName=''.join(listStr)#展开图片,根据坐标可调X=int(x)W=min(int(x+w),img.shape[1])Y=int(y)H=min(int(y+h),img.shape[0])f=cv2.resize(img[Y:H,X:W],(W-X,H-Y))cv2.imwrite(targetPath+os.sep+'%s.jpg'%fileName,f)计数+=1print(imagePath+"haveface")defread_pic_save_face(sourcePath,targetPath,*suffix):"""提取图片中的人脸1.一张一张查看列表中的图片,找出人脸并写入到目标文件夹下2.haarcascade_frontalface_alt.xml是库训练的分类器文件3.下载opencv,xml文件可以在安装目录找到或者关注Python实战宝典公众号后台回复电影提取人脸获取文件及源码@paramsourcePath:图片源目录@paramtargetPath:人脸目标目录@param*suffix:图片后缀"""ImagePaths=get_all_path(sourcePath,*suffix)count=0face_cascade=cv2.CascadeClassifier('./haarcascade_frontalface_alt.xml')#classifierforimagePathinImagePaths:#遍历所有图片img=cv2.imread(imagePath)iftype(img)!=str:faces=face_cascade.detectMultiScale(img,1.1,5)iflen(faces):write_face(imagePath,targetPath,faces,count,img)print('Find'+str(count-1)+'facestoDestination'+targetPath)if__name__=='__main__':sourcePath='frames/greenbooks'targetPath1='target/greenbooks'read_pic_save_face(sourcePath,targetPath1,'.jpg','.JPG','png','PNG')最后我们看一下effect:大部分提取都是正确的,当然也有一些例外,还得手动去掉比如这个(汗):人脸也能分类???咦???(不过仔细看还是很像的)我们的文章到此结束,如果你想要我们今天的Python教程,请继续关注我们,如果对您有帮助,请在下方点赞/观看。有什么问题可以在下方留言区留言,我们会耐心解答!Python实战宝典(pythondict.com)不只是一个合集欢迎关注公众号:Python实战宝典原文来自Python实战宝典:Python自动提取电影中的所有面孔
