首页
  • GM-3568JHF
  • M4-R1
  • M5-R1
  • SC-3568HA
  • M-K1HSE
  • CF-NRS1
  • CF-CRA2
  • 1684XB-32T
  • 1684X-416T
  • RDK-X5
  • RDK-S100
  • C-3568BQ
  • C-3588LQ
  • GC-3568JBAF
  • C-K1BA
商城
  • English
  • 简体中文
首页
  • GM-3568JHF
  • M4-R1
  • M5-R1
  • SC-3568HA
  • M-K1HSE
  • CF-NRS1
  • CF-CRA2
  • 1684XB-32T
  • 1684X-416T
  • RDK-X5
  • RDK-S100
  • C-3568BQ
  • C-3588LQ
  • GC-3568JBAF
  • C-K1BA
商城
  • English
  • 简体中文
  • 1684XB-32T

    • 一、简介

      • AIBOX-1684XB-32简介
    • 二、快速上手

      • 初次使用
      • 网络配置
      • 磁盘使用
      • 内存分配
      • 风扇策略
      • 固件升级
      • 交叉编译
      • 模型量化
    • 三、应用开发

      • 开发简介

        • Sophgo SDK开发
        • SOPHON-DEMO简介
      • 大语言模型

        • 部署Llama3示例
        • Sophon LLM_api_server开发
        • 部署MiniCPM-V-2_6
        • Qwen-2-5-VL图片视频识别DEMO
        • Qwen3-chat-DEMO
        • Qwen3-Qwen Agent-MCP开发
        • Qwen3-langchain-AI Agent
      • 深度学习

        • ResNet(图像分类)
        • LPRNet(车牌识别)
        • SAM(通用图像分割基础模型)
        • YOLOv5(目标检测)
        • OpenPose(人体关键点检测)
        • PP-OCR(光学字符识别)
    • 四、资料下载

      • 资料下载
  • 1684X-416T

    • 简介

      • AIBOX-1684X-416简介
    • Demo简单操作指引

      • shimeta智慧监控demo的简单使用说明
  • RDK-X5

    • 简介

      • RDK-X5 硬件简介
    • 快速开始

      • RDK-X5 快速开始
    • 应用开发

      • AI在线模型开发

        • 实验01-接入火山引擎豆包 AI
        • 实验02-图片分析
        • 实验03-多模态视觉分析定位
        • 实验04-多模态图文比较分析
        • 实验05-多模态文档表格分析
        • 实验06-摄像头运用-AI视觉分析
      • 大语言模型

        • 实验01-语音识别
        • 实验02-语音对话
        • 实验03-多模态图片分析-语音对话
        • 实验04-多模态图片比较-语音对话
        • 实验05-多模态文档分析-语音对话
        • 实验06-多模态视觉运用-语音对话
      • ROS2基础开发

        • 实验01-搭建环境
        • 实验02-工作包的创建及编译
        • 实验03-运行 ROS2 话题通信节点
        • 实验04-ROS2 相机应用
      • 40pin-IO开发

        • 实验01-GPIO 输出(LED闪烁)
        • 实验02-GPIO 输入
        • 实验03-按键控制 LED
        • 实验04-PWM 输出
        • 实验05-串口输出
        • 实验06-IIC 实验
        • 实验07-SPI 实验
      • USB模块开发使用

        • 实验01-USB 语音模块使用
        • 实验02-声源定位模块使用
      • 机器视觉技术实战

        • 实验01-打开 USB 摄像头
        • 实验02-颜色识别检测
        • 实验03-手势识别体验
        • 实验04-YOLOv5物体检测
  • RDK-S100

    • 简介

      • RDK-S100 硬件简介
    • 快速开始

      • RDK-S100 硬件简介
    • 应用开发

      • AI在线模型开发

        • 实验01-接入火山引擎豆包 AI
        • 实验02-图片分析
        • 实验03-多模态视觉分析定位
        • 实验04-多模态图文比较分析
        • 实验05-多模态文档表格分析
        • 实验06-摄像头运用-AI视觉分析
      • 大语言模型

        • 实验01-语音识别
        • 实验02-语音对话
        • 实验03-多模态图片分析-语音对话
        • 实验04-多模态图片比较-语音对话
        • 实验05-多模态文档分析-语音对话
        • 实验06-多模态视觉运用-语音对话
      • ROS2基础开发

        • 实验01-搭建环境
        • 实验02-工作包的创建及编译
        • 实验03-运行 ROS2 话题通信节点
        • 实验04-ROS2 相机应用
      • 40pin-IO开发

        • 实验01-GPIO 输出(LED闪烁)
        • 实验02-GPIO 输入
        • 实验03-按键控制 LED
        • 实验04-PWM 输出
        • 实验05-串口输出
        • 实验06-IIC 实验
        • 实验07-SPI 实验
      • USB模块开发使用

        • 实验01-USB 语音模块使用
        • 实验02-声源定位模块使用
      • 机器视觉技术实战

        • 实验01-打开 USB 摄像头
        • 实验02-图像处理基础
        • 实验03-目标检测
        • 实验04-图像分割

机器视觉技术开发

