栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python图像与音视频处理——PIL、OpenCV、FFmpeg

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python图像与音视频处理——PIL、OpenCV、FFmpeg

一、人脸识别和图像处理的结合

学会了人脸识别之后,可以尝试一些有趣的应用,比如制作一些表情包。

     

制作这张表情包需要三步:

  1. 将图像中的人脸识别出来,检测人脸的位置并返回。
  2. 对人脸的区域进行部分高斯模糊,得到马赛克效果。
  3. 在图片中加上中文文本。
1、人脸识别
#人脸识别
import face_recognition
import cv2
import matplotlib.pyplot as plt

image=face_recognition.load_image_file("./imgs/minguo.jpg")
face_locations=face_recognition.face_locations(image)

face_num2=len(face_locations)
print(face_num2)  # 返回检测到的人脸数量

org=cv2.imread("./imgs/minguo.jpg")
for i in range(0,face_num2):
    top=face_locations[i][0]
    right=face_locations[i][1]
    bottom=face_locations[i][2]
    left=face_locations[i][3]
    
    start=(left,top)
    end=(right,bottom)
    print(start,end)   # 返回人脸位置
    
    color=(0,255,0)
    thickness=5
    img=cv2.rectangle(org,start,end,color,thickness)
    
plt.imshow(img)
plt.axis("off")
plt.show()

返回值:

 2、局部高斯模糊

局部高斯模糊的思路是:先将人脸的部分区域复制出来,整体进行模糊,再将处理好的图像贴回到图片的原位置上。中间用到了对彩色图像进行高斯模糊的处理方法。同样的思路也可以针对视频处理,得到人脸打码的效果。 

#对图像做局部模糊处理
from PIL import Image
import os
import matplotlib.pyplot as plt
from numpy import *
from scipy.ndimage import filters

print(os.getcwd())  #查看当前工作目录

box = start + end   #之前返回的人脸位置信息
sticker = Image.open('./imgs/minguo.jpg')
region =sticker.crop(box)    # 将识别到的人脸区域复制出来

im = array(region) #将图片转换为数组
im2 = zeros(im.shape)
for i in range(3):
    im2[:,:,i] = filters.gaussian_filter(im[:,:,i],10)  # 对彩色图像的每一个颜色通道进行模糊
im2 = uint8(im2)
region = Image.fromarray(im2) #将图像的数据类型转换回去,才能进行粘贴

sticker.paste(region,box)
sticker.show()
sticker.save("./imgs/sticker.jpg")

得到的图像:

 

 3、在图像上添加中文文本

OpenCV不能写入中文,需要用PIL处理,因此中间多了两次格式的转化。

#图像上写字
import cv2
from PIL import Image, ImageDraw, ImageFont
import numpy as np

img = cv2.imread("./imgs/sticker.jpg")
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))  # 转换为PIL格式

fontStyle = ImageFont.truetype("aigei.ttf", 45, encoding="utf-8") 
draw = ImageDraw.Draw(img) # 创建一个可以在给定图像上绘图的对象
draw.text((30,500), "当事人:现在就是后悔,非常后悔", (0, 255, 0), font=fontStyle)    # 左上角为画布坐标(0,0)点
im = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)    # 转换回OpenCV格式

cv2.imshow('stickers',im)
cv2.waitKey()   # imshow后面必须跟上该功能才能正常显示
cv2.imwrite("./imgs/add_text.jpg",im)

 最终结果:

 

二、视频处理

视频处理的思路是先将视频分解成一帧一帧的图像,对每一帧进行处理,处理好后再将帧合并为视频。会用到的模块包括OpenCV、FFmpeg、PIL等。

  • OpenCV:强大的计算机视觉库,可以进行图片和视频处理

  • FFmpeg:视频处理软件,在官网下载安装包安装,代码要在命令行输入。

  • PIL:Python的图像处理工具,可以进行图像的旋转、剪裁、粘贴、调色等操作。

利用FFmpeg的命令:

ffmpeg -f image2 -i ./pic/image%d.jpg -r 24 output.mp4

可以将一个MP4格式的视频分解为24帧/秒的图像,保存在本地文件夹中。

利用OpenCV同样可以达到该目的:

import os
import cv2
import subprocess

os.chdir(r"C:Users95378Python2021")
v_path="ghz.mp4"
image_save="./pic"    # 这里保存图像的文件夹需要在本地手动新建

cap=cv2.VideoCapture(v_path)    # 读取本地视频
frame_count=cap.get(cv2.CAP_PROP_frame_COUNT)     # 帧数

for i in range(int(frame_count)):
    _,frame=cap.read()       # 按帧读取视频,frame为每一帧的图像
    frame=cv2.cvtColor(frame,cv2.cv2.COLOR_BGR2GRAY)  # 图像转换为OpenCV格式
    cv2.imwrite("./pic/image{}.jpg".format(i),frame)    #写入本地文件夹

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/315713.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号