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

目录

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

1. OpenCV由来与发展历程

2. 生活里无处不在的OpenCV应用

3. OpenCV VS turtle 核心区别

4. OpenCV四大核心优势

二、OpenCV环境安装

1. 标准安装命令

2. 安装常见坑

3. 代码固定导入模板

三、OpenCV窗口基础全套函数

1. 核心函数详细说明

2. 空白窗口演示代码

四、读取本地图片,查看图像底层像素信息

1. imread 读取图片避坑要点

2. 图像三大底层属性

3. 图片缩放 resize

4. 图片旋转 rotate

5. 图片翻转 flip

6. 两张图片加权融合 addWeighted

五、图片读取+按键另存新图

六、调取电脑摄像头,实时预览画面

1. 摄像头代码

七、摄像头进阶:截图与滤镜实时预览

1. 完整进阶代码

八、摄像头实时录制,自动保存 MP4 视频

1. 知识点

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数值矩阵库,一条命令一次性安装两个包:

pip install opencv-python numpy

国内网络下载缓慢,使用清华镜像加速:

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文件开头必须导入两个库:

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. 空白窗口演示代码

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。

完整代码

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 种插值算法适配不同场景:

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

内置三种固定旋转方式,无需手动计算旋转矩阵:

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 切片:

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

将两张尺寸、通道一致的图片按权重混合,可调节透明度:

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(保存路径, 图像变量),将内存中的图像写入本地磁盘。

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. 摄像头代码

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. 完整进阶代码

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 键才停止录制,长时间不退出会生成体积巨大的视频文件。

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")

九、本章高频问题

序号问题现象根本原因解决方案(核心代码/命令)
1Windows 路径下图片读取返回 None,程序报错路径不加 r 前缀,\t\n\u 被识别为转义符号统一使用原始字符串写法:r"D:\文件夹\图片.jpg"
2imread 读取带中文路径的图片返回 None,且无任何报错提示OpenCV 原生 imread 不支持中文路径图片路径、文件名全部使用英文,彻底规避该问题
3import 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) 自动创建目录
9VideoCapture(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 滑动条实现动态调色工具,可视化更强,实操趣味性更高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值