Python-OpenCV:库、环境搭建、图片与摄像头解析

目录

一、OpenCV是什么?(发展历史、适用场景、核心优势)

[1. OpenCV由来与发展历程](#1. OpenCV由来与发展历程)

[2. 生活里无处不在的OpenCV应用](#2. 生活里无处不在的OpenCV应用)

[3. OpenCV VS turtle 核心区别](#3. OpenCV VS turtle 核心区别)

[4. OpenCV四大核心优势](#4. OpenCV四大核心优势)

二、OpenCV环境安装

[1. 标准安装命令](#1. 标准安装命令)

[2. 安装常见坑](#2. 安装常见坑)

[3. 代码固定导入模板](#3. 代码固定导入模板)

三、OpenCV窗口基础全套函数

[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四大核心优势

  1. 完全免费开源,无功能阉割、无商用收费限制;
  2. 底层C/C++编写,运行速度快,Python接口简单易懂;
  3. 内置上百套成熟图像算法,绘图、降噪、边缘检测、人脸检测一键调用;
  4. 同时支持静态图片、实时摄像头流、本地视频文件三类素材。

二、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. 安装常见坑

  1. 不要安装opencv-contrib-python拓展包,内置大量进阶算法,入门阶段用基础包足够;
  2. 安装后关闭当前终端,重新打开再运行代码,避免环境缓存不生效;
  3. 提示pip不是内部命令,需要先配置Python系统环境变量。
  4. 如果出现 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. 核心函数详细说明

  1. cv2.namedWindow(窗口名称, 窗口模式):创建图像窗口,窗口模式有两种:
  2. cv2.WINDOW_AUTOSIZE:自适应图片尺寸,窗口无法手动拉伸;
  3. cv2.WINDOW_NORMAL:可自由放大缩小窗口,调试图片推荐;
  4. cv2.resizeWindow(窗口名, 宽度, 高度):自定义窗口固定长宽;
  5. cv2.imshow(窗口名, 图像变量):将图片/帧渲染到窗口;
  6. cv2.waitKey(毫秒):监听键盘输入
    • 返回值 :返回按键的 ASCII 码;如果没有按键按下,返回 -1
    • 参数填0:无限等待按键,适合静态图片;
    • 参数填数字:定时等待,视频/摄像头必须填写大于 0 的毫秒数,否则画面卡死;
    • 全平台兼容写法 :推荐使用 key & 0xFF == ord('q') 判断按键,避免不同系统返回码差异导致按键失效;
  7. 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(文件路径, 读取模式)

  1. 中文路径不支持 :OpenCV 原生 imread 不支持中文路径,文件或文件夹名字带中文时,图片会直接返回 None,大量新手在这里踩坑。建议图片路径、文件名全部使用英文;如果必须用中文路径,需要改用 np.fromfile 读取,示例:img = cv2.imdecode(np.fromfile(r"D:\图片\测试.jpg", dtype=np.uint8), cv2.IMREAD_COLOR)
  2. Windows路径问题:直接加r原始字符串,防止\n换行、\t制表符被识别为转义字符,导致图片读取失败;
  3. 色彩底层规则:OpenCV内部存储顺序为 BGR(蓝、绿、红),和我们日常看图软件RGB顺序相反,后期调色、取色需要注意;
  4. 读取模式补充:
    • 默认不填参数:彩色三通道图片;
    • 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()是摄像头/视频通用读取工具,两种传参方式:

  1. 传入数字0:读取电脑内置默认摄像头;
  2. 传入视频文件字符串路径:读取本地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. 知识点

  1. os.makedirs(路径, exist_ok=True):文件夹不存在自动创建,不会报错;
  2. vc.get():获取摄像头原生宽高,避免分辨率不匹配导致视频损坏;
  3. cv2.VideoWriter_fourcc(*'mp4v'):设置 mp4 编码格式;
  4. 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 摄像头后台持续占用,生成的视频文件损坏无法打开 VideoCaptureVideoWriter 运行结束未释放资源 结束前调用 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 cv2import numpy as np
  • 窗口四件套:namedWindow 创建窗口、imshow 渲染画面、waitKey 监听按键、destroyAllWindows 释放窗口;
  • imread 读取本地图片,imwrite 导出图片,可搭配按键实现图片备份;
  • VideoCapture 控制摄像头与本地视频流,配合 VideoWriter 实现实时录像;
  • 视频录制搭配 os 库自动创建文件夹,规避路径不存在的报错。

下一章我们进入 OpenCV 绘图专题,从零创建空白画布,绘制直线、矩形、圆形、椭圆、文字,搭配 RGB 滑动条实现动态调色工具,可视化更强,实操趣味性更高。

相关推荐
zhy295631 小时前
在 QAIRT Genie SDK 上部署 Llama 3.2 1B 模型:从环境准备到 C++ 推理
开发语言·c++·llama
抓不住时间的沙1 小时前
N1搭建Hexo个人博客,部署到Github
python·docker·node.js·debian·github·arm
W_326001 小时前
Python-OpenCV:画布、图形、文字、调色滑动条
图像处理·python·opencv·机器学习·计算机视觉
爱跳舞的烤冷面1 小时前
自学嵌入式第N天(Linux篇——文件编程)
java·开发语言·前端
Promising_GEO1 小时前
新电脑科研环境配置指南:Miniforge + PyCharm + GitHub 从安装到可用
ide·python·pycharm·github·地理
空堂与归1 小时前
机器学习如何入门?AI/ML/DL概念与建模流程全景
人工智能·机器学习
Patrick在香港2 小时前
Claude API 成本直降90%:Prompt Caching 提示词缓存 Python 实战
python·缓存·prompt
没落之王2 小时前
易学使者郑氏正脉郑冰推演马航事件
大数据·人工智能·算法·机器学习·可用性测试
caimouse2 小时前
ReactOS 图形系统分析(33):字体子系统 — font.c
c语言·开发语言·reactos