目录

一、了解OpenCV

1、简介

2、导包

3、了解图片构成

二、函数运用

1、展示图片

2、展示图片属性

1)img.shape  形状

2)img.dtype  类型

像素值类型: 

3)img.size   尺寸

4)演示,img为上图

3、展示灰度图

1)使用cv2.cvtColor()

2)直接使用参数

3)运行结果

4)对比

4、保存图片

5、了解视频构成

6、展示视频

1)videoCapture()

2)isopend()

3)read()

        • 返回值ret

        • 返回值frame

4)实例展示

7、图片的切片

8、切分图片通道

1)直接切分

2)split切分

9、图片部分打码

10、图片缩放

参数解释:


一、了解OpenCV

1、简介

        OpenCV(Open Source Computer Vision)是一个开放源代码的计算机视觉库,提供了一系列用于处理图像和视频的函数和算法。

        它可以用于开发各种计算机视觉应用程序,包括人脸检测、目标跟踪、图像分类、图像分割等。

        OpenCV支持多种编程语言,包括C++、Python和Java,并且可以在多个操作系统上运行,包括Windows、Linux和Mac OS X。OpenCV是一个广泛使用的计算机视觉库,被用于许多领域,如工业自动化、医学影像分析、机器人视觉等。

2、导包

pip install opencv-python==3.4.2
pip install opencv-contrib-python==3.4.2  # opencv扩展库,包含其他一些图像处理算法函数的扩展库

注意:此处两个版本必须相同,防止不兼容问题

3、了解图片构成

        一张图片由图像数据组成,图像数据是由像素(pixel)组成的。每个像素代表着图像中的一个点,每个像素包含了图像在该点处的颜色信息。图像的分辨率决定了图像中的像素数量,分辨率越高,图像越清晰。

        图像可以以不同的色彩模型来表示颜色,最常用的是RGB色彩模型。RGB色彩模型是一种加法色彩模型,其中的三个通道分别表示了红色R绿色G蓝色B亮度。通过调整这三个分量的数值,可以得到不同的颜色。

        此外,还有其他一些重要的图像属性,如亮度、对比度、饱和度等。亮度表示图像的明暗程度,对比度表示图像中不同颜色之间的差异程度,饱和度表示图像的颜色鲜艳程度

二、函数运用

1、展示图片

import cv2  # 导入OpenCV 包

img = cv2.imread('girl.jpg') # 读取图片
cv2.imshow("aa",img)  # 展示图片,展示图片的标签名字为aa
cv2.waitKey(10000)  # 图片展示时间,其内参数为毫秒,如果参数设置为0,可以点击键盘任意键关闭图片
cv2.destroyAllWindows() # 用于关闭所有已经创建的窗口。

运行结果如下所示:(图像来源网络,如有侵权敬请告知删除)

2、展示图片属性

1)img.shape  形状

        用于获取图像的形状信息。它返回一个包含图像行数、列数和通道数的元组。

2)img.dtype  类型

        用于获取图像的数据类型。它返回一个描述图像像素值类型的字符串。

像素值类型: 
  • uint8:无符号8位整型,表示像素值范围为 0-255。
  • int8:有符号8位整型,表示像素值范围为 -128-127。
  • uint16:无符号16位整型,表示像素值范围为 0-65535。
  • int16:有符号16位整型,表示像素值范围为 -32768-32767。
  • float32:32位浮点型,表示像素值范围为 -∞-∞。
  • float64:64位浮点型,表示像素值范围为 -∞-∞。

3)img.size   尺寸

        用于获取图像的尺寸信息。它返回一个包含两个元素的元组,表示图像的高度和宽度。

4)演示,img为上图
print("图片形状:",img.shape)
print("图片数据类型:",img.dtype)
print("图形大小:",img.size)

运行结果如下图,

图像形状所示内容表示,宽度为940个像素,高度为627个像素,通道数为3,即RGB三通道

这里的图像尺寸为图像形状的三个值相乘

3、展示灰度图

1)使用cv2.cvtColor()
img = cv2.imread('girl.jpg')  # 导入彩色图片
img1 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  # 转变为灰度图
2)直接使用参数
img = cv2.imread('girl.jpg',cv2.IMREAD_GRAYSCALE)
3)运行结果

4)对比

        调试模式下可以看到彩色图片的格式为:

        灰度图下的格式为:

        此时少了一个rgb三通道数

4、保存图片

cv2.imwrite(r'./girl_gray.jpg',img)  # 这里的./表示当前目录下,命名为girl_gray.jpg

