前言
代码是东拼西凑的,不专业很业余。 大佬勿喷!!!狗头保命。
效果图

代码
import cv2
import random
import numpy
import os
import time
import glob
from PIL import Image, ImageDraw, ImageFont
def file_name(file_dir):
filepaths=[]
filess=[]
for root, dirs, files in os.walk(file_dir):
# print(root) #当前目录路径
# print(dirs) #当前路径下所有子目录
print(files) #当前路径下所有非目录子文件
filess=files
for filename in files:
tmp=file_dir+"\\"+filename
filepaths.append(tmp)
return filepaths
def cv2ImgAddText(img, text, left, top, textColor=(0, 0, 0), textSize=20):
if (isinstance(img, numpy.ndarray)): # 判断是否OpenCV图片类型
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
# 创建一个可以在给定图像上绘图的对象
draw = ImageDraw.Draw(img)
# 字体的格式
fontStyle = ImageFont.truetype(
"font/simsun.ttc", textSize, encoding="utf-8")
# 绘制文本
draw.text((left, top), text, textColor, font=fontStyle)
# 转换回OpenCV格式
return cv2.cvtColor(numpy.asarray(img), cv2.COLOR_RGB2BGR)
def geneHead(videoname,videosize,x,y):
background = Image.new('RGB', (x,y), "Beige")
# img2 = cv2.putText(background, videoname, (100, 100), cv2.LINE_AA, 2, (249, 249, 249), 4)
background.save("./head.png")
img=cv2.imread("./head.png")
img= cv2ImgAddText(img,"FileName:"+videoname,100,100,(0, 0, 0),60)
img= cv2ImgAddText(img,"FileSize:"+str(videosize)+"MB",100,200,(0, 0, 0),60)
cv2.imwrite("./head.png", img)
return img
def contatHeaAndNine(head,nine,w,h,disname):
""" image_names: list, 存放的是图片的绝对路径 """
# 1.创建一块背景布
target_shape = (int(3*w),int(3*h+300))
background = Image.new('RGBA', target_shape, (0,0,0,0,))
background.paste(head, (0,0))
background.paste(nine, (0,300))
background.save("./"+disname)
def image_concat(image_names):
""" image_names: list, 存放的是图片的绝对路径 """
# 1.创建一块背景布
image = Image.open(image_names[0])
width, height = image.size
target_shape = (3*width, 3*height)
background = Image.new('RGBA', target_shape, (0,0,0,0,))
# 2.依次将图片放入背景中(注意图片尺寸规整、mode规整、放置位置)
for ind, image_name in enumerate(image_names):
img = Image.open(image_name)
img = img.resize((width, height)) # 尺寸规整
if img.mode != "RGBA": # mode规整
img = img.convert("RGBA")
row, col = ind//3, ind%3
location = (col*width, row*height) # 放置位置
background.paste(img, location)
background.save("./nine.png")
def timeformat(num):
a = time.strftime('%H:%M:%S', time.gmtime(num))
print(a)
return a
def get_video_duration(filename):
cap = cv2.VideoCapture(filename)
if cap.isOpened():
rate = cap.get(5)
frame_num =cap.get(7)
duration = frame_num/rate
return duration
return -1
def get_frame_from_video(video_name, frame_time, img_dir, img_name,w,h,text):
vidcap = cv2.VideoCapture(video_name)
vidcap.set(cv2.CAP_PROP_POS_FRAMES, frame_time - 1)
success, image = vidcap.read()
image=addwoater(image,w,h,str(timeformat(text)))
if not os.path.exists(img_dir):
os.makedirs(img_dir)
if success:
cv2.imwrite(img_dir + img_name, image)
def get_vedio_height_width(filename):
cap = cv2.VideoCapture(filename)
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH )
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
return width,height
def addwoater(img,w,h,text):
print(w)
img2 = cv2.putText(img, text, (100, 100), cv2.LINE_AA, 2, (249, 249, 249), 4)
return img2
def get_FileSize(filePath):
fsize = os.path.getsize(filePath)
fsize = fsize/float(1024*1024)
return round(fsize,2)
def getFileName(url):
tmp=url.split("\\")
return tmp[len(tmp)-1]
def compressImage(srcPath,dstPath):
#打开原图片缩小后保存,可以用if srcFile.endswith(".jpg")或者split,splitext等函数等针对特定文件压缩
sImg=Image.open(srcFile)
w,h=sImg.size
dImg.save(dstFile) #也可以用srcFile原路径保存,或者更改后缀保存,save这个函数后面可以加压缩编码选项JPEG之类的
#图片数量
picnum=10
def main(url):
# 视频大小
mb=get_FileSize(url)
#视频名称
filename=getFileName(url)
#视频长宽
w,h=get_vedio_height_width(url)
#总帧数
sumframenum = cv2.VideoCapture(url).get(7)
# 视频时间长度
videolength=get_video_duration(url)
# 分段间隔
d=sumframenum/picnum
#生成的帧号序列
framestamp=[]
#帧号获得时间戳
timestamp=[]
rand=random.uniform(0.8,1)
for i in range(picnum):
if(i==0):
continue
frame=rand*d*i
framestamp.append(frame)
timestamp.append(frame/sumframenum*videolength)
flag=1
for i in framestamp:
get_frame_from_video(url,i,"./test/","IMAGE"+str(flag)+".PNG",w,h,timestamp[flag-1])
flag=flag+1
img_dir = "./test/"
image_names = sorted(glob.glob(img_dir+"*"))
image_concat(image_names)
geneHead(filename,mb,int(w*3),300)
contatHeaAndNine(Image.open("./head.png"),Image.open("./nine.png"),w,h,filename+"9.png")
filepaths=file_name(r"C://")
print(filepaths)
urls=filepaths
for i in urls:
main(i)
版权声明:本文为UFOO2原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。