OpenCV---001(简介和基本操作)

OpenCv简介及基本操作

OpenCv是当前最流行的计算机视觉处理库之一,本博客将介绍基于OpenCv4的基本操作

OpenCv简介

提起计算机视觉就不得不说图像处理。但通常将 图像处理理解为计算机视觉的预处理过程
图像处理一般指数字图像处理,即通过数学函数和图像变换等手段对二维图像进行分析,获得图像内的信息
而不对图像本身进行任何推理。通常包括了图像的压缩,增强和复原,匹配,描述和识别。涵盖了图像的去除噪声,
分割,特征提取等处理方法

而OpenCv是英特尔提出的开源计算机视觉库,提供了各类语言的接口

基本操作

载入,显示,保存数据

图像的表示:
    和我们平时看到的图像不同,数字图像在计算机内是以矩阵的形式存储,矩阵中的每个元素都描述了一定的信息,如
    颜色,亮度等之类的信息。在python中,图像被OpenCv读取后会被存储在一个N维的ndarray中。

数字图像:
    日常生活中所见到的事物一般为连续形式的模拟图像,而处理数字图像的先决条件是将连续图像进行离散化转换为数字图像,
    而转化过程包括了采样,量化,数字表示3个过程

    采样:
        用空间上部分点的灰度值代表图像,这些点被称为采样点,采样一般分为两部
        1.将二维信号变为一维信号,即沿垂直方向按行间隔由上到下顺序扫描得到一维信号
        2.对一维信号按一定间隔进行采样得到离散信号

        这时,若一副图像被分为N行,每行M份,即M份像素,则图像大小为 M*N像素,在采样时,间隔决定了图片质量,
        间隔越大,像素越小,质量越差。

    量化:
        模拟图像采样后,在时间和空间上离散化为像素,但是像素值仍然为离散量
        所以我们把像素的灰度值转为离散量的过程被称为图像灰度的量化
        一般的像素量化后用1字节表示,即(0-255)级灰度值,表示亮度由深到浅,对应由黑到白

    数字表示:
        模拟图像现在变为了一个数字矩阵,而这个数字矩阵就是我们要的图像的数字表示,即数字图像矩阵


在使用中,对于图像矩阵的切片和索引,尽量使用Numpy方法完成


图像读取函数:
    img = cv.imread(filename,[,flags])  
    默认安装彩色图像读取
    若要转换为灰度图读取则 加入 cv.IMREAD_GRAYSCALE

    imread函数可以读取各种格式图像文件,但是可能因为操作系统的编解码器不同,导致无法读取
    如在Linux中,就需要自己安装这些解码器

图像窗口函数:
    当我们不主动定义一个窗口时,会自动生成一个窗口
    None = cv.nameWindow(winname,[,flags])
    winname: 窗口名
    cv.WINDOW_NORMAL 显示图像后可以任意调整窗口大小
    cv.WINDOW_AUTOSIZE 根据图像显示窗口,不允许调整窗口大小
    cv.WINDOW_KEEPRATIO 保持图像比例
    cv.WINDOW_FREERATIO 调整图像尺寸来充满窗口
    cv.WINDOW_GUI_EXPANDED 允许窗口添加工具栏和状态栏


    在不需要窗口时,需要对窗口进行释放
    
图像显示函数:
    None = cv.imshow(winname,img)
    会在指定的窗口内显示图像

    注 意:此函数运行后,若程序结束会直接退出,所以需要cv.waitKey(ms) 来暂停程序一段时间,单位毫秒
        或者为0 表示等待用户按键结束暂停该函数


窗口销毁:
    None = cv.destroyWindow(winname)  # 关闭指定窗口
    None = cv.destroyAllWindow()  # 关闭所有的窗口



视频读取:
    视频是由多帧图片组成的,所以,将视频分为图片来读取
    
    构建一个能对视频文件进行处理的对象:
    <VideoCapture object> = cv.VideoCapture()
    <VideoCapture object> = cv.VideoCapture(filename,[,apiPreference])
    filename 读取视频文件名称

    为对象赋予具体的参数(若使用第一种对象产生方法)
    video_object.open('.mp4')  # 读取.mp4视频

    (True,False) = video_object.isOpened()  # 判断是否读取成功
        
    在对象中读取图片
    ret,img = video_object.read()  # 读取一张图片并且存在img中,ret表示是否成功读取

    video_object.get()  # 获得视频对象的各个参数 如帧数 像素 帧率
    cv.CAP_PROP_FPS  # 视频每秒多少张

import cv2 as cv

video_object = cv.VideoCapture('video/test.mp4')
while video_object.isOpened():
    ret, frame = video_object.read()
    if ret is True:
        cv.imshow('VIdeo', frame)

        cv.waitKey(int(1000 / video_object.get(cv.CAP_PROP_FPS)))

        if cv.waitKey(1) & 0xff == ord('q'):
            break

    else:
        break


video_object.release()
cv.destroyAllWindows()

摄像头调取:
    cv.VideoCapture() 函数还可以调用摄像头的方式获得视频
    <VideoCapture object> = cv.VideoCapture(index,[,apiPreference])
    index: 摄像头序号,0为默认摄像头
    
    frame = cv.flip(frame,1) 对摄像头进行水平翻转



图像保存:
    保存图片:
        retval = cv.imwrite(filename,img,[,params])
        filename: 图像的类型 路径 文件名
        img: 要保持的ndarray对象
        params: 保存图片格式时的属性设置

        成功则返回True 否则返还False 
        该函数通常只能保存8位的单通道图像和BGR图像


    保存视频:
        <VideoWriter object> = cv.VideoWriter()
        <VideoWriter object> = cv.VideoWriter(filename,fourcc,fps,framesize,[,isColor])
        filename 保存视频的路径和文件名
        fourcc 压缩帧的4字符编解码器选项
        fps 保存视频的帧率
        framesize 视频每帧大小
        isColor 是否以彩色形式

        <VideoWriter object>.write(frame) 写入 
    
    
    读取保存XML和YMAL文件:
        除了图像数据 还有一些较小的ndarray对象和字符串数组等数据用来保存,这些数据通常保存为
        XML或者YAML文件 

        XML: 一种元标记语言,<age>24</age> 以这种格式来表示age的数值为24 
        同时XML可以得知数据的隶属关系 如: <color><red>100</red><blue>150</blue></color>
        来表示color数据中有两个名为red和blue的数据,通过标记的方式,无论以任何形式保存数据,只要文件满足XML格式,
        读取数据都不会出现歧义  扩展名为 .xml

        YMAL: 一种以数据为中心的语言,通过 变量:数值 的形式表示各个数据的值,通过缩进关系表示不同数据间的关系
        YMAL可读性高,一般用来表达资料序列的格式 扩展名为.ymal 或者 .yml

        <FileStorage object> = cv.FileStorage(filename,flags,[,encoding])
        filename 打开的文件名称
        flag 对文件执行的操作类型标志
        cv.FileStorage_READ   0 读取数据
        cv.FileStorage_WRITE  1 重新写入数据
        cv.FileStorage_APPEND 2 继续写入
        encoding 编码格式

        打开后可以使用 isOpened()函数来进行判断是否成功打开文件
        打开文件后 可以使用 cv.FileStorage.write(name,val)
        name 写入文件中的变量名称
        val 变量值

        读取;
        data = <FileStorage object>.getNode(key).string()
        data = <FileStorage object>.getNode(key).real()
        data = <FileStorage object>.getNode(key).mat()
posted @ 2022-01-31 17:04  cc学习之路  阅读(102)  评论(0)    收藏  举报