发布时间:2023-04-20 10:00
不知道大家小时候有没有玩过这个?
最早的动画就是这么形成的,记得小时候还有这种小书卖。
其实视频的原理也是这样,一个视频是由很多张图片组成的,一个图片是一帧。所以我们要对视频进行画质增强,可以拆分成对
每一帧的图片进行操作,这个操作我们在前面介绍过。
因此,对视频进行画质增强的方法可以分为三步:拆分->处理->合成。
我们在第一篇文章讲到过如何捕获摄像头的视频流,以及如何读取视频并播放。不管通过哪种方法,我们都是通过帧操作的。所
以这里所谓的拆分就是获取到我们捕获到的视频流或者读取的视频流的每一帧。
success, img1 = cap.read()
# 如果正确读取帧,success为True
if not success:
break
cv2.imshow('img1', img1)
就是这么简单,我们就可以获取到视频每一帧了。
获取到视频的一帧之后,我们就要把这一帧转换成我们可以处理的格式的图片。在前面我们介绍如何对图片进行画质增强的时
候,使用的是 ImageEnhance 这个函数的相关方法,这个函数是 PIL 图像处理库里面的,所以我们必须把我们每一帧的图片读取
成 PIL 可以处理的格式:
image = Image.fromarray(np.uint8(img1)) # 转换成PIL可以处理的格式
读取到图像之后,我们就可以对图像进行画质增强处理了,这里还是用我们上篇文章中讲到的代码:
# 图像处理
python学习交流Q群:906715085####
def img_enhance(image, brightness=1, color=1,contrast=1,sharpness=1):
# 亮度增强
enh_bri = ImageEnhance.Brightness(image)
if brightness:
image = enh_bri.enhance(brightness)
# 色度增强
enh_col = ImageEnhance.Color(image)
if color:
image = enh_col.enhance(color)
# 对比度增强
enh_con = ImageEnhance.Contrast(image)
if contrast:
image = enh_con.enhance(contrast)
# 锐度增强
enh_sha = ImageEnhance.Sharpness(image)
if sharpness:
image = enh_sha.enhance(sharpness)
return image
图像处理完,我们需要每一帧图像进行合成,从而得到我们最终的视频:
cap = cv2.VideoCapture('你的视频目录/xxx.mp4')
success, _ = cap.read()
# 分辨率-宽度
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
# 分辨率-高度
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 总帧数
frame_counter = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
video_writer = cv2.VideoWriter('输出.mp4', cv2.VideoWriter_fourcc('M', 'P', '4', 'V'), 15, (width, height), True)
while success:
success, img1 = cap.read()
try:
image = Image.fromarray(np.uint8(img1)) # 转换成PIL可以处理的格式
img_enhanced = img_enhance(image, 2, 2, 2, 3)
video_writer.write(np.asarray(img_enhanced))
if cv2.waitKey(1) & 0xFF == ord('q'):
break
except:
break
cap.release()
video_writer.release()
cv2.destroyAllWindows()
我这里读取的是 mp4 格式的视频,所以在合成写视频文件的时候,我们需要用
cv2.VideoWriter_fourcc('M', 'P', '4', 'V') 这个格式。
我这里没有对图片的分辨率进行修改,只是分别获取原始视频的分辨率,然后写入视频文件的时候,将原始分辨率传入作为参数。
如果你需要修改视频的分辨率的话,可以使用下面的方式:
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
使用 resize 方法就可以了:
resized = cv2.resize(img, (width, height), interpolation = cv2.INTER_AREA)
效果在这里我就不发出来了,感兴趣的小伙伴可以动手试试。到此为止,我们的视频画质增强的功能算是基本实现了,代码也不
复杂,加起来也就这么点。但是,如果要处理成自己满意的效果,还是需要下一番功夫去调参数,去优化。甚至针对每一帧可能
传入的参数都不一样,这就需要各位自己去慢慢研究了。如果你觉得还不错的话,请不要吝啬你的赞和在看。