
1. 计算机视觉与OpenCV计算机视觉旨在对图片或视频进行处理如格式转换、特征检测、人脸识别等。本次课程将使用OpenCV作为核心库版本指定为3.4.18.65以确保与课程代码的兼容性。2. 图片的构成与本质图片由无数个微小的“像素点”构成每个像素点是一个带有颜色的方格。每个像素点的颜色由红(R)、绿(G)、蓝(B)三个通道的数值共同决定每个通道的数值范围是0-255。图片本质上是一个巨大的二维数组其数据类型为uint8。3. 安装OpenCV库安装指定版本的OpenCV-Python (3.4.18.65) 和 OpenCV-contrib-Python (3.4.18.6)。pip install opencv-python3.4.18.65 -i https://pypi.tuna.tsinghua.edu.cn/simple pip install opencv-contrib-python3.4.18.65 -i https://pypi.tuna.tsinghua.edu.cn/simple读取图片: 使用cv2.imread()函数读取图片并将其存入变量。显示图片: 使用cv2.imshow()函数将图片在窗口中展示出来并通过waitKey()函数控制窗口的显示时长或等待用户按键关闭。获取信息: 可通过打印变量的shape、type、size等属性获取图片的分辨率、数据类型和总大小等信息。注意事项OpenCV对中文字符兼容性较差建议图片文件名及路径中避免使用中文字符。如果出现下图这种情况需要给 VS Code 补上 OpenCV 的语法识别文件。主 Python 环境在D:\py\python.exe对应的第三方库目录D:\py\Lib\site-packages\cv2里面的 cv2.pyd 是 OpenCV 的核心编译文件VS Code 识别不到这个文件里的函数所以报“找不到 imread/imshow”需要补全 OpenCV 的类型提示包让 VS Code 能识别到函数1. 进入路径D:\py\Lib\site-packages\cv22. 复制里面的 cv2.pyd3. 粘贴到当前 Python 环境的 cv2 文件夹里4. 重启 VS Code 即可OpenCV基础图片读取、显示、查看图片属性OpenCV一个重要特点图片通道是BGR顺序不是RGB。import cv2import numpy as np重点OpenCV默认读取彩色图片是 BGR 顺序蓝-绿-红和我们平时RGB相反。OpenCV的图片本质就是一个numpy多维数组所有像素数据都存在数组里。a cv2.imread(timg98.jpg)读取当前文件夹下的 timg98.jpg 图片变量a是一个三维numpy数组存储图片所有像素数据默认读取彩色图片不做灰度处理# print(a) # NumPy数组其中存储了读取的图像文件的像素值。如果打开会打印出图片所有像素的数字矩阵0~255的数值cv2.imshow(winname: tu,a) #显示图片。显示图片的名称显示的图片数据。弹出一个窗口窗口名字叫tu显示我们读取的图片ab cv2.waitKey(0)核心3个作用1. 固定窗口不闪退0 代表无限等待不按键盘窗口不会关闭如果写1000就是1000毫秒后自动关闭2. 等待用户按键3. 按下按键后返回按键的ASCII码值存到变量b里print(b)#当前按下按键 ASCII码值打印你刚才按下按键对应的ASCII编码比如按ESC会输出27cv2.destroyAllWindows()关闭所有OpenCV窗口释放内存防止后台残留进程print(图像形状shape:, a.shape) #高、宽、通道数彩色图固定是3个通道BGR灰度图只有2个值(高,宽)print(图像数据类型dtype:, a.dtype)每个像素的取值范围是 0~2550代表黑色255代表白色print(图像大小size:, a.size)总像素 高 × 宽 × 3彩色图灰度图读取 ROI区域截取第一部分灰度图读取、显示、保存b cv2.imread(r./timg98.jpg,cv2.IMREAD_GRAYSCALE)cv2.IMREAD_GRAYSCALE固定参数强制把图片转为灰度图黑白图不再是彩色RGB图cv2.imshow(xx,b)显示窗口窗口名字叫xx显示灰度图片bacv2.waitKey(0)等待用户按任意按键0代表无限等待不按键窗口不会关闭单位是毫秒返回值a会记录你按下按键的ASCII码cv2.destroyAllWindows()关闭所有OpenCV打开的图片窗口释放内存防止后台残留进程查看灰度图的核心信息print(图像形状shape:, b.shape)print(图像数据类型dtype:, b.dtype)print(图像大小size:, b.size)cv2.imwrite(timg98_GRAY.jpg,b)把处理好的灰度图保存为新文件timg98_GRAY.jpg保存在代码同级文件夹第二部分ROI区域截取什么是ROIROI 感兴趣区域就是从一张大图里截取其中一小块区域单独拿出来处理常用于人脸识别、目标检测。a cv2.imread(r./timg98.jpg)重新读取彩色原图不做灰度处理b a[30:230,100:300]这是NumPy数组切片OpenCV图片本质就是NumPy数组• 格式图片[高的范围, 宽的范围]• 30:230截取行高度从第30行到230行• 100:300截取列宽度从第100列到300列cv2.imshow(yuantu,a)cv2.imshow(qiepian,b)cv2.waitKey(0)cv2.destroyAllWindows()同时显示原图和截取后的切片图按任意键关闭窗口1. 灰度图shape只有2个值(高,宽)彩色图是3个(高,宽,3)2. ROI截取本质是NumPy数组切片顺序固定[高度区间, 宽度区间]3. 图片读取cv2.IMREAD_COLOR默认彩色cv2.IMREAD_GRAYSCALE灰度图4. 必须写waitKey(0)否则图片窗口会一闪而过OpenCV视频处理基础模板video_capture cv2.VideoCapture(转场.mp4)cv2.VideoCapture(路径)打开本地视频文件如果写 cv2.VideoCapture(0)就会调用电脑默认摄像头实时读取画面变量video_capture是视频读取对象用来控制视频读取检查视频是否成功打开if not video_capture.isOpened():print(无法打开视频文件)exit()如果返回False说明文件不存在、路径错误、文件损坏直接退出程序while True:无限循环一帧一帧读取视频视频本质就是连续的图片帧。ret, frame video_capture.read()read()逐帧读取视频返回两个值ret布尔值True读取成功False视频读到末尾了frame读取到的一帧画面本质就是一张图片numpy数组if not ret:break如果读取失败视频播放完毕跳出循环结束播放。framecv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)cv2.cvtColor()颜色空间转换函数cv2.COLOR_BGR2GRAY把BGR彩色帧 → 灰度图黑白cv2.imshow(Video, frame)弹出窗口显示处理后的灰度帧画面if cv2.waitKey(60) 27:breakwaitKey(60)每一帧等待60毫秒控制播放速度数值越大播放越慢27 是ESC键的ASCII码按下ESC就跳出循环停止播放video_capture.release()cv2.destroyAllWindows()• release()关闭视频流释放视频占用的资源• destroyAllWindows()关闭所有窗口释放内存BGR颜色通道整体分为3大核心模块1. 提取 BGR 三通道两种方法数组切片 / split 函数2. 单独显示纯彩色单通道解决单通道显示是灰度图的问题3. 合并通道 merge还原彩色图第一部分提取 BGR 颜色通道两种写法a cv2.imread(r./timg98.jpg)# 方法一用 numpy 数组切片提取通道a1 a[:, :, 0] # 第0层 蓝色B通道a2 a[:, :, 1] # 第1层 绿色G通道a3 a[:, :, 2] # 第2层 红色R通道# 方法二用 cv2.split() 分离通道b, g, r cv2.split(a)# b蓝色通道g绿色通道r红色通道图片本质是三维数组(高, 宽, 通道)切片写法[所有行, 所有列, 通道号]两种方法效果完全一样# 显示三个单通道cv2.imshow(b, a1)cv2.imshow(g, a2)cv2.imshow(r, a3)cv2.waitKey(0)cv2.destroyAllWindows()注意单独一个通道显示出来是灰色图原因单通道只有亮度信息没有色彩信息OpenCV 只能显示灰度。第二部分提取纯蓝色通道的彩色图上面直接提取通道是灰色这段代码只保留蓝色把绿、红通道清零import cv2a cv2.imread(r./timg98.jpg)# 复制原图避免修改原始数据a_new a.copy()a_new[:, :, 1] 0 # 绿色通道全部置0a_new[:, :, 2] 0 # 红色通道全部置0# 此时只剩下蓝色通道图片会显示纯蓝色cv2.imshow(result2, a_new)cv2.waitKey(0)cv2.destroyAllWindows()原理BGR 三个通道都存在只是 G、R 全黑只有 B 有数值 → 画面就会变成蓝色同理只保留绿色就把 B、R 置0只保留红色就把 B、G 置0第三部分合并颜色通道 merge# 把分离的 b g r 重新合并成彩色图img cv2.merge((b, g, r))# 也可以用切片结果合并img cv2.merge((a1,a2,a3))cv2.imshow(result3, img)cv2.waitKey(0)cv2.destroyAllWindows()cv2.merge(通道1,通道2,通道3)把三个单通道按 BGR 顺序合并成一张彩色图合并顺序必须是B→G→R顺序错了颜色会错乱