参考书目:《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 视频处理基本操作
  1. 将视频文件或摄像头作为数据源来创建VideoCapture对象;
  2. 调用VideoCapture对象的read()方法获取视频中的帧,每一帧都是一幅图像;
  3. 调用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 关于解码格式
  1. cv2.VideoWriter_fourcc(“P”, “I”, “M”, “1”):XVID的MPEG-1编码格式,视频后缀.avi;
  2. cv2.VideoWriter_fourcc(“M”, “P”, “4”, “2”):Microsoft的MPEG-4编码格式,视频后缀.avi;
  3. cv2.VideoWriter_fourcc(“X”, “V”, “I”, “D”):XVID的MPEG-4编码格式,视频后缀.avi;
  4. 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()