目录
[1. OpenCV由来与发展历程](#1. OpenCV由来与发展历程)
[2. 生活里无处不在的OpenCV应用](#2. 生活里无处不在的OpenCV应用)
[3. OpenCV VS turtle 核心区别](#3. OpenCV VS turtle 核心区别)
[4. OpenCV四大核心优势](#4. OpenCV四大核心优势)
[1. 标准安装命令](#1. 标准安装命令)
[2. 安装常见坑](#2. 安装常见坑)
[3. 代码固定导入模板](#3. 代码固定导入模板)
[1. 核心函数详细说明](#1. 核心函数详细说明)
[2. 空白窗口演示代码](#2. 空白窗口演示代码)
[1. imread 读取图片避坑要点](#1. imread 读取图片避坑要点)
[2. 图像三大底层属性](#2. 图像三大底层属性)
[3. 图片缩放 resize](#3. 图片缩放 resize)
[4. 图片旋转 rotate](#4. 图片旋转 rotate)
[5. 图片翻转 flip](#5. 图片翻转 flip)
[6. 两张图片加权融合 addWeighted](#6. 两张图片加权融合 addWeighted)
[1. 摄像头代码](#1. 摄像头代码)
[1. 完整进阶代码](#1. 完整进阶代码)
[八、摄像头实时录制,自动保存 MP4 视频](#八、摄像头实时录制,自动保存 MP4 视频)
[1. 知识点](#1. 知识点)
[2. 完整录像代码](#2. 完整录像代码)
上一章我们完整学习了 Python 各类实用第三方库(random/tqdm/jieba/turtle),学会用现成工具快速实现随机生成、进度展示、文本分词、简易绘图等功能。从本章开始,我们正式开启计算机视觉核心工具 ------OpenCV 的系统学习。很多同学学完 Python 基础、循环、类、文件操作后,想做图片修图、摄像头抓拍、画面识别却不知道从何下手,OpenCV 就是解决这类需求的万能工具。
本章我们先梳理 OpenCV 发展历史、完整搭建运行环境,再结合配套示例代码,掌握图片读取、窗口控制、照片保存、摄像头实时画面、视频录制五大基础核心操作
一、OpenCV是什么?(发展历史、适用场景、核心优势)
1. OpenCV由来与发展历程
OpenCV 全称 Open Source Computer Vision Library,直译「开源计算机视觉库」。
1999 年由英特尔实验室团队主导开发,初衷是降低机器视觉开发门槛,把复杂像素运算、图像算法全部封装,开发者不用手写底层图像运算逻辑。
- 初代版本:仅支持 C 语言,多用于工厂产品缺陷检测、工业摄像头识别;
- 2006 迭代改版:重构为 C++ 内核,同步推出 Python 调用接口,降低学生、新手学习难度;
- 现在状态:全球社区持续免费维护,跨 Windows/Mac/Linux/树莓派/安卓,完全商用免费无版权费用。
2. 生活里无处不在的OpenCV应用
很多人以为 OpenCV 只是程序员工具,其实日常软件底层都在使用:手机美颜滤镜、人脸识别解锁、证件照底色更换、监控人形报警、短视频特效、手写文字识别、机器人视觉避障、试卷扫描批改,全部依赖 OpenCV 图像算法。
3. OpenCV VS turtle 核心区别
不少同学会混淆两者绘图工具,这里清晰区分:
| 工具 | 适用范围 | 底层能力 |
|---|---|---|
| turtle | 仅绘制虚拟线条、几何图形,无法读取真实照片 | 仅简单2D绘图,无图像算法 |
| OpenCV | 读取本地照片、实时摄像头、视频,内置降噪/边缘/识别算法 | 完整图像处理、视觉分析能力 |
4. OpenCV四大核心优势
- 完全免费开源,无功能阉割、无商用收费限制;
- 底层C/C++编写,运行速度快,Python接口简单易懂;
- 内置上百套成熟图像算法,绘图、降噪、边缘检测、人脸检测一键调用;
- 同时支持静态图片、实时摄像头流、本地视频文件三类素材。
二、OpenCV环境安装
1. 标准安装命令
OpenCV运行依赖numpy数值矩阵库,一条命令一次性安装两个包:
bash
pip install opencv-python numpy
国内网络下载缓慢,使用清华镜像加速:
bash
pip install opencv-python numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
2. 安装常见坑
- 不要安装
opencv-contrib-python拓展包,内置大量进阶算法,入门阶段用基础包足够; - 安装后关闭当前终端,重新打开再运行代码,避免环境缓存不生效;
- 提示pip不是内部命令,需要先配置Python系统环境变量。
- 如果出现 DLL 加载失败报错,卸载旧版本,安装低版本
pip install opencv-python==4.8.1.78,新版本在部分 Windows 环境会 DLL 异常。
3. 代码固定导入模板
所有OpenCV文件开头必须导入两个库:
python
import cv2
import numpy as np
cv2:OpenCV所有图像操作函数入口;numpy:负责存储图像像素矩阵,画布、通道拆分、像素修改全部依赖它。
三、OpenCV窗口基础全套函数
不管打开图片还是摄像头,窗口创建、画面展示、按键监听、资源销毁是固定四件套,先吃透原理,避免后续画面卡死、窗口残留问题。
1. 核心函数详细说明
cv2.namedWindow(窗口名称, 窗口模式):创建图像窗口,窗口模式有两种:cv2.WINDOW_AUTOSIZE:自适应图片尺寸,窗口无法手动拉伸;cv2.WINDOW_NORMAL:可自由放大缩小窗口,调试图片推荐;cv2.resizeWindow(窗口名, 宽度, 高度):自定义窗口固定长宽;cv2.imshow(窗口名, 图像变量):将图片/帧渲染到窗口;cv2.waitKey(毫秒):监听键盘输入- 返回值 :返回按键的 ASCII 码;如果没有按键按下,返回
-1; - 参数填
0:无限等待按键,适合静态图片; - 参数填数字:定时等待,视频/摄像头必须填写大于 0 的毫秒数,否则画面卡死;
- 全平台兼容写法 :推荐使用
key & 0xFF == ord('q')判断按键,避免不同系统返回码差异导致按键失效;
- 返回值 :返回按键的 ASCII 码;如果没有按键按下,返回
cv2.destroyAllWindows():一次性关闭全部图像窗口,释放内存资源。
高频疑惑点: 很多同学在高分辨率屏幕(如 2K、4K 笔记本)上运行代码,发现 cv2.WINDOW_AUTOSIZE 弹出的窗口特别小,甚至看不清画面内容。这是因为 WINDOW_AUTOSIZE 会严格按照图片原始像素尺寸显示,而高分辨率屏幕的物理像素密度更高,同样像素数的窗口在屏幕上看起来就更小。解决办法很简单:改用 cv2.WINDOW_NORMAL 模式,再配合 cv2.resizeWindow() 手动放大窗口,画面就能清晰显示了。
2. 空白窗口演示代码
python
import cv2
import numpy as np
创建可自由缩放窗口
cv2.namedWindow("空白调试窗口", cv2.WINDOW_NORMAL)
自定义窗口宽800、高600
cv2.resizeWindow("空白调试窗口", 800, 600)
用numpy生成纯黑色画布(高600、宽800、三通道)
canvas = np.zeros((600, 800, 3), dtype=np.uint8)
填充纯黑色空白画布
cv2.imshow("空白调试窗口", canvas)
无限等待键盘输入
key = cv2.waitKey(0)
if key & 0xFF == ord('q'):
print("按下q,程序正常退出,释放窗口资源")
cv2.destroyAllWindows()
四、读取本地图片,查看图像底层像素信息
1. imread 读取图片避坑要点
语法:cv2.imread(文件路径, 读取模式)
- 中文路径不支持 :OpenCV 原生
imread不支持中文路径,文件或文件夹名字带中文时,图片会直接返回None,大量新手在这里踩坑。建议图片路径、文件名全部使用英文;如果必须用中文路径,需要改用np.fromfile读取,示例:img = cv2.imdecode(np.fromfile(r"D:\图片\测试.jpg", dtype=np.uint8), cv2.IMREAD_COLOR)。 - Windows路径问题:直接加
r原始字符串,防止\n换行、\t制表符被识别为转义字符,导致图片读取失败; - 色彩底层规则:OpenCV内部存储顺序为 BGR(蓝、绿、红),和我们日常看图软件RGB顺序相反,后期调色、取色需要注意;
- 读取模式补充:
- 默认不填参数:彩色三通道图片;
cv2.IMREAD_GRAYSCALE:直接读取为灰度黑白图。
2. 图像三大底层属性
图片本质是数字矩阵,三个核心参数看懂像素构成:
img.shape:返回元组(高度, 宽度, 通道数),灰度图无通道;img.size:总像素数量 = 高度 × 宽度 × 通道;img.dtype:像素数据类型,图像统一为uint8,像素取值范围0~255。
完整代码
python
import cv2
r原始字符串,彻底规避路径转义报错
img = cv2.imread(r'D:\PYTHON\your name.jpg')
容错判断:图片读取失败时img为None,直接退出避免崩溃
if img is None:
print("图片读取失败,请检查文件路径!")
exit()
打印图像底层矩阵信息
print("图像(高, 宽, 通道):", img.shape)
print("整张图片总像素数量:", img.size)
print("像素存储数据类型:", img.dtype)
创建自适应窗口展示原图
cv2.namedWindow("原图预览", cv2.WINDOW_AUTOSIZE)
cv2.imshow("原图预览", img)
按下q关闭窗口
key = cv2.waitKey(0)
if key & 0xFF == ord('q'):
print("图片预览结束")
cv2.destroyAllWindows()
3. 图片缩放 resize
支持固定尺寸缩放、等比例缩放,4 种插值算法适配不同场景:
python
import cv2
读取原图
img = cv2.imread(r'D:\PYTHON\your name.jpg')
容错判断:图片读取失败时img为None,直接退出避免崩溃
if img is None:
print("图片读取失败,请检查路径")
exit()
resize(原图, (宽,高), 插值算法)
INTER_NEAREST 邻近插值,速度快画质差
img1 = cv2.resize(img, (640, 480), interpolation=cv2.INTER_NEAREST)
INTER_LINEAR 双线性,默认缩放算法
img2 = cv2.resize(img, (640, 480), interpolation=cv2.INTER_LINEAR)
INTER_CUBIC 三次立方,放大画质更好
img3 = cv2.resize(img, (640, 480), interpolation=cv2.INTER_CUBIC)
INTER_AREA 区域插值,缩小图片效果最优
img4 = cv2.resize(img, (640, 480), interpolation=cv2.INTER_AREA)
等比例缩放:dsize=None,fx横向缩放倍数,fy纵向缩放倍数
img5 = cv2.resize(img, dsize=None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
分别展示5种缩放效果
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)
cv2.imshow('img4', img4)
cv2.imshow('img5', img5)
持续监听按键,q/ESC退出
while True:
key = cv2.waitKey(10)
if key == ord('q') or key == 27:
break
cv2.destroyAllWindows()
cv2.waitKey(1) # 给窗口系统时间完成销毁
插值算法选择建议:
- INTER_NEAREST:邻近插值,速度最快但画质最差,适合实时性要求极高的场景;
- INTER_LINEAR:双线性插值,OpenCV 默认算法,速度与画质均衡,日常首选;
- INTER_CUBIC:三次立方插值,放大图片时画质更好,但计算量更大;
- INTER_AREA:区域插值,缩小图片时效果最优,能有效减少锯齿和噪点。
4. 图片旋转 rotate
内置三种固定旋转方式,无需手动计算旋转矩阵:
python
import cv2
img = cv2.imread(r"D:\PYTHON\your name.jpg")
# 容错判断:图片读取失败时img为None,直接退出避免崩溃
if img is None:
print("图片读取失败,请检查路径")
exit()
# ROTATE_90_CLOCKWISE 顺时针旋转90度
img1 = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
# ROTATE_90_COUNTERCLOCKWISE 逆时针旋转90度
img2 = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE)
# ROTATE_180 顺时针旋转180度
img3 = cv2.rotate(img, cv2.ROTATE_180)
# 展示三张旋转后的图片
cv2.imshow("img1", img1)
cv2.imshow("img2", img2)
cv2.imshow("img3", img3)
while 1:
key = cv2.waitKey(10)
if key == ord('q') or key == 27:
break
cv2.destroyAllWindows()
cv2.waitKey(1)
避坑提示: cv2.rotate 只能做 90 度、180 度、270 度(即逆时针 90 度)的固定旋转。如果需要任意角度旋转,必须使用 cv2.getRotationMatrix2D + cv2.warpAffine 组合,这部分会在后续进阶章节详细讲解。
5. 图片翻转 flip
支持上下、左右、同时翻转,两种写法:flip 函数 / numpy 切片:
python
import cv2
img = cv2.imread(r"D:\PYTHON\your name.jpg")
# 容错判断:图片读取失败时img为None,直接退出避免崩溃
if img is None:
print("图片读取失败,请检查路径")
exit()
# flipcode=0:上下翻转
img1 = cv2.flip(img, 0)
# flipcode>0:左右翻转
img2 = cv2.flip(img, 1)
# flipcode<0:上下+左右同时翻转
img3 = cv2.flip(img, -1)
# numpy数组切片方式整体翻转
img4 = img[::-1, ::-1]
# 全部窗口展示
cv2.imshow("img1", img1)
cv2.imshow("img2", img2)
cv2.imshow("img3", img3)
cv2.imshow("img4", img4)
while 1:
key = cv2.waitKey(10)
if key == ord('q') or key == 27:
break
cv2.destroyAllWindows()
cv2.waitKey(1)
flipcode 参数速记:
0:上下翻转(沿水平轴);正数(如 1):左右翻转(沿垂直轴);负数(如 -1):上下 + 左右同时翻转,等价于旋转 180 度。
6. 两张图片加权融合 addWeighted
将两张尺寸、通道一致的图片按权重混合,可调节透明度:
python
import cv2
# 读取两张素材图片
img1 = cv2.imread(r'D:\PYTHON\your name.jpg')
img2 = cv2.imread(r"D:\PYTHON\mmexport1784807426149.jpg")
# 容错判断:任一图片读取失败时直接退出,避免崩溃
if img1 is None or img2 is None:
print("图片读取失败,请检查文件路径!")
exit()
# 融合前提:两张图片宽高、通道数量必须完全一致
# addWeighted(图1,图1权重,图2,图2权重,像素偏移量)
new_img = cv2.addWeighted(img1, 0.5, img2, 0.5, 0)
# 展示融合结果
cv2.imshow('new_img', new_img)
while 1:
key = cv2.waitKey(10)
if key == ord('q'):
break
cv2.destroyAllWindows()
cv2.waitKey(1)
核心函数: cv2.addWeighted(图1, 权重1, 图2, 权重2, 偏移量),融合公式为:输出 = 图1 × 权重1 + 图2 × 权重2 + 偏移量。两个权重之和通常为 1,偏移量一般填 0。
提示: 融合前必须保证两张图片的宽高、通道数完全一致,否则会直接报错。如果尺寸不一致,需要先用 cv2.resize 统一尺寸,再用 cv2.cvtColor 统一通道数。
权重提醒: addWeighted 的权重可以大于 1,但权重数值不要过大,否则像素会超出 0~255 范围,画面发白过曝。
五、图片读取+按键另存新图
实战需求:打开原图,按s键将图片另存为新文件,按q直接关闭窗口,适合批量截图、图片副本备份。
核心函数:cv2.imwrite(保存路径, 图像变量),将内存中的图像写入本地磁盘。
python
import cv2
cv2.namedWindow("原图预览", cv2.WINDOW_AUTOSIZE)
img = cv2.imread(r"D:\PYTHON\your name.jpg")
循环持续监听按键
while True:
cv2.imshow("原图预览", img)
key = cv2.waitKey(0)
if key & 0xFF == ord('q'):
# q键:直接退出,不保存
cv2.destroyAllWindows()
break
elif key & 0xFF == ord('s'):
# s键:保存图片副本
cv2.imwrite(r"D:\PYTHON\your name2.jpg", img)
print("图片保存成功,已生成副本!")
break
六、调取电脑摄像头,实时预览画面
cv2.VideoCapture()是摄像头/视频通用读取工具,两种传参方式:
- 传入数字
0:读取电脑内置默认摄像头; - 传入视频文件字符串路径:读取本地mp4/avi视频。
读取逻辑:vc.read()每次读取一帧画面,返回两个值:
ret:布尔值,True代表读取画面成功,False代表设备断开;frame:当前帧图像矩阵,和imread读取的图片格式完全一致。
1. 摄像头代码
python
import cv2
创建可缩放视频窗口
cv2.namedWindow('摄像头实时画面', cv2.WINDOW_NORMAL)
cv2.resizeWindow('摄像头实时画面', 400, 300)
打开本机默认摄像头
vc = cv2.VideoCapture(0)
循环持续读取每一帧画面
while vc.isOpened():
ret, frame = vc.read()
# 读取失败直接跳出循环
if not ret:
print("摄像头读取失败,设备断开")
break
cv2.imshow('摄像头实时画面', frame)
# 约41ms,对应24帧
key = cv2.waitKey(1000 // 24)
if key & 0xFF == ord('q'):
break
释放摄像头硬件占用,避免后台持续占用设备
vc.release()
cv2.destroyAllWindows()
七、摄像头进阶:截图与滤镜实时预览
在掌握摄像头实时预览的基础上,本节为摄像头循环增加三个实用按键功能:按 c 键截取当前帧并保存为图片,按 g 键切换为灰度滤镜预览,按 b 键切回彩色画面。这样既能抓拍精彩瞬间,又能直观感受 OpenCV 图像处理在实时视频流上的效果。
1. 完整进阶代码
python
import cv2
创建可缩放视频窗口
cv2.namedWindow('摄像头进阶预览', cv2.WINDOW_NORMAL)
cv2.resizeWindow('摄像头进阶预览', 400, 300)
打开本机默认摄像头
vc = cv2.VideoCapture(0)
截图计数器,用于生成不重复的文件名
shot_count = 0
循环持续读取每一帧画面
while vc.isOpened():
ret, frame = vc.read()
# 读取失败直接跳出循环
if not ret:
print("摄像头读取失败,设备断开")
break
# 默认显示彩色画面
show_frame = frame
# 监听按键
key = cv2.waitKey(1000 // 24) & 0xFF
if key == ord('c'):
# c键:截取当前帧并保存为图片
shot_count += 1
filename = f"capture_{shot_count}.jpg"
cv2.imwrite(filename, frame)
print(f"截图已保存:{filename}")
elif key == ord('g'):
# g键:切换为灰度滤镜预览
# cv2.cvtColor(输入图像, 颜色转换码) 用于转换图像色彩空间
# 参数1 frame:摄像头读取的当前帧,是BGR三通道彩色图像矩阵
# 参数2 cv2.COLOR_BGR2GRAY:颜色转换码,表示将BGR彩色图转为灰度图
# 返回值:单通道灰度图像矩阵,每个像素只有一个亮度值(0~255),0为纯黑、255为纯白
# 灰度图与彩色图通道数区别:彩色图是3通道(B、G、R各占一个通道),
# 灰度图只有1个通道,因此灰度图内存占用约为彩色图的1/3
show_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
print("已切换为灰度滤镜")
elif key == ord('b'):
# b键:切换回彩色画面
show_frame = frame
print("已切换回彩色画面")
elif key == ord('q'):
# q键:退出程序
break
cv2.imshow('摄像头进阶预览', show_frame)
释放摄像头硬件占用,避免后台持续占用设备
vc.release()
cv2.destroyAllWindows()
按键功能说明:
c键:调用cv2.imwrite()将当前帧保存为 jpg 图片,文件名自动递增避免覆盖;g键:调用cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)将彩色帧转为灰度图,实现实时滤镜效果;b键:恢复显示原始彩色画面;q键:退出程序并释放摄像头资源。
避坑提示: 灰度图是单通道,直接 cv2.imshow() 可以正常显示;但如果后续需要把灰度帧写入视频文件,必须先用 cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR) 转回三通道,否则 VideoWriter 会因通道数不匹配而报错。
八、摄像头实时录制,自动保存 MP4 视频
综合实战案例,融合 os 文件库 + OpenCV 视频写入,完整实现自动创建存储文件夹、读取摄像头原生分辨率、24 帧录制本地 mp4 文件。
1. 知识点
os.makedirs(路径, exist_ok=True):文件夹不存在自动创建,不会报错;vc.get():获取摄像头原生宽高,避免分辨率不匹配导致视频损坏;cv2.VideoWriter_fourcc(*'mp4v'):设置 mp4 编码格式;cv2.VideoWriter():视频写入对象,持续写入每一帧画面。
2. 完整录像代码
**注意:**程序运行就持续写入视频,只有按下 q 键才停止录制,长时间不退出会生成体积巨大的视频文件。
python
import cv2
import os
自动创建data文件夹,已存在不会报错
os.makedirs("./data", exist_ok=True)
打开摄像头设备
vc = cv2.VideoCapture(0)
读取摄像头原生分辨率
width = int(vc.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(vc.get(cv2.CAP_PROP_FRAME_HEIGHT))
print(f"摄像头原生分辨率:{width} × {height}")
设置mp4视频编码
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
创建视频写入对象:文件路径、编码、帧率、(宽,高)
vw = cv2.VideoWriter("./data/output.mp4", fourcc, 24, (width, height))
循环读取、录制画面
while vc.isOpened():
ret, frame = vc.read()
if not ret:
break
# 将当前帧写入视频文件
vw.write(frame)
cv2.imshow('录像预览窗口', frame)
# 控制帧率
key = cv2.waitKey(1000 // 24)
if key & 0xFF == ord('q'):
break
必须释放摄像头、视频写入器,否则文件损坏、摄像头占用
vc.release()
vw.release()
cv2.destroyAllWindows()
print("录像结束,视频保存在./data/output.mp4")
九、本章高频问题
| 序号 | 问题现象 | 根本原因 | 解决方案(核心代码/命令) |
|---|---|---|---|
| 1 | Windows 路径下图片读取返回 None,程序报错 | 路径不加 r 前缀,\t、\n、\u 被识别为转义符号 |
统一使用原始字符串写法:r"D:\文件夹\图片.jpg" |
| 2 | imread 读取带中文路径的图片返回 None,且无任何报错提示 |
OpenCV 原生 imread 不支持中文路径 |
图片路径、文件名全部使用英文,彻底规避该问题 |
| 3 | import cv2 直接失败,提示 DLL 加载错误 |
新版本 opencv 在部分 Windows 环境存在 DLL 兼容问题 | 降级到 4.8.x 稳定版本:pip install opencv-python==4.8.1.78 |
| 4 | 摄像头、视频循环画面卡死不动 | waitKey(0) 永久等待,导致画面无法持续刷新 |
循环中填写毫秒数值,如 cv2.waitKey(1000 // 24) |
| 5 | 摄像头后台持续占用,生成的视频文件损坏无法打开 | VideoCapture、VideoWriter 运行结束未释放资源 |
结束前调用 vc.release()、vw.release() |
| 6 | 生成的 mp4 视频无法正常播放 | VideoWriter 设置的宽高与摄像头原生分辨率不一致 |
用 vc.get(cv2.CAP_PROP_FRAME_WIDTH) 和 vc.get(cv2.CAP_PROP_FRAME_HEIGHT) 获取原生宽高后传入 |
| 7 | 后期调色、取色时颜色错乱 | OpenCV 像素通道是 BGR(蓝绿红),与看图软件 RGB 顺序相反 | 处理颜色时注意通道顺序,必要时用 cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 转换 |
| 8 | 保存视频、图片时因路径不存在触发异常 | 目标文件夹未提前创建 | 用 os.makedirs("./data", exist_ok=True) 自动创建目录 |
| 9 | VideoCapture(0) 打不开摄像头,ret 一直为 False |
电脑摄像头被其他软件占用;笔记本没有给 Python 摄像头权限;部分设备摄像头编号不是 0,尝试 1、2 | 关闭占用摄像头软件;系统设置开启摄像头权限;尝试 cv2.VideoCapture(1) 切换设备编号 |
十、本章知识小结
- OpenCV 是跨平台开源计算机视觉库,底层 C++ 编写,Python 接口简单,覆盖图片、摄像头、视频全场景处理;
- 安装依赖
opencv-python+numpy,代码固定导入import cv2、import numpy as np; - 窗口四件套:
namedWindow创建窗口、imshow渲染画面、waitKey监听按键、destroyAllWindows释放窗口; imread读取本地图片,imwrite导出图片,可搭配按键实现图片备份;VideoCapture控制摄像头与本地视频流,配合VideoWriter实现实时录像;- 视频录制搭配
os库自动创建文件夹,规避路径不存在的报错。
下一章我们进入 OpenCV 绘图专题,从零创建空白画布,绘制直线、矩形、圆形、椭圆、文字,搭配 RGB 滑动条实现动态调色工具,可视化更强,实操趣味性更高。