對(duì)于圖片或者視頻最常見(jiàn)的操作莫過(guò)于縮放了吧,本篇文章主要介紹一下使用 OpenCV-Python 對(duì)Image波势,Video 布讹、Live Video 進(jìn)行縮放尺寸者填。
當(dāng)我們使用分辨率超高的相機(jī)或者WebCam進(jìn)行拍攝例如720P的視頻時(shí)清寇,當(dāng)視頻上傳到電腦上喘漏,我們可能會(huì)放大或者縮小視頻源以適配播放器或者電腦顯示器尺寸的需求,這是我們會(huì)對(duì)視頻進(jìn)行 Rescale华烟,也許是縮小為原來(lái)的 0.75倍翩迈,也許是放大為原來(lái)的 1.25 倍,這些操作我們用 OpenCV-Python 都可以輕松的實(shí)現(xiàn)盔夜。
由于原先的視頻像素總數(shù)是固定不變的帽馋,放大和縮小都會(huì)導(dǎo)致部分的像素被忽略或者新增新的像素,這里涉及到矩陣插值的算法比吭。
Resize Image
視頻的每一幀可以當(dāng)做是圖片,我們這里用視頻來(lái)演示縮放圖片:
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
是自定義函數(shù)姨涡,用以傳入視頻的一幀數(shù)據(jù)盐股,按照縮放系數(shù) scale
進(jìn)行寬高的縮放制轰。
cv. resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)
:
調(diào)整一張圖片的大小,src
即為輸入的圖片數(shù)據(jù),dsize
(dst size) 是一個(gè) tuple,以代表返回圖片的大小糯累,fx
, fy
為縮放倍數(shù)。dsize
和 fx, fy
是兩種縮放的方式,一種指定生成圖片的大小逢慌,一種通過(guò)約定縮放系數(shù),可根據(jù)實(shí)際場(chǎng)景靈活選擇使用间狂。
interpolation
為插值類型攻泼,一個(gè)圖片從 4×4 放大到 8*8 的時(shí)候, 就會(huì)產(chǎn)生一些新的像素點(diǎn)鉴象,如何給這些值賦值忙菠, 就是 interpolation
插值所要解決的問(wèn)題:
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,
};
典型的幾個(gè)插值類型的時(shí)間損耗如下:
插值的詳細(xì)講解后續(xù)準(zhǔn)備利用專門的主題進(jìn)行闡述。
參考文章:
http://www.1zlab.com/wiki/python-opencv-tutorial/opencv-interpolation-algrithm/