参考书目:《OpenCV计算机视觉基础教程》–夏帮贵。
代码编写:Jupyter Notebook。
1.图像基本操作
1.1 读取图像
- imread()函数格式:img = cv2.imread(filename, flag)
- filename:图像文件名;flag:图像读取格式标志;
图像读取格式标志 | 说明 |
cv2.IMREAD_UNCHANGED | 按原样加载图像 |
cv2.IMREAD_GRAYSCALE | 将图像转换为单通道灰度图像 |
cv2.IMREAD_COLOR | 将图像转换为3通道BGR彩色图像 |
cv2.IMREAD_ANYDEPTH | 当图像具有相应深度时,返回16位或32位图像;否则将其深度转换为8位 |
cv2.IMREAD_ANYCOLOR | 以任何可能的颜色格式读取图像 |
cv2.IMREAD_LOAD_GDAL | 使用gdal驱动程序加载图像 |
cv2.IMREAD_REDUCED_GRAYSCALE_2 | 将图像转换为单通道灰度图像,并且图像尺寸减小为1/2 |
cv2.IMREAD_REDUCED_COLOR_2 | 将图像转换为3通道BGR彩色图像,并且图像尺寸减小为1/2 |
cv2.IMREAD_REDUCED_GRAYSCALE_4 | 将图像转换为单通道灰度图像,并且图像尺寸减小为1/4 |
cv2.IMREAD_REDUCED_COLOR_4 | 将图像转换为3通道BGR彩色图像,并且图像尺寸减小为1/4 |
cv2.IMREAD_REDUCED_GRAYSCALE_8 | 将图像转换为单通道灰度图像,并且图像尺寸减小为1/8 |
cv2.IMREAD_REDUCED_COLOR_8 | 将图像转换为3通道BGR彩色图像,并且图像尺寸减小为1/8 |
cv2.IMREAD_IGNORE_ORIENTATION | 不根据EXIF方向标志旋转图像 |
- 注:OpenCV默认图像格式:BGR,即3通道图像数组3个维度依次为:B、G、R通道的像素;
# 使用imread()读取图像
import cv2
img = cv2.imread("01.jpg")
print("输出数据类型:", type(img))
print("输出图像数组:\n", img)
print("输出数组形状:", img.shape) # 输出的三个数表示:图像高度、图像宽度、通道数;
print("输出数组元素的数据类型:", img.dtype)
print("输出数组元素的个数:", img.size)
# 结果输出:
输出数据类型: <class 'numpy.ndarray'>
输出图像数组:
[[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
...
输出数组形状: (488, 450, 3)
输出数组元素的数据类型: uint8
输出数组元素的个数: 658800
1.2 写入图像
# 使用imwrite()函数将数组中保存的图像写入文件
import cv2
import numpy as np
img1 = np.zeros((60, 80), dtype = np.uint8)
cv2.imwrite("img1.jpg", img1)
img2 = cv2.imread("img1.jpg")
print("img1.shape", img1.shape)
1.3 显示图像
# 使用imshow()函数在窗口中显示图像
import cv2
import numpy as np
img3 = cv2.imread("01.jpg")
cv2.imshow("01", img3)
key = 0
# 按ESC按键终止循环
while key != 27:
key = cv2.waitKey() # 等待按键
cv2.destroyWindow("01")
1.4 图像操作实战
import numpy as np
import cv2 as cv
img_test = cv.imread("01.jpg", 0)
cv.imshow("image", img_test)
k = cv.waitKey(0) & 0xFF
# 按ESC键或q键退出
if (k == 27) or (k == ord("q")):
cv.destroyAllWindows()
elif k == ord("s"):
cv.imwrite("01_modify.jpg", img_test) # 按s键保存图片
cv.destroyAllWindows()
2.视频基本操作
2.1 视频处理基本操作
- 将视频文件或摄像头作为数据源来创建VideoCapture对象;
- 调用VideoCapture对象的read()方法获取视频中的帧,每一帧都是一幅图像;
- 调用VideoWriter对象的write()方法将帧写入视频文件,或调用cv2.imshow()函数在窗口中显示帧,即播放视频;
2.2 播放视频
# 播放视频即逐帧读取和显示帧图像
import cv2
video1 = cv2.VideoCapture("gh.mp4") # 创建VideoCapture对象
fps = video1.get(cv2.CAP_PROP_FPS) # 读取视频帧速率
size = (video1.get(cv2.CAP_PROP_FRAME_HEIGHT),video1.get(cv2.CAP_PROP_FRAME_WIDTH)) # 读取视频大小
print("视频帧速率:", fps)
print("视频大小:", size)
success, frame = video1.read() # 读取第1帧
while success:
cv2.imshow("myvideo", frame)
success, frame = video1.read()
key = cv2.waitKey(25) # 延迟时间
if key == 27 & 0xFF:
break
video1.release()
cv2.destroyAllWindows()
2.3 写入视频
import cv2 as cv
video2 = cv.VideoCapture("gh.mp4")
fps = video2.get(cv.CAP_PROP_FPS) # 读取视频帧速率
size = (int(video2.get(cv.CAP_PROP_FRAME_HEIGHT)),
int(video2.get(cv.CAP_PROP_FRAME_WIDTH))) # 读取视频大小
video_write = cv.VideoWriter("video2_test.avi",
# 设置解码方式
cv.VideoWriter_fourcc("X", "V", "I", "D"),
fps, size
)
success, frame = video2.read()
while success:
video_write.write(frame)
success, frame = video2.read()
video2.release()
cv.destroyAllWindows()
2.4 关于解码格式
- cv2.VideoWriter_fourcc(“P”, “I”, “M”, “1”):XVID的MPEG-1编码格式,视频后缀.avi;
- cv2.VideoWriter_fourcc(“M”, “P”, “4”, “2”):Microsoft的MPEG-4编码格式,视频后缀.avi;
- cv2.VideoWriter_fourcc(“X”, “V”, “I”, “D”):XVID的MPEG-4编码格式,视频后缀.avi;
- cv2.VideoWriter_fourcc(“F”, “L”, “V”, “1”):XVID的MPEG-4编码格式,视频后缀.flv;
2.5 捕获摄像头视频
import cv2 as cv
video3 = cv.VideoCapture(0) # 使用默认摄像头
fps = 30
size = (int(video3.get(cv.CAP_PROP_FRAME_WIDTH)),
int(video3.get(cv.CAP_PROP_FRAME_HEIGHT))
)
video3_capture = cv.VideoWriter("video3_capture.avi",
cv.VideoWriter_fourcc("X", "V", "I", "D"),
fps, size
)
success, frame = video3.read()
while success:
video3_capture.write(frame)
cv2.imshow("capture", frame)
key = cv.waitKey() & 0xFF
if (key == 27) or (key == ord("q")):
break
success, frame = video3.read()
video3.release()
video3_capture.release()
cv.destroyAllWindows()