一、实验目的及原理

实验目的:

  1. 了解OpenCV中使用摄像头采集图像的方法
  2. 掌握OpenCV进行图像采集、存储与显示的实现方法

原理:

        利用 OpenCV 的 cv2.VideoCapture 类,初始化摄像头并开启图像采集,得到摄像头输出的连续视频流,利用 cap.read() 逐帧拆解为单幅图像——在内存中即一个 NumPy 数组:

彩色帧:三维 (H, W, 3),通道顺序为 BGR,取值 0–255;

灰度帧:二维 (H, W),仅含亮度信息。

        在获取灰色图像时,可用 cv2.cvtColor 完成 BGR→Gray 转换;而窗口实时预览则交给 cv2.imshow,它将像素矩阵瞬间渲染到屏幕。
        最后,用 cv2.imwrite 即可把内存中的数组按 PNG/JPG 等格式编码落盘,实现“采集—处理—保存”的完整闭环。

二、程序代码

        要实现本次实验的任务,我们需要在基于python3环境中新建一个虚拟环境dip,并在dip中配置了OpenCV库。

        当直接使用pip install opencv-python进行下载时,下载速度缓慢,于是借助清华镜像进行下载,利用指令pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple opencv-python进行下载,大大提升了下载效率。最后在Pycharm中配置好解释器后,就可以运行一下代码完成本次实验任务。

import cv2
import time
import os
import warnings

def main():
    # 创建保存图像的目录
    save_dir = "captured_images"
    os.makedirs(save_dir, exist_ok=True)
    # 打开默认摄像头(0表示默认摄像头)
    cap = cv2.VideoCapture(0)
    # 检查摄像头是否成功打开
    if not cap.isOpened():
        print("无法打开摄像头,请检查设备连接")
        return
    # 设置摄像头分辨率
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
    # 保存图像的计数器
    save_count = 0
    print("操作说明:")
    print("1. 程序运行时将显示两个窗口:彩色图像和灰度图像")
    print("2. 按下 's' 键保存当前帧(彩色和灰度图像都会保存)")
    print("3. 按下 'q' 键退出程序")
    while True:
        # 读取一帧图像
        ret, frame = cap.read()
        # 检查是否成功读取图像
        if not ret:
            print("无法获取图像,程序退出")
            break
        # 转换为灰度图像
        gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 显示彩色图像
        cv2.imshow('Color Image', frame)
        # 显示灰度图像
        cv2.imshow('Gray Image', gray_frame)
        # 等待按键输入(1毫秒延迟)
        key = cv2.waitKey(1)
        # 按下 's' 键保存图像
        if key == ord('s'):
            # 生成带时间戳的文件名
            timestamp = time.strftime("%Y%m%d_%H%M%S")
            # 保存彩色图像
            color_filename = os.path.join(save_dir, f"color_{timestamp}_{save_count}.png")
            color_success = cv2.imwrite(color_filename, frame)
            # 保存灰度图像
            gray_filename = os.path.join(save_dir, f"gray_{timestamp}_{save_count}.png")
            gray_success = cv2.imwrite(gray_filename, gray_frame)
            if color_success and gray_success:
                print(f"图像已保存:\n  - {color_filename}\n  - {gray_filename}")
                save_count += 1
            else:
                print("保存图像失败,请检查路径权限")
        # 按下 'q' 键退出循环
        elif key == ord('q'):
            print("程序即将退出")
            break
    # 释放资源
    cap.release()
    cv2.destroyAllWindows()
    print("所有资源已释放")
if __name__ == "__main__":
    main()

        该程序基于 Python OpenCV 库,能调用电脑默认摄像头,先创建图像保存目录并初始化摄像头(设 1280×720 分辨率),再循环读取摄像头图像,将彩色帧转灰度帧后分别显示,支持按 “s” 键保存当前彩图与灰度图(文件名含时间戳和计数器)、按 “q” 键退出,退出时释放摄像头资源并关闭窗口。

三、实验结果与分析

运行该程序,可以成功得到彩色与灰色图像,示例图如下:

                   

结果分析

        对于功能的实现:程序可稳定调用默认摄像头,实时显示彩色与灰度双窗口图像,画面分辨率符合 1280×720 设置,按 “s” 键能成功将两类图像保存至指定目录,文件名通过时间戳 + 计数器确保唯一,按 “q” 键可正常退出并释放资源,核心的 “采集 — 转换 — 显示 — 保存” 功能均有效实现。

        对于图像质量与数据:保存的彩色图像遵循 OpenCV 默认 BGR 通道格式,灰度图像仅保留亮度信息,二者像素数据无明显失真,符合 NumPy 数组(彩色为三维、灰度为二维)的存储逻辑,验证了图像格式转换与编码保存的正确性。

        对于异常处理与稳定性:程序包含摄像头未打开、图像读取失败的判断逻辑,能及时输出提示;按键监听响应及时,无明显卡顿,多轮保存与退出操作后无资源占用残留,整体运行稳定。

四、个人收获与体会

        通过本次基于 OpenCV 的摄像头图像采集实验,我学习到了一下方面:

        一方面,我了解了 OpenCV 核心功能的应用逻辑,从cv2.VideoCapture初始化硬件设备、cap.read()逐帧采集图像,到cv2.cvtColor实现色彩空间转换、cv2.imwrite完成图像编码保存,清晰理解了 “硬件调用 — 数据处理 — 结果输出” 的完整技术链路,也加深了对彩色图像(三维 BGR 数组)与灰度图像(二维亮度数组)数据结构的认知。

        另一方面,我学会了将理论功能转化为实用程序,比如通过时间戳 + 计数器解决文件名重复问题、用os.makedirs处理目录创建异常、在循环中加入资源释放与按键监听逻辑,这些细节让我意识到编程需兼顾功能实现与稳定性,也培养了 “提前预判问题、主动优化体验” 的实践意识,为后续更复杂的图像处理(如目标检测、图像滤波)打下了扎实基础。

五、思考点

        本次实验是利用OpenCV对摄像头采集的到的视频信息进行图像的采集与保存处理,因此我思考如何将实时获取到的视频信息保存到本地,以及如何在获取到的视频上进行文字标注,例如,在对人像采集的视频中,当人物出现时,对人物进行实时的文字标注说明。进一步,是否可以在实时采集的视频中进行信息的识别,结合计算机视觉,机器学习对获取到的信息进行识别。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