> 技术文档 > OpenCV!启动!(Python)(1)

OpenCV!启动!(Python)(1)

目录

1 OpenCV介绍

        1.1 OpenCV-Python

2 图像表示

3 图像存储

        彩色图像

4 环境安装

5 基本图像操作

        5.1 读取图片并展示

        5.2 创建黑白图像

        5.3 图像切片(图片剪裁)

6 图像绘制

        6.1 绘制直线

        6.2 绘制圆形

        6.3 绘制矩形

        6.4 读取视频


1 OpenCV介绍

        OpenCV(开放源代码计算机视觉库)是一个开源的计算机视觉和机器学习软件库。由一系列 C++ 类和函数构成,用于图像处理、计算机视觉领域的算法实现。支持多种操作系统,Windows、Linux、ios、Android等,方便开发和部署。 完善的传统计算机视觉算法,涵盖主流的机器学习算法,同时添加了对深度学习的支持。

1.1 OpenCV-Python

        OpenCV-Python是原始OpenCV C++实现的Python包装器。它结合了 OpenCV C++ API 的高性能与 Python 语言的易用性和简洁性。通过 OpenCV-Python,开发者可以轻松地进行图像处理、计算机视觉任务以及机器学习应用。

        与C / C++等语言相比,Python速度较慢。Python可以使用C / C++扩展,这使我们可以在C / C++中编写计算密集型代码,并创建可用作Python模块的Python包装器。两个好处:首先,代码与原始C / C++代码一样快(因为它是在后台工作的实际C++代码),其次,在Python中编写代码比使用C / C++更容易。

        OpenCV-Python使用Numpy,这是一个高度优化的数据库操作库。所有OpenCV数组结构都转换为Numpy数组。这也使得与使用Numpy的其他库(如SciPy和Matplotlib)集成更容易。

2 图像表示

        像素是图像的基本单元,每个像素存储着图像的颜色、亮度和其他特征。一系列像素组合到一起就形成了完整的图像,在计算机中,图像以像素的形式存在并采用二进制格式进行存储。根据图像的颜色不同,每个像素可以用不同的二进制数表示。

        计算机采用0/1编码的系统,数字图像也是利用0/1来记录信息,我们平常接触的图像都是8位数图像。opencv中常用的是8位图像,大多数彩色和灰度图像使用8位表示每个通道的像素值,范围从0到255,其中0,代表最黑,1,表示最白。

        日常生活中常见的图像是RGB三原色图。RGB图上的每个点都是由红(R)、绿(G)、蓝(B)三个颜色按照一定比例混合而成的,几乎所有颜色都可以通过这三种颜色按照不同比例调配而成。在计算机中,RGB三种颜色被称为RGB三通道,每个通道的取值都是0-255,根据这三个通道存储的像素值,来对应不同的颜色。

        例如,在使用“画图”软件进行自定义调色时,其数值单位就是像素。如下图所示:

3 图像存储

在OpenCV中,无论是读取还是创建图像,结果都是一个NumPy数组

  • 彩色图像:三维数组

  • 灰度图像:二维

图像本质上是像素值的二维或三维矩阵(对于彩色图像)。

  • 形状(Shape):图像的尺寸由其高(height)、宽(width)和通道数(channels)决定。可以通过img.shape属性获取这些信息。

    • 对于彩色图像(如RGB),返回的是一个包含三个值的元组 (height, width, channels)。

    • 对于灰度图像,返回的是一个包含两个值的元组 (height, width),因为灰度图像只有一个通道。

  • 数据类型(dtype):图像中的每个像素值的数据类型决定了可以存储的最大值。例如,8位无符号整数(uint8)允许的范围是从0到255。

  • 像素表示

    • 单通道图像(灰度图像):每个像素由一个数值表示,代表该点的亮度。值越低(接近0),颜色越暗;值越高(接近255),颜色越亮。

    • 多通道图像(彩色图像): 在OpenCV中,默认情况下,彩色图像是以BGR(蓝-绿-红)顺序存储

彩色图像

每个像素通常是由红(R)、绿(G)、蓝(B)三个分量来表示的,分量介于(0,255)。RGB图像每一个像素的颜色值(由RGB三原色表示)直接存放在图像矩阵中,由于每一像素的颜色需由R、G、B三个分量来表示,M、N分别表示图像的行列数,三个M x N的二维矩阵分别表示各个像素的R、G、B三个颜色分量。RGB图像的数据类型一般为8位无符号整形,通常用于表示和存放彩色图像。

ok了,直接进入正片,说白了,上面那么多字只用看加粗部分,其他部分带一眼就差不多了。

4 环境安装

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python

python这一块,舒服。

5 基本图像操作

5.1 读取图片并展示

import cv2 as cv # 导入cv2并将其改别名为cv便于使用cat = cv.imread(\'../images/1.jpg\') # 将图片转换为三维numpy数组并存放在cat中cat1 = cv.imread(\'../images/1.jpg\',cv.IMREAD_GRAYSCALE)# 同理,但是多一段参数,cv.IMREAD_GRAYSCALE:读取灰度图像,默认为彩色cv.imshow(\'cat\', cat)# 将cat图片展示出来,窗口名称\'cat\'cv.imshow(\'cat1\', cat1)# 将cat图片展示出来,窗口名称\'cat1\'cv.waitKey(0)# 窗口持续时间,其中参数为ms,0表示手动关闭cv.destroyAllWindows()# 销毁窗口

