OpenCV 基础入门数字图像处理入门Android音视频

[计算机视觉基础] OpenCV_2 Read Image an

2021-09-22  本文已影响0人  砥砺前行的人

无论是对图像或者是对视频的简单亦或是复杂的处理,我们都需要将图片和视频转化为代码能够“明白”的格式,而在 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()
视频处理对象构造方法,可以传入的包括:

isSuccess, frame = capture.read()
抓取、解码并返回下一帧的图像数据,返回值格式与 cv.imread 相同。这里的循环其实就是逐帧的处理每一张图片(上面有说道视频是由图片以一定的帧率连续播放的效果)。如果抓取到最后一张图片或者图片格式错误,则 isSuccess 为 False,frame 为空。

capture.release()
关闭视频文件或者图像设备,底层也会释放申请的内存空间。

cv.destroyAllWindows()
销毁所有打开的顶层UI窗口

值得注意的是,cv.waitKey(20) 决定了视频展示的帧率,即此时为 20ms的间隔展示图片,所以忽略中间的处理时延视频帧率为 1 / 0.02 = 50 HZ。

上一篇下一篇

猜你喜欢

热点阅读