[计算机视觉基础] OpenCV_2 Read Image an
无论是对图像或者是对视频的简单亦或是复杂的处理,我们都需要将图片和视频转化为代码能够“明白”的格式,而在 OpenCV-Python 中,这就是 Numpy 的 Matrix。本篇文章主要介绍如何通过 OpenCV-Python 加载并显示图片以及视频,这是日后处理图片以及视频的基础。
视频和图片的关系
介绍视频离不开图片。不知小时候你是否在书本的空白处画一些图案,如果你以某一速率以上翻动书本,图案仿佛变成了一段“动画”。由于人眼识别的频率有限,故而当在单位时间内看到的图像数目超过一定的数目,给人眼造成的感觉就是画面是运动的,这时图片的连续播放便形成了视频。这个频率一般为25张图片/秒以上,我们经常听到的帧率即为每秒播放的图片的个数。可以这么说:视频是由图片组成,是以一定速率进行连续播放的行为在肉眼下形成的视觉效果
。当然,提供一个视频,也可以通过一定的方法获得其组织而成的图片,进而对其进行处理。
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 类型的数组,这里因为有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)
彩色图片变为了黑白
image.png
这里可以简单介绍下一张彩色的图片是如何变为黑白的,这里涉及到 Color Space 的相关概念。灰度图的优点是数据量更小,处理起来速度更快。我们以RGB模式的图片转灰度图片为例。由于RGB模式的图片拥有三个通道,而灰度只是从黑色到白色的一维数值,所以程序需要借助每个像素的 RGB 三个通道的强度值计算出一个灰度值,比较好的算法是通过给与 R、G、B 对应的权重,通过加权和计算出一个灰度值。这里的权重主要是根据人肉眼对于 R、G、B三种颜色的敏感程度(G > R > B),基本公式如下:
image.png
cv.imshow(winname, mat)
在一个特殊的窗口上显示一张图片
winname:窗口的标题名称
mat:图片的矩阵表达
cv.waitKey(delay=None)
等待系统按键事件,如果 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()
视频处理对象构造方法,可以传入的包括:
- 视频文件
- 图像设备(0、1、2等)
- 视频流
对于图像设备,主要取决于机器一共接入了多少个可以被识别为 Capture device 的设备(webcam,摄像头等),0、1、2代表系统为之设置的编号。
isSuccess, frame = capture.read()
抓取、解码并返回下一帧的图像数据,返回值格式与 cv.imread
相同。这里的循环其实就是逐帧的处理每一张图片(上面有说道视频是由图片以一定的帧率连续播放的效果)。如果抓取到最后一张图片或者图片格式错误,则 isSuccess
为 False,frame
为空。
capture.release()
关闭视频文件或者图像设备,底层也会释放申请的内存空间。
cv.destroyAllWindows()
销毁所有打开的顶层UI窗口
值得注意的是,cv.waitKey(20)
决定了视频展示的帧率,即此时为 20ms的间隔展示图片,所以忽略中间的处理时延视频帧率为 1 / 0.02 = 50
HZ。