cv2.imread(path [,读取方式]),读取方式:彩色·默认、灰色等。

cv2.imshow(winname,img) ,参数:winname:显示图像的窗口名,以字符串类型表示

img:要显示的图像

cv2.waitKey(0):表示无限期地等待任何键盘按键。这种用法常见于图像显示窗口中,确保图像在窗口中显示直到用户决定关闭它。

cv2.waitKey(n):n>0,意味着程序将等待n毫秒。这种方式常用于视频播放或实时摄像头捕获场景,以便控制每一帧停留的时间,同时允许用户通过按键来中断循环或发出命令。

cv2.destroyAllWindows():会在当前程序执行到该语句时立即销毁打开的窗口,并释放与这些窗口相关的资源。

cat:        cat1:    

5.2 创建黑白图像

import cv2 as cv #同上面的一样import numpy as np #导入numpy用来处理数组,并改名为np便于使用height = 360 #定义高width = 480 #定义宽c = 3 # 定义通道数量#全黑图像black = np.zeros((height, width, c), \'uint8\')cv.imshow(\'black\', black)#全白图像white = np.full((height, width, c), 255, \'uint8\')cv.imshow(\'white\', white)# 将上面的black全黑图像修改为全白图像。black[:, :, :] = 255cv.imshow(\'black1\', black)# 生成一个320*320大小的彩色图片,每一个像素点随机颜色snow = np.random.randint(0, 256, (320, 320, c), \'uint8\')cv.imshow(\'snow\', snow)cv.waitKey(0)# 同上cv.destroyAllWindows()

black:        white:     black1:    snow:   

有点像老电视的花屏。

black[:]表示一维中的所有元素,black[:,:]表示二维中的所有元素,同理black[:,:,:]表示三维中的所有元素,全部赋值为255即为全白。

5.3 图像切片(图片剪裁)

import cv2 as cv# 依旧cat = cv.imread(\'../images/1.jpg\')cv.imshow(\'cat\', cat)eye = cat[231:297, 289:368]# 进行切片,类似python的列表cv.imshow(\'eye\', eye)# w h 左下(408 372) 右下(484 368) 右上(484,304) 左上(408,304)# eye1 = cat[304:372, 408:484]# cv.imshow(\'eye1\', eye1)# 这里是另一只眼睛就不展示了cv.waitKey(0)cv.destroyAllWindows()

眼睛好看捏。

6 图像绘制

6.1 绘制直线

  • cv2.line(img,sart,end,color,thickness)

  • 参数

    • img:要绘制直线的图像

    • start、end:直线的起点和终点

    • color:直线的颜色(对于彩色图像,使用 BGR 格式指定颜色)

    • thickness:线条宽度

6.2 绘制圆形

  • cv2.circle(img,centerpoint,r,color,thickness)

  • 参数:

    • img:要绘制圆形的图片

    • centerpoint、r:圆心和半径

    • color:线条颜色

    • tnickness:线条宽度,为-1时生成闭合图案并填充颜色

6.3 绘制矩形

  • cv2.rectangle(img,leftupper,rightdown,color,thickness)

  • 参数:

    • img:要绘制矩形的图像

    • leftupper、rightdown:矩形的左上角和右下角坐标

    • color:线条的颜色

    • thickness:线条的宽度

直接三个愿望一次满足,绘制的图形会修改cat

import cv2 as cvcat = cv.imread(\'../images/1.jpg\')cv.line(cat,(50,40),(80,40),(100,100,255),2)# cat:需要画线的图片。(50,40),(80,40):线的起始位置和终点位置。(100,100,255):线颜色。2:线厚度# 最后一位-1表示填充cv.rectangle(cat,(78,106),(260,306),(189,138,239),-1)# (78,106),(260,306):矩形左上,右下坐标。-1:填充,# line_AA 反走样技术 抗锯齿 平滑 默认使用LINE_8cv.circle(cat,(329,269),30,(255,255,255),2,cv.LINE_AA)# (329,269):圆心。30:半径。cv.imshow(\'cat\', cat)cv.waitKey(0)cv.destroyAllWindows()

三位一体。

6.4 读取视频

  • cap = cv2.VideoCapture(path)

    • path:视频流资源路径设置为,0代表从默认摄像头捕获视频流,其他数字是你电脑上的其他摄像头,想尝试obs虚拟摄像头的可以一个一个试。

  • ret,frame = cap.read()

  • 返回值cap调用read()方法得到一个布尔值和一帧图像,布尔值表示是否成功读取到帧,如果为False,可能是因为视频结束或读取失败,如果为True,frame则是当前帧的图像数据。

    import cv2 as cv# cap = cv.VideoCapture(\'../images/videocap.mp4\')cap = cv.VideoCapture(2)# 可以放视频地址。0:是电脑摄像头,其他数字是其他摄像头# 循环读取视频每一帧while True: ret, frame = cap.read() if not ret: # 视频结束则跳出循环 break cv.imshow(\'frame\', frame) if cv.waitKey(16) & 0xFF == ord(\'q\'): # cv.waitKey(40):等待 40 毫秒的键盘输入,用于控制视频帧之间的显示间隔。 # & 0xFF:取按键的 ASCII 值的低 8 位,确保在不同系统上兼容 # 整体效果则是在视频没播放完前,可以按下\'q\'键结束循环,即关闭视频 breakcap.release()# 释放资源cv.destroyAllWindows()