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

作者: 砥砺前行的人 | 来源:发表于2021-09-22 12:36 被阅读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()
    视频处理对象构造方法,可以传入的包括:

    • 视频文件
    • 图像设备(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。

    相关文章

      网友评论

        本文标题:[计算机视觉基础] OpenCV_2 Read Image an

        本文链接:https://www.haomeiwen.com/subject/dcmigltx.html