HSV也是用和RGB差不多的方式來表達像素,每個整形(integer) 向量分別表示一個B,G,R通道,其他的色彩空間,也用同樣的方式來表示像素,只是取值范圍和通道數目不同HSV的色彩空間的色度值范圍 0-180.
>>> img = np.zeros((3,3),dtype=np.uint8) >>> img.shape (3, 3)
如果將圖像的格式轉化為BGR格式的話,shape則會返回(3,3,3),這就表名每個像素存在三個通道。
>>> img = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR) >>> img.shape (3, 3, 3)
我們可以讀取一種格式的圖像文件,然后將其轉化為另一種格式。例如下面的代碼將會從PNG轉化為JPEG
import cv2 image = cv2.imread("MyPic.png") cv2.imwrite("MyPic.jpeg","image")
下面列出的選項可以作為imread()函數的參數:
- IMREAD_ANYCOLOR = 4
- IMREAD_ANYDEPTH = 2
- IMREAD_COLOR = 1
- IMREAD_GRAYSCALE = 0
- IMREAD_LOAD_GDAL = 8
- IMREAD_UNCHANGED = -1
OpenCv提供了VideoCapture類和VideoWrite類來支持各種格式的視頻文件支持的格式類型會因系統的不同而不同,在達到視頻末尾之前VideoCapture 通過read()函數來獲取新的幀,每幀是一副給予BGR格式的圖像。可以將一副圖像傳遞給VideoWrite類的write()函數,該函數會將這副圖像寫入指定文件中,下面是一個示例,該示例讀取AVI文件的幀,並采用YUV顏色編碼將其寫入另一個幀中。
# -*- coding: utf-8 -*- """ Created on Wed Apr 12 16:47:18 2017 @author: x-power """ import cv2 videoCapture = cv2.VideoCapture("MyInput.avi") fps = videoCapture.get(cv2.CAP_PROP_FPS) size = (int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT))) videoWrite = cv2.VideoWrite("MyOutputVid.avi",cv2.VideoWriter_fourcc('I','4','2','0'),fps,size) success,frame = videoCapture.read() while success: videoWrite.write(frame) success,frame = videoCapture.read()
要為VideoWrite類的構造函數指定視頻文件名,這個文件名對應的文件若是存在,則會被覆蓋,也需要指定視頻的編解碼器,編解碼器的可用性根據系統的不同而不同,下面是一些常用的選項。
cv2.VideoWrite_fourcc('I','4','2','0'):該選項是一個為壓縮的YUV顏色編碼是4:2:0色度子采樣。這種編碼有很好的兼容性,但會產生較大文件,文件擴展名為 .avi。
cv2.VideoWrite_fourcc('P','T','M','1'):該選項時MPEG-1編碼類型,文件擴展名為.avi
cv2.VideoWrite_fourcc('X','V','T','D'):該選項時MPEG-4編碼類型,如果希望得到視頻大小為平均值,推薦使用此選項,文件擴展名為.avi
cv2.VideoWrite_fourcc('T','H','E','O'):該選項時Ogg Vorbis文件擴展名為,ogv
cv2.VideoWrite_fourcc('F','L','V','1'):該選項時一個flash視頻,文件擴展名為.flv
幀速率和幀大小必須要指定,因為時從另一個視頻復制視頻,這些屬性可以通過VideoCapture類的get函數得到。
如何捕獲攝像頭的幀
VideoCapture類可以獲得攝像頭的幀流,但對攝像頭而言,通常不是用視頻的文件名來構造VideoCapture類,而是需要傳遞攝像頭的設備索引(device index),下面的例子捕獲攝像頭10秒的視頻信息 並將其寫入avi文件當中。