素材图
P1:die.jpg
P2:cool.jpg
V:rabbit.mp4
, 下载地址
import cv2
img_1 = cv2.imread('./die.jpg') # default cv2.IMREAD_COLOR
print("die.jpg shape(imread default) : ", img_1.shape) # 展示图像信息 (行,列,颜色通道数)(h,w,c)
cv2.imshow("die default", img_1)
img_2 = cv2.imread('./die.jpg', cv2.IMREAD_GRAYSCALE) # 指定为灰度图
print("die.jpg shape(imread gray) : ", img_2.shape) # 展示图像信息 (行,列,颜色通道数)(h,w,c)
cv2.imshow("die gray", img_2)
cv2.imwrite("./grayscale.jpg", img_2) # 保存图像信息
img_3 = cv2.imread('./cool.jpg') # default cv2.IMREAD_COLOR
print("cool.jpg shape(imread default) : ", img_3.shape) # 展示图像信息 (行,列,颜色通道数)(h,w,c)
cv2.imshow("cool default", img_3)
cv2.waitKey(0) # 单位是毫秒
cv2.destroyAllWindows() # 释放所有窗口
原型:cv2.imshow(winname, mat)
参数:
winname
(窗口名称): 字符串,表示显示窗口的名称。mat
(图像矩阵): 要显示的图像矩阵,通常是一个NumPy数组。返回值: 无
功能:
cv2.imshow
主要是用于显示图像,而不是播放视频。**当你使用 cv2.imshow
显示视频帧时,它只会显示当前帧,并不会按照视频的原速度播放。**你需要在代码中通过循环读取视频的帧,并将每一帧传递给 cv2.imshow
,以模拟视频的播放效果。
注意: 如果两次imshow的winname相同的话,那将自动关闭前一个窗口。
原型:cv2.waitKey([delay])
参数:
delay
(延迟时间): 表示等待时间的毫秒数,如果设置为0,表示无限等待用户输入。默认值是0。返回值:
功能:
原型:cv2.destroyAllWindows()
参数: 无
返回值: 无
功能:
cv2.namedWindow()
或 cv2.imshow()
创建的窗口。通常在程序执行的最后调用这个函数,以确保在程序结束时关闭所有图形界面窗口,防止它们在程序退出后仍然保留。
原型:cv2.imread(filename [,flags])
参数:
filename
(文件名): 要读取的图像文件的路径。flags
(标志): 可选参数,表示如何读取图像。默认值是 cv2.IMREAD_COLOR
,表示以彩色图像的形式读取。可以使用以下常量:
cv2.IMREAD_COLOR
: 以彩色图像形式读取(默认值),注:OpenCV读取的图像是BGR格式,而非RGB。cv2.IMREAD_GRAYSCALE
: 以灰度图像形式读取。cv2.IMREAD_UNCHANGED
: 读取包括 alpha 通道在内的所有图像信息。返回值:
NumPy
数组的形式表示。功能:
NumPy
数组中,以便在程序中进行处理和分析。
原型: cv2.imwrite(filename, img [,params])
参数:
filename
(文件名): 要写入的目标文件的路径。img
(图像数据): 要写入文件的图像数据,通常是一个 NumPy
数组。params
(可选参数): 写入文件时的附加参数。可以指定图像质量、压缩格式等。返回值:
True
;否则返回 False
。功能:
import cv2
# 打开视频文件
cap = cv2.VideoCapture('./rabbit.mp4')
# 检查视频是否成功打开
if not cap.isOpened():
print("Error: 无法打开视频文件.")
opn = 0
else:
opn = 1
while opn:
# 读取视频帧
ret, frame = cap.read()
# 检查是否成功读取帧(视频播放完成退出)
if not ret:
print("Error: 无法读取帧.")
break
# 转换为灰度帧
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 在窗口中显示帧
cv2.imshow('Video Player', gray)
# 检查用户是否按下了 'q' 键,如果是则退出循环
if cv2.waitKey(25) & 0xFF == 27:
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
原型:cv2.VideoCapture([filename or index, apiPreference])
参数:
filename
(可选): 视频文件的路径。index
(可选): 摄像头设备的索引号,用于选择要使用的摄像头。通常从0开始递增。apiPreference
(可选): 指定视频捕获 API 的首选项。可以是 cv2.CAP_ANY
、cv2.CAP_V4L2
、cv2.CAP_FFMPEG
等。功能:
返回值:
VideoCapture
对象:一个用于从视频源读取帧的对象。下面介绍该对象常用属性:
read()
:
ret
,表示帧是否成功读取,以及帧的图像数据frame
(视频帧的 NumPy
数组)。ret, frame = cap.read()
get(propId)
:
propId
是用于指定要获取的属性的标识符。width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
set(propId, value)
:
propId
是用于指定要设置的属性的标识符,value
是要设置的属性值。cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
release()
:
VideoCapture
对象占用的资源,关闭视频源。cap.release()
isOpened()
:
VideoCapture
对象是否成功打开了视频源。if not cap.isOpened():
print("Error: Could not open video source.")
原型:cv2.cvtColor(src, code)
参数:
src
(源图像): 要进行颜色空间转换的输入图像,通常是一个 NumPy
数组。code
(颜色空间转换代码): 指定颜色空间转换的方式,如 cv2.COLOR_BGR2GRAY
表示将 BGR
彩色图转换为灰度图。返回值:
NumPy
数组。功能:
其他:(关于code的其他可选项)
cv2.COLOR_BGR2GRAY
cv2.COLOR_BGR2HSV
cv2.COLOR_BGR2RGB
cv2.COLOR_GRAY2BGR
cv2.COLOR_RGB2BGR
图像数据的表示方式:
用 “:” 表示区间(左闭右开)
import cv2
img = cv2.imread('./die.jpg')
print(img.shape) #(40, 240, 3)
# 取三维矩阵的前一行、前两列、深度为all
print(img[0:1, 0:2], "\n")
# [[[40 39 83] [[[BGR][BGR] ] ]
# [39 38 82]]] 三维 —— 图像(r * w) * BGR(h = 3)
# 取三维矩阵的前一行、前两列、深度为0
print(img[0:1, 0:2, 0], "\n")
# [[40 39]] 二维 (r * w) 仅显示BGR其中之一(B)
print(img[0:1, 0:2, 1], "\n")
# [[39 38]] 仅显示(G)
print(img[0:1, 0:2, 2], "\n")
# [[83 82]] 仅显示(R)
查看图像指定区域(imshow时可实现裁剪效果):
import cv2
img = cv2.imread('./die.jpg')
print(img.shape)
cv2.imshow("image", img)
cv2.imshow("cut", img[50:150, 0:200])
cv2.waitKey(0)
cv2.destroyAllWindows()
提取/合并 图像的R、G、B
import cv2
img = cv2.imread('./die.jpg')
# 提取 如果直接show相当于灰度图像,把颜色值当作亮度
img_B = img[:, :, 0]
img_G = img[:, :, 1]
img_R = img[:, :, 2]
# 合并 合并时要注意维度保持一致
img_T = cv2.merge((img_B, img_G, img_R))
置空通道 (e.g只保留R通道)
import cv2
img = cv2.imread('./die.jpg')
img_T = img.copy()
img_T[:, :, 0] = 0 # 置空 B 通道
img_T[:, :, 1] = 1 # 置空 G 通道
cv2.imshow("img_T", img_T)
cv2.waitKey(0)
cv2.destroyAllWindows()
原型:cv2.merge(mv[, dst])
参数:
mv
:包含要合并的图像通道的序列(例如,一个包含三个通道的元组或列表)。dst
:输出图像,可选。返回值:
如果指定了 dst
参数,则返回输出图像 dst
;否则,返回合并后的图像。
功能:
cv2.merge
函数用于将多个单通道的图像合并成一个多通道的图像。通常,在图像处理中,图像被拆分为单个通道进行处理,然后再合并回来。mv
参数是一个包含要合并的图像通道的序列,通常是一个包含多个单通道图像的元组或列表。在合并时要注意每个通道的尺寸和数据类型保持一致,并注意通道的顺序。
手动指定 dst
和使用返回值接收的主要区别在于对输出图像的处理和内存管理
手动指定 dst
:
dst
,则你需要提前创建一个多通道的数组,用于存储合并后的结果。这样可以避免在函数内部创建新的数组,有助于更好地控制内存的分配和释放。dst
,你可以在函数调用之后继续使用这个数组,而不需要将它的内容复制到其他数组中。使用返回值接收:
在实际应用中,选择手动指定 dst
还是使用返回值接收通常取决于对内存和代码结构的特定需求。如果你有特定的内存管理需求或者想要更好地控制输出数组的生命周期,那么手动指定 dst
可能更为合适。否则,使用返回值接收通常更为简便。
import cv2
img1 = cv2.imread('./die.jpg')
img2 = cv2.imread('./cool.jpg')
# 两张图片尺寸不一致不能进行计算(融合)
print(img1.shape) # (240, 240, 3)
print(img2.shape) # (1000, 1000, 3)
img2_T = cv2.resize(img2, (240, 240))
res = cv2.addWeighted(img1, 0.4, img2_T, 0.6, 0)
cv2.imshow("blend", res)
cv2.waitKey(0)
cv2.destroyAllWindows()
按缩放因子进行scale
import cv2
img = cv2.imread('./die.jpg')
print(img.shape) # (240, 240, 3)
# 将y坐标拉伸2倍数,x不变
img_T = cv2.resize(img, (0, 0), fx=1, fy=2)
print(img.shape) # (240, 240, 3)
cv2.imshow("img", img)
cv2.imshow("scale", img_T)
cv2.waitKey(0)
cv2.destroyAllWindows()
原型:cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
参数:
src
: 输入图像。
dsize
: 输出图像的大小,可以是元组 (width, height)
或者 None
。
dst
: 输出图像,可选。
fx
: 沿水平轴的缩放因子,可选。
fy
: 沿垂直轴的缩放因子,可选。
interpolation
: 插值方法,用于图像的缩放。默认为 cv2.INTER_LINEAR
。
常见的插值方法包括:
cv2.INTER_NEAREST
: 最近邻插值cv2.INTER_LINEAR
: 线性插值(默认)cv2.INTER_CUBIC
: 三次样条插值cv2.INTER_AREA
: 区域插值返回值:
功能:
dsize
) 或者缩放因子 (fx
, fy
) 来控制缩放的程度。
函数原型:cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])
参数:
src1
:第一个输入图像。alpha
:src1
的权重。src2
:第二个输入图像。beta
:src2
的权重。gamma
:添加到每个和的标量值,用于调整输出图像的亮度。dst
:输出图像,可选。dtype
:输出图像的数据类型,可选。返回值:
dst
参数,则返回输出图像 dst
;否则,返回合并后的新图像。功能:
cv2.addWeighted
函数用于将两个图像线性组合,即按照一定的权重相加。具体而言,它的计算公式为:d s t = s r c 1 × a l p h a + s r c 2 × b e t a + g a m m a dst=src1×alpha+src2×beta+gamma dst=src1×alpha+src2×beta+gamma
cv2.addWeighted
将两个图像按照一定的比例融合,调整图像的对比度和亮度。
img1 = img1 + 5 # 每个像素值都增加了5
imgT = img2 + img1 # img1 的每个像素值都与相应位置上的 img2 的像素值相加
# 因为每个值都是uint8,所以可能会出现越界溢出的情况(%256)
# cv2.add() 可以实现饱和截断(溢出时会保持在255)
cv2.add(img1,img2)
import cv2
import matplotlib.pyplot as plt
import numpy as np # 暂时没用到
# 读取图像
img1 = cv2.imread('./die.jpg')
img2 = cv2.imread('./grayscale.jpg')
img3 = cv2.imread('./cool.jpg')
# 使用Matplotlib显示不同边界填充方式的图像(221: 2*2的网格的第1个位置)
plt.subplot(221), plt.imshow(img1), plt.title('die')
plt.subplot(222), plt.imshow(img2), plt.title('grayscale')
plt.subplot(223), plt.imshow(img3), plt.title('cool')
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import matplotlib.pyplot as plt
import numpy as np # 暂时没用到
# 读取图像
img = cv2.imread('./die.jpg')
# 定义上、下、左、右填充的大小
top_size, bottom_size, left_size, right_size = (70, 70, 70, 70)
# 使用不同的边界填充方式生成新的图像
replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_CONSTANT, value=0)
# 使用Matplotlib显示不同边界填充方式的图像(231: 2*3的网格的第1个位置)
plt.subplot(231), plt.imshow(img), plt.title('ORIGINAL')
plt.subplot(232), plt.imshow(replicate), plt.title('REPLICATE')
plt.subplot(233), plt.imshow(reflect), plt.title('REFLECT')
plt.subplot(234), plt.imshow(reflect101), plt.title('REFLECT_101')
plt.subplot(235), plt.imshow(wrap), plt.title('WRAP')
plt.subplot(236), plt.imshow(constant), plt.title('CONSTANT')
# 显示图像
plt.show()
# 关闭所有OpenCV窗口
cv2.destroyAllWindows()
函数原型:cv2.copyMakeBorder(src, top, bottom, left, right, borderType[, dst[, value]])
参数:
src
:输入图像。top
、bottom
、left
、right
:指定在每个边界添加的像素数。borderType
:
dst
:输出图像,可选。value
:当 borderType
为 cv2.BORDER_CONSTANT
时使用的边界常数。返回值:
dst
参数,则返回输出图像 dst
;否则,返回添加边界后的新图像。功能:
cv2.copyMakeBorder
函数用于在图像的四个边界上添加边界。你可以指定要添加的像素数以及边界的类型。不同的 borderType
选项会导致不同的边界填充方式。
这个函数在图像处理中常用于图像扩展、填充以及处理边界条件的情况,例如在进行卷积运算时。
shape
是 NumPy
数组的一个属性。在 NumPy
中,shape
用于获取数组的维度信息。
示例:array.shape
返回值:
功能:
在NumPy
中,copy()
方法用于创建数组的副本(复制)。这个方法返回一个新的数组对象,该对象是原始数组的完整副本,包括数据和属性。这意味着对新数组的任何更改都不会影响原始数组,反之亦然。