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文件当中。