写在前面:本篇博客主要是记录opnecv的基本操作,不记录安装等步骤。方便回顾和查找方法。
一、图像的IO操作,读取和保存方法
读取图像
在OpenCV中,读取图像的函数是imread()
。该函数可以从指定的文件中加载图像,返回值是一个包含图像数据的多维数组。imread()
函数的原型如下:
cv2.imread(filename[, flags])
参数:
-
filename
:一个字符串,指定要读取的图像文件的名称和路径。该文件的路径可以是相对路径也可以是绝对路径。 -
flags
:该参数是可选的,用于指定加载图像的方式。可能的值包括:-
cv2.IMREAD_COLOR
:读取彩色图像。这是默认参数,此参数下,图像的透明度会被忽略,总是返回三通道的图像。(可以使用参数1代替) -
cv2.IMREAD_GRAYSCALE
:以灰度模式读取图像。(可以使用参数0代替) -
cv2.IMREAD_UNCHANGED
:读取图像中包含的所有通道,包括透明度通道。(可以使用参数-1代替)
-
例如,以下代码会以灰度模式加载图像:
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
注意:如果加载的路径有误,不会报错,会返回一个None值。
显示图像
imshow()
函数的原型如下:
cv2.imshow(winname, mat)
-
winname
:一个字符串,指定显示图像的窗口的名称。 -
mat
:需要显示的图像,通常是使用imread()
函数读取的图像。
注意:需要使用waitKey()
函数来暂停程序,等待用户按键,如果不使用这个函数,图像窗口会立刻关闭,你可能看不到图像。
例如,以下代码会在一个名为"Image"的窗口中显示图像:
img = cv2.imread('image.jpg')
cv2.imshow('Image', img)
cv2.waitKey(0)//参数为0代表永远的显示下去
在显示图像之后,你可以使用destroyAllWindows()
函数来关闭所有打开的窗口。
cv2.destroyAllWindows()
保存图像
imwrite()
函数的原型如下:
cv2.imwrite(filename, img[, params])
参数说明:
-
filename
:一个字符串,指定要保存的图像文件的名称和路径。该文件的路径可以是相对路径也可以是绝对路径。 -
img
:需要保存的图像,通常是你处理过的图像数据。 -
params
:该参数是可选的,表示一系列指定的写入参数。例如,对于JPEG图像,可以使用cv2.IMWRITE_JPEG_QUALITY
来控制图像的质量。
例如,以下代码会保存一幅图像:
cv2.imwrite('output.jpg', img)
注意: imwrite()
函数总是尝试将图像写入到文件中,如果指定的文件已经存在,它将会被新的图像文件覆盖。此外,虽然OpenCV支持多种图像格式,但是不是所有的图像格式都支持所有的颜色和像素深度。例如,JPEG不支持透明度通道,如果你试图保存一个包含透明度通道的图像为JPEG格式,透明度通道将会被忽略。因此,你应该选择合适的图像格式来保存你的图像。
pycharm运行测试:
import cv2 as cv
# 1 读取图像
img = cv.imread('readImage/image/springboot.png')
# 2 显示图像
# 2.1 利用opencv展示图像
cv.imshow('springboot', img)
cv.waitKey(0)
cv.destroyAllWindows()
# 3 保存图像
cv.imwrite('readImage/image/messigray.png', img)
转换图像的颜色空间
cvtColor()
函数的原型如下:
cv2.cvtColor(src, code[, dst[, dstCn]])
参数说明:
-
src
:输入图像。 -
code
:颜色空间转换的类型。例如,cv2.COLOR_BGR2GRAY
表示从BGR到灰度的转换,cv2.COLOR_BGR2HSV
表示从BGR到HSV的转换。 -
dst
:输出图像,通常不需要指定。 -
dstCn
:输出图像的通道数,如果该参数有指定,那么这个通道数将应用到输出图像,否则,通道数将从src和code推断出来。
例如,下面的代码将一个BGR图像转换为灰度图像:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
注意: cvtColor()
函数需要输入的图像是颜色图像,如果输入的是灰度图像,然后试图进行某些颜色空间的转换,例如从BGR到HSV的转换,将会产生错误。同时,不同的颜色空间转换类型需要的输入图像的通道数是不同的,例如,从BGR到灰度的转换需要3通道的输入图像,而从灰度到BGR的转换只需要1通道的输入图像。如果输入图像的通道数和颜色空间转换类型不匹配,将会产生错误。
图像的基本操作(获取像素值,修改像素值,获取图像的形状等)
在OpenCV和Python中,图像被表示为NumPy数组。这意味着我们可以使用标准的NumPy操作和函数来操作图像的像素和获取图像的属性。
1. 获取和修改像素值
通过索引来访问和修改图像的像素值。例如,假设你有一幅BGR图像,你可以这样获取第y行第x列的像素的蓝色分量的值:
blue = img[y, x, 0]
修改这个像素的蓝色分量的值:
img[y, x, 0] = 255
2. 获取图像的形状
可以使用NumPy的shape
属性来获取图像的形状,这将返回一个元组,元素的顺序是(高度,宽度,通道数)。例如:
height, width, channels = img.shape
注意,对于灰度图像,shape
属性将只返回高度和宽度。
3. 获取图像的数据类型
可以使用NumPy的dtype
属性来获取图像的数据类型。这对于调试非常有用,因为大部分在OpenCV中的错误是由无效的数据类型导致的。例如:
print(img.dtype)
注意: 因为像素值通常是无符号的8位整数(即范围在0到255之间),所以当你修改像素值时,需要确保新的像素值在这个范围内。如果像素值超出这个范围,将会被截断。例如,如果你尝试设置像素值为260,实际上会被设置为4。
二、视频的IO操作,读取和保存方法
读取视频文件或摄像头流
使用cv2.VideoCapture()
函数来读取视频文件或摄像头流。例如:
cap = cv2.VideoCapture('video.mp4') # 从文件读取
cap = cv2.VideoCapture(0) # 从第一个摄像头读取
读取帧
ret, frame = cap.read()
这个方法返回两个值:一个布尔值ret
,如果帧已经正确读取,它将是True,否则是False;一个frame
,这是读取的帧。
显示帧
cv2.imshow('Frame', frame)
保存帧
cv2.imwrite('frame.jpg', frame)
写入视频
使用cv2.VideoWriter()
函数来创建一个VideoWriter
对象,然后使用write()
方法来写入帧。
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
out.write(frame)
注意,VideoWriter_fourcc()
函数用于指定视频编码,VideoWriter()
的参数分别是输出文件名、编码、帧率和帧大小。
释放资源
cap.release()
out.release()
案例:读取一个视频文件,将每一帧转换为灰度,然后写入到一个新的视频文件中.
import cv2
# 创建一个 VideoCapture 对象
cap = cv2.VideoCapture('video/ceshi1.mp4')
# 检查是否成功打开
if not cap.isOpened():
print("Could not open video")
exit()
# 获取一些视频的基本信息
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
# 创建一个 VideoWriter 对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output.mp4', fourcc, fps, (frame_width, frame_height), isColor=False)
while True:
# 读取一帧
ret, frame = cap.read()
# 如果帧没有正确读取,就退出循环
if not ret:
break
# 转换帧到灰度
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 写入帧到输出文件
out.write(gray)
# 显示帧
cv2.imshow('Frame', gray)
# 等待用户按下 'q' 键
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放 VideoCapture 和 VideoWriter
cap.release()
out.release()
# 关闭所有窗口
cv2.destroyAllWindows()