5、了解视频构成

        一个视频由一系列连续的图像帧组成。每一帧都是一个静止的图像,当这些图像以一定的速率连续播放时,就会形成动态的视频。视频的每一帧都包含了图像的像素信息,包括颜色、亮度等。通过在一定的时间间隔内连续播放这些帧,就能够产生流畅的视频效果。

        除了图像帧之外,视频还可以包含音频轨道、元数据以及其他附加信息。在视频文件中,这些信息以特定的文件格式(如AVI、MP4等)进行封装,以便能够方便地进行存储和传输。

6、展示视频

1)videoCapture()

        创建一个视频捕捉对象,括号内写入参数为视频地址,也可以设置参数为0,则表示捕获当前电脑默认摄像头,如果有多个摄像头可用,可以传入不同的数字来选择相应的摄像头。

2)isopend()

        用于判断视频捕获对象是否捕获成功,返回布尔值true、false

3)read()

        读取捕获的视频的下一帧图像,一帧表示一个图像,这里可以使用死循环来不断读取所有的帧,

        • 返回值ret

                用于判断是否读取成功,返回布尔值true和false

        • 返回值frame

                用于表示读取到的帧,类型为numpy数组,可以对其进行处理,如显示、保存、分析

4)实例展示
import cv2
video_capture = cv2.VideoCapture("tiger9.mp4")  # 创建一个视频捕捉对象

if not video_capture.isOpened():   # 判断是否捕获成功
    print("错误")
    exit()

while True:
    # ret返回bool值,读取成功为ret,每帧图片表示frame
    ret,frame = video_capture.read()
    if not ret:
        break
# 灰度图
    frame = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    cv2.imshow('video',frame)
# 每帧图片停留时间,如果键入esc则停止
    if cv2.waitKey(30) == 27:
        break
# 释放资源
video_capture.release()
cv2.destroyAllWindows()

此处的cv2.waitkey(30) == 27 用于判断键盘点击位置是否是esc键,其值对应为ascll码

运行结果为:

7、图片的切片

import cv2
a = cv2.imread('girl.jpg')  # 导入图片
a_new = a.copy()  # 复制图片
# 切片
b = a_new[100:300,100:500]  # 高宽,高度为像素值范围为100~300,宽度范围为100~500
cv2.imshow('bb',b)  # 展示图片
cv2.waitKey(10000)
cv2.destroyAllWindows()

其运行结果为:

8、切分图片通道

1)直接切分
import cv2
a = cv2.imread('girl.jpg')

a1 = a[:,:,0]  # 0表示切分的通道为B
a2 = a[:,:,1]  # 1表示切分的通道为G
a3 = a[:,:,2]  # 2表示切分的通道为R

cv2.imshow('B',a1) 
cv2.waitKey(0)

此时展示的图片为灰色的,如果想展示带切分通道颜色的,可以增加以下内容:

a[:,:,0] = 0  # 将B通道值改变为0
a[:,:,1] = 0  # 将G通道值改变为0
cv2.imshow('R',a) # 展示a图

此时展示画面为:

2)split切分
b,g,r = cv2.split(img) 

此时返回三个参数,分别表示bgr三通道的图片

9、图片部分打码

import cv2
import numpy as np
a = cv2.imread('girl.jpg')
a[100:200,200:300] = np.random.randint(0,256,(100,100,3))  
cv2.imshow('a',a)
cv2.waitKey(1000)
cv2.destroyAllWindows()

a[100:200,200:300] 表示图片的切片,即将高100~200,宽200~300的位置取出

np.random.randint(0,256,(100,100,3)) 使用numpy函数里的random.randint随机生成整数,括号内参数表示0~256之间的随机整数,(100,100,3)表示生成的形状为一个100x100大小的二维数组,每个元素是一个包含3个随机整数的一维数组。

运行结果为:

10、图片缩放
import cv2
a = cv2.imread('girl.jpg')
a_new = cv2.resize(a,dsize=None,fx=1.3,fy=1.3) # 将图片高宽都更改为1.3倍
cv2.imshow("aa",a_new)
cv2.waitKey(10000)
cv2.destroyAllWindows()
参数解释:

        a_new = cv2.resize(a,dsize=None,fx=1.3,fy=1.3)

  • a 是要调整大小的输入图像。
  • dsize 是目标图像的大小,可以通过设置dsize参数来指定目标图像的大小,或者通过设置fxfy参数来按比例调整图像大小。例如cv2.resize(a,(400,500))
    • 如果dsize参数不为None,则将图像调整为dsize指定的大小。
    • 如果fxfy参数都为None,则图像大小不会改变,返回与输入图像一样大小的图像。
    • 如果只设置了fx参数,那么图像的宽度会按照fx的比例进行调整,高度会根据宽度的比例自动调整。
    • 如果只设置了fy参数,那么图像的高度会按照fy的比例进行调整,宽度会根据高度的比例自动调整。
    • 如果同时设置了fxfy参数,那么图像的宽度和高度都会按照对应的比例进行调整。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