实验1-打开 USB 摄像头

  1. cd OPENCV #打开OPENCV功能包
  2. sudo python3 ./camera_display.py #运行py文件

终端显示:

TOOL

此时Linux系统上会显示摄像头实时画面,我们需要在窗口焦点下测试按键,效果如下:

TOOLTOOL
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
摄像头读取程序
功能:打开摄像头并实时显示画面,支持多种功能
"""

import cv2
import numpy as np
import sys
import os
import time
import argparse
from datetime import datetime

def main():
    """
    主函数:打开摄像头并显示实时画面
    """
    # 解析命令行参数
    parser = argparse.ArgumentParser(description='摄像头实时显示程序')
    parser.add_argument('--width', type=int, default=1280, help='显示窗口宽度')
    parser.add_argument('--height', type=int, default=720, help='显示窗口高度')
    args = parser.parse_args()

    # 打开默认摄像头(通常是0,如果有多个摄像头可以尝试1,2等)
    cap = cv2.VideoCapture(0)

    # 检查摄像头是否成功打开
    if not cap.isOpened():
        print("错误:无法打开摄像头")
        sys.exit(1)

    # 设置摄像头分辨率
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, args.width)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, args.height)

    # 创建一个可调整大小的窗口
    cv2.namedWindow('摄像头', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('摄像头', args.width, args.height)

    print("摄像头已成功打开")
    print(f"窗口大小设置为: {args.width}x{args.height}")
    print("按键说明:")
    print("- 'q':退出程序")
    print("- 'g':切换灰度/彩色模式")
    print("- 'b':应用模糊效果")
    print("- 'e':应用边缘检测")
    print("- 'n':恢复正常模式")
    print("- 's':保存当前帧为图片")
    print("- '+':增大窗口")
    print("- '-':缩小窗口")

    # 默认设置
    gray_mode = False
    blur_mode = False
    edge_mode = False
    window_width = args.width
    window_height = args.height

    # 创建保存图像的目录
    save_dir = "captured_images"
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)

    # 循环读取摄像头画面
    while True:
        # 读取一帧图像
        ret, frame = cap.read()

        # 如果读取失败,退出循环
        if not ret:
            print("错误:无法读取摄像头画面")
            break

        # 处理图像
        if gray_mode:
            # 转换为灰度图
            processed_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            # 转回三通道以便显示文字
            display_frame = cv2.cvtColor(processed_frame, cv2.COLOR_GRAY2BGR)
            mode_text = "Gray Mode"
        else:
            processed_frame = frame.copy()
            display_frame = processed_frame
            mode_text = "Color Mode"

        # 应用额外效果
        if blur_mode:
            processed_frame = cv2.GaussianBlur(processed_frame, (15, 15), 0)
            display_frame = processed_frame
            mode_text += " + Blur"

        if edge_mode and gray_mode:
            # 边缘检测需要灰度图像
            processed_frame = cv2.Canny(processed_frame, 100, 200)
            # 转回三通道以便显示文字
            display_frame = cv2.cvtColor(processed_frame, cv2.COLOR_GRAY2BGR)
            mode_text += " + Edge"
        elif edge_mode:
            # 如果不是灰度模式,先转换为灰度再进行边缘检测
            edges = cv2.Canny(cv2.cvtColor(processed_frame, cv2.COLOR_BGR2GRAY), 100, 200)
            # 将边缘叠加到原图上
            display_frame = processed_frame.copy()
            display_frame[edges > 0] = [0, 255, 255]  # 黄色边缘
            mode_text += " + Edge"

        # 添加模式文字
        cv2.putText(display_frame, mode_text, (10, 30),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2)

        # 显示图像
        cv2.imshow('摄像头', display_frame)

        # 等待按键,如果是'q'则退出
        key = cv2.waitKey(1) & 0xFF
        if key == ord('q'):
            print("用户退出程序")
            break
        elif key == ord('g'):
            # 切换灰度/彩色模式
            gray_mode = not gray_mode
            print("切换到", "灰度模式" if gray_mode else "彩色模式")
        elif key == ord('b'):
            # 切换模糊效果
            blur_mode = not blur_mode
            print("模糊效果:", "开启" if blur_mode else "关闭")
        elif key == ord('e'):
            # 切换边缘检测
            edge_mode = not edge_mode
            print("边缘检测:", "开启" if edge_mode else "关闭")
        elif key == ord('n'):
            # 恢复正常模式
            gray_mode = False
            blur_mode = False
            edge_mode = False
            print("已恢复正常模式")
        elif key == ord('s'):
            # 保存当前帧
            timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
            filename = os.path.join(save_dir, f"capture_{timestamp}.jpg")
            cv2.imwrite(filename, frame)
            print(f"图像已保存: {filename}")

    # 释放摄像头资源
    cap.release()
    # 关闭所有OpenCV窗口
    cv2.destroyAllWindows()
    print("程序已退出")

if __name__ == "__main__":
    try:
        main()
    except Exception as e:
        print(f"程序发生错误: {e}")
        sys.exit(1)
在 GitHub 上编辑此页
上次更新:
贡献者: wuziqing
Next
实验02-颜色识别检测