对于图片或者视频最常见的操作莫过于缩放了吧,本篇文章主要介绍一下使用 OpenCV-Python 对Image,Video 、Live Video 进行缩放尺寸。
当我们使用分辨率超高的相机或者WebCam进行拍摄例如720P的视频时,当视频上传到电脑上,我们可能会放大或者缩小视频源以适配播放器或者电脑显示器尺寸的需求,这是我们会对视频进行 Rescale,也许是缩小为原来的 0.75倍,也许是放大为原来的 1.25 倍,这些操作我们用 OpenCV-Python 都可以轻松的实现。
由于原先的视频像素总数是固定不变的,放大和缩小都会导致部分的像素被忽略或者新增新的像素,这里涉及到矩阵插值的算法。
Resize Image
视频的每一帧可以当做是图片,我们这里用视频来演示缩放图片:
import cv2 as cv
capture = cv.VideoCapture('./Videos/dog.mp4')
def resize_frame(img, scale=0.75):
return cv.resize(img, dsize=None, fx=scale, fy=scale, interpolation=cv.INTER_AREA)
while True:
isSuccess, frame = capture.read()
if not isSuccess:
break
new_frame = resize_frame(frame)
cv.imshow("video", frame)
cv.imshow("video rescaled", new_frame)
if cv.waitKey(20) & 0xFF == ord('s'):
break
capture.release()
cv.destroyAllWindows()
scale_frame
是自定义函数,用以传入视频的一帧数据,按照缩放系数 scale
进行宽高的缩放。
cv. resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)
:
调整一张图片的大小,src
即为输入的图片数据,dsize
(dst size) 是一个 tuple,以代表返回图片的大小,fx
, fy
为缩放倍数。dsize
和 fx, fy
是两种缩放的方式,一种指定生成图片的大小,一种通过约定缩放系数,可根据实际场景灵活选择使用。
interpolation
为插值类型,一个图片从 4×4 放大到 8*8 的时候, 就会产生一些新的像素点,如何给这些值赋值, 就是 interpolation
插值所要解决的问题:
interpolation
具体类型如下:
enum InterpolationFlags
{
INTER_NEAREST = 0,
INTER_LINEAR = 1,
INTER_CUBIC = 2,
INTER_AREA = 3,
INTER_LANCZOS4 = 4,
INTER_MAX = 7,
WARP_FILL_OUTLIERS = 8,
WARP_INVERSE_MAP = 16,
};
典型的几个插值类型的时间损耗如下:
插值的详细讲解后续准备利用专门的主题进行阐述。
参考文章:
http://www.1zlab.com/wiki/python-opencv-tutorial/opencv-interpolation-algrithm/