無論是對圖像或者是對視頻的簡單亦或是復雜的處理帘睦,我們都需要將圖片和視頻轉(zhuǎn)化為代碼能夠“明白”的格式骑篙,而在 OpenCV-Python 中碰酝,這就是 Numpy 的 Matrix巍佑。本篇文章主要介紹如何通過 OpenCV-Python 加載并顯示圖片以及視頻纷宇,這是日后處理圖片以及視頻的基礎硕舆。
視頻和圖片的關(guān)系
介紹視頻離不開圖片秽荞。不知小時候你是否在書本的空白處畫一些圖案,如果你以某一速率以上翻動書本抚官,圖案仿佛變成了一段“動畫”扬跋。由于人眼識別的頻率有限,故而當在單位時間內(nèi)看到的圖像數(shù)目超過一定的數(shù)目凌节,給人眼造成的感覺就是畫面是運動的钦听,這時圖片的連續(xù)播放便形成了視頻洒试。這個頻率一般為25張圖片/秒以上,我們經(jīng)常聽到的幀率即為每秒播放的圖片的個數(shù)朴上±萜澹可以這么說:視頻是由圖片組成,是以一定速率進行連續(xù)播放的行為在肉眼下形成的視覺效果
痪宰。當然叼架,提供一個視頻,也可以通過一定的方法獲得其組織而成的圖片衣撬,進而對其進行處理碉碉。
Read Image
Show you the code firstly:
import cv2 as cv
img = cv.imread("./flower.jpeg")
print(img.shape) # (366, 650, 3)
cv.imshow("img", img)
cv.waitKey(0)
cv.imread(filename, flags=None)
讀取指定支持類型的本地圖片類型的文件,返回 Numpy.ndarray 類型的數(shù)組淮韭,這里因為有BGR三個通道垢粮,所以 shape
為 (366, 650, 3)。
filename:支持 absolutle or relative靠粪,4.5.3 支持的圖片類型如下:
. - Windows bitmaps - \*.bmp, \*.dib
. - JPEG files - \*.jpeg, \*.jpg, \*.jpe
. - JPEG 2000 files - \*.jp2
. - Portable Network Graphics - \*.png
. - WebP - \*.webp
. - Portable image format - \*.pbm, \*.pgm, \*.ppm \*.pxm, \*.pnm
. - PFM files - \*.pfm
. - Sun rasters - \*.sr, \*.ras
. - TIFF files - \*.tiff, \*.tif
. - OpenEXR Image files - \*.exr
. - Radiance HDR - \*.hdr, \*.pic
. - Raster and Vector geospatial data supported by GDAL
flags:讀取文件時可追加的操作:
enum ImreadModes
{
IMREAD_UNCHANGED = -1,
IMREAD_GRAYSCALE = 0,
IMREAD_COLOR = 1,
IMREAD_ANYDEPTH = 2,
IMREAD_ANYCOLOR = 4,
IMREAD_LOAD_GDAL = 8,
IMREAD_REDUCED_GRAYSCALE_2 = 16,
IMREAD_REDUCED_COLOR_2 = 17,
IMREAD_REDUCED_GRAYSCALE_4 = 32,
IMREAD_REDUCED_COLOR_4 = 33,
IMREAD_REDUCED_GRAYSCALE_8 = 64,
IMREAD_REDUCED_COLOR_8 = 65,
IMREAD_IGNORE_ORIENTATION = 128,
};
默認為 IMREAD_UNCHANGED
蜡吧,即不做改變,常用的例如 IMREAD_GRAYSCALE
是以灰度強度讀取圖片占键,這樣讀取出的圖片是只有灰度值昔善,即肉眼所見的黑白。例如:
import cv2 as cv
img = cv.imread("./flower.jpeg", cv.IMREAD_GRAYSCALE)
print(img.shape) # (366, 650)
cv.imshow("img", img)
cv.waitKey(0)
彩色圖片變?yōu)榱撕诎?/p>
這里可以簡單介紹下一張彩色的圖片是如何變?yōu)楹诎椎呐弦遥@里涉及到 Color Space 的相關(guān)概念君仆。灰度圖的優(yōu)點是數(shù)據(jù)量更小牲距,處理起來速度更快返咱。我們以RGB模式的圖片轉(zhuǎn)灰度圖片為例。由于RGB模式的圖片擁有三個通道牍鞠,而灰度只是從黑色到白色的一維數(shù)值咖摹,所以程序需要借助每個像素的 RGB 三個通道的強度值計算出一個灰度值,比較好的算法是通過給與 R难述、G萤晴、B 對應的權(quán)重,通過加權(quán)和計算出一個灰度值胁后。這里的權(quán)重主要是根據(jù)人肉眼對于 R店读、G、B三種顏色的敏感程度(G > R > B)攀芯,基本公式如下:
cv.imshow(winname, mat)
在一個特殊的窗口上顯示一張圖片
winname:窗口的標題名稱
mat:圖片的矩陣表達
cv.waitKey(delay=None)
等待系統(tǒng)按鍵事件屯断,如果 delay 為 0 則一直等待。返回值為按鍵的碼值。
Read Video
Show you the code firstly:
import cv2 as cv
capture = cv.VideoCapture("./Videos/dog.mp4")
while True:
isSuccess, frame = capture.read()
if not isSuccess:
break
cv.imshow("", frame)
if cv.waitKey(20) & 0xFF == ord('s'):
break
capture.release()
cv.destroyAllWindows()
cv.VideoCapture()
視頻處理對象構(gòu)造方法裹纳,可以傳入的包括:
- 視頻文件
- 圖像設備(0、1紧武、2等)
- 視頻流
對于圖像設備剃氧,主要取決于機器一共接入了多少個可以被識別為 Capture device 的設備(webcam,攝像頭等)阻星,0朋鞍、1、2代表系統(tǒng)為之設置的編號妥箕。
isSuccess, frame = capture.read()
抓取滥酥、解碼并返回下一幀的圖像數(shù)據(jù),返回值格式與 cv.imread
相同畦幢。這里的循環(huán)其實就是逐幀的處理每一張圖片(上面有說道視頻是由圖片以一定的幀率連續(xù)播放的效果)坎吻。如果抓取到最后一張圖片或者圖片格式錯誤,則 isSuccess
為 False宇葱,frame
為空瘦真。
capture.release()
關(guān)閉視頻文件或者圖像設備,底層也會釋放申請的內(nèi)存空間黍瞧。
cv.destroyAllWindows()
銷毀所有打開的頂層UI窗口
值得注意的是诸尽,cv.waitKey(20)
決定了視頻展示的幀率,即此時為 20ms的間隔展示圖片印颤,所以忽略中間的處理時延視頻幀率為 1 / 0.02 = 50
HZ您机。