2024-12-03OpenCV图片处理基础

news2024/12/27 5:18:27

OpenCV图片处理基础

OpenCV的视频教学:https://www.bilibili.com/video/BV14P411D7MH


1-OpenCV摄像头读取

OpenCV使用摄像头读取图片帧,点击S保存当前帧到指定文件夹,点击Q关闭窗口,点击其他按钮打印按钮的值

要实现这个功能,你需要使用OpenCV的VideoCapture类来捕获摄像头的视频流,并使用cv2.waitKey()来检测按键事件。以下是一个简单的Python脚本,演示了如何使用OpenCV从摄像头读取图片帧,并根据用户的按键操作来保存当前帧或关闭窗口:

import cv2
import os

# 指定保存图片的文件夹
save_folder = "saved_frames"
if not os.path.exists(save_folder):
    os.makedirs(save_folder)

# 打开摄像头,0表示默认的摄像头
cap = cv2.VideoCapture(0)

if not cap.isOpened():
    print("无法打开摄像头")
    exit()

frame_count = 0
while True:
    # 读取一帧图像
    ret, frame = cap.read()
    if not ret:
        print("无法读取视频帧")
        break

    # 显示图像
    cv2.imshow('Camera Feed', frame)

    # 等待按键事件,1表示等待1ms,0表示无限等待
    key = cv2.waitKey(1)

    # 's'键保存当前帧
    if key == ord('s') or key == ord('S'):
        frame_name = os.path.join(save_folder, f"frame_{frame_count}.jpg")
        cv2.imwrite(frame_name, frame)
        print(f"Frame saved as {frame_name}")
        frame_count += 1
    # 'q'键退出循环
    elif key == ord('q') or key == ord('Q'):
        break
    # 其他键打印值
    elif key != -1:
        print(f"Key pressed: {chr(key)}")

# 释放摄像头并关闭所有OpenCV窗口
cap.release()
cv2.destroyAllWindows()

这段代码首先检查摄像头是否可以打开,然后进入一个无限循环,在循环中不断地从摄像头读取图像帧并显示。cv2.waitKey(1)函数用于检测用户是否按下了键盘上的某个键。如果用户按下’S’或’s’,则当前帧会被保存到指定的文件夹中;如果用户按下’Q’或’q’,则退出循环;如果用户按下其他键,程序会打印出该键的字符值。最后,释放摄像头资源并关闭所有OpenCV窗口。


2-OpenCV本地文件读取

OpenCV使用本地文件读取图片帧,点击S保存当前帧到指定文件夹,点击Q关闭窗口,点击其他按钮打印按钮的值

如果你想要从本地视频文件读取帧,而不是实时从摄像头捕获,你可以稍微修改之前的代码,使用cv2.VideoCapture来打开视频文件。以下是一个示例代码,它读取本地视频文件,并允许用户通过按键操作来保存当前帧或关闭窗口:

import cv2
import os

# 指定保存图片的文件夹
save_folder = "saved_frames"
if not os.path.exists(save_folder):
    os.makedirs(save_folder)

# 替换为你的视频文件路径
video_file_path = 'path_to_your_video_file.mp4'

# 打开视频文件
cap = cv2.VideoCapture(video_file_path)

if not cap.isOpened():
    print("无法打开视频文件")
    exit()

frame_count = 0
while True:
    # 读取一帧图像
    ret, frame = cap.read()
    if not ret:
        print("视频播放完毕")
        break

    # 显示图像
    cv2.imshow('Video Feed', frame)

    # 等待按键事件,0表示无限等待直到有按键被按下
    key = cv2.waitKey(0)

    # 's'键保存当前帧
    if key == ord('s') or key == ord('S'):
        frame_name = os.path.join(save_folder, f"frame_{frame_count}.jpg")
        cv2.imwrite(frame_name, frame)
        print(f"Frame saved as {frame_name}")
        frame_count += 1
    # 'q'键退出循环
    elif key == ord('q') or key == ord('Q'):
        break
    # 其他键打印值
    elif key != -1:
        print(f"Key pressed: {chr(key)}")

# 释放视频文件并关闭所有OpenCV窗口
cap.release()
cv2.destroyAllWindows()

这段代码首先尝试打开指定的视频文件。如果成功,它将进入一个循环,在循环中逐帧读取视频内容并显示。和之前摄像头捕获的例子类似,它使用cv2.waitKey(0)来等待用户按键事件。如果用户按下’S’或’s’,当前帧将被保存到指定的文件夹中;如果用户按下’Q’或’q’,程序将退出循环;如果用户按下其他任意键,程序将打印出该键的字符值。最后,它释放视频文件资源并关闭所有OpenCV窗口。

请确保将video_file_path变量替换为你自己的视频文件路径。


3-OpenCV录制视频

OpenCV使用摄像头读取图片帧,录制到本地文件夹中,点击Q关闭窗口

要实现从摄像头读取视频帧并录制到本地文件的功能,你需要使用OpenCV的视频写入类VideoWriter。以下是一个示例代码,展示了如何从摄像头捕获视频帧并将其保存为一个视频文件,同时按’Q’键退出录制。

首先,请确保你已经安装了OpenCV库。如果没有安装,可以使用pip来安装:

pip install opencv-python

实现思路

  1. 打开摄像头以捕获视频流。
  2. 设置视频写入对象以保存录制的视频。
  3. 实时显示视频流,并检查用户输入。
  4. 如果用户按下’Q’键,则停止录制并退出程序。

解决方案代码

import cv2

# 打开摄像头
cap = cv2.VideoCapture(0)

if not cap.isOpened():
    print("无法打开摄像头")
    exit()

# 获取视频的基本信息
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))

# 定义视频编码器和输出文件
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, fps, (width, height))

try:
    while cap.isOpened():
        # 读取一帧
        ret, frame = cap.read()
        if not ret:
            print("无法读取视频帧")
            break

        # 写入帧到视频文件
        out.write(frame)

        # 显示帧-自定义需要  cv2.resizeWindow('Recording', 640,360)
        cv2.imshow('Recording', frame)

        # 检查是否按下'Q'键
        if cv2.waitKey(1) & 0xFF == ord('q'):
            print("录制结束")
            break
except Exception as e:
    print(f"发生错误: {e}")
finally:
    # 释放资源
    cap.release()
    out.release()
    cv2.destroyAllWindows()

代码解释

  1. 打开摄像头:使用cv2.VideoCapture(0)打开默认摄像头。
  2. 获取视频属性:获取帧的宽度、高度和FPS,这些信息用于设置输出视频的属性。
  3. 创建视频写入对象:使用cv2.VideoWriter创建一个对象来写入视频文件,指定编码器、文件名、FPS和帧大小。
  4. 读取和写入帧:在循环中,读取每一帧并写入视频文件,同时显示在窗口中。
  5. 检查按键:使用cv2.waitKey(1)检查是否有按键按下,如果按下’Q’键,则退出循环。
  6. 释放资源:确保释放摄像头和视频写入对象,并关闭所有OpenCV窗口。

4-OpenCV控制鼠标

OpenCV控制鼠标打印鼠标的移动轨迹

使用Python和OpenCV库来创建一个窗口并设置鼠标回调函数,可以按照以下步骤进行操作:

  1. 导入必要的库。
  2. 定义一个鼠标回调函数,它将接收鼠标事件、x和y坐标以及用户定义的数据。
  3. 创建一个窗口。
  4. 设置鼠标回调函数到这个窗口。
  5. 显示一个图像(或者保持窗口打开但不显示任何图像)。
  6. 等待用户按键来关闭程序。

下面是具体的实现代码:

import cv2
import numpy as np

# 鼠标回调函数
def mouse_callback(event, x, y, flags, param):
    # event: 鼠标的动作类型
    # x, y: 鼠标指针的位置坐标
    # flags: 按下的特殊键位信息
    # param: 用户传递的数据
    
    # 打印鼠标事件
    print(f"Event: {event}, X: {x}, Y: {y}")
    
    # 打印鼠标点击时的按钮信息
    if event == cv2.EVENT_LBUTTONDOWN:
        print("Left button of the mouse is clicked")
    elif event == cv2.EVENT_RBUTTONDOWN:
        print("Right button of the mouse is clicked")
    elif event == cv2.EVENT_MBUTTONDOWN:
        print("Middle button of the mouse is clicked")
    elif event == cv2.EVENT_MOUSEMOVE:
        print("Mouse is moving")


# 创建一个窗口(类比创建一个按钮绑定一个点击事件)
cv2.namedWindow('image')
# 将回调函数设置到窗口上
cv2.setMouseCallback('image', mouse_callback)

# 创建一个黑色图像
img = np.zeros((512, 512, 3), np.uint8)

# 显示图像
while True:
    cv2.imshow('image', img)
    if cv2.waitKey(20) & 0xFF == 27:  # 按ESC退出
        break

# 关闭所有窗口
cv2.destroyAllWindows()

在这段代码中:

  • mouse_callback 函数被定义用来处理鼠标事件。它会根据传入的 event 参数来判断发生了哪种类型的鼠标事件,并打印相应的消息。
  • 使用 cv2.namedWindow 创建了一个名为 ‘image’ 的窗口。
  • 使用 cv2.setMouseCallback 方法将 mouse_callback 函数绑定到 ‘image’ 窗口,这样每当在这个窗口内发生鼠标事件时,mouse_callback 函数就会被调用。
  • cv2.imshow 用于显示图像。这里我们创建了一个全黑的图像。
  • cv2.waitKey(20) 是用来等待用户按键的,这里设置为20毫秒,是为了让程序有足够的时间响应鼠标事件。如果按下了ESC键(ASCII码值为27),则跳出循环。
  • 最后,使用 cv2.destroyAllWindows 关闭所有由OpenCV创建的窗口。

运行这段代码后,当你在窗口中移动鼠标或点击鼠标时,控制台会输出相应的鼠标事件和位置信息。


4-OpenCV使用TrackBar

OpenCV创建3个TrackBar分别对应R/G/B,拖动TrackBar改变展示图片的颜色

要使用OpenCV创建三个Trackbar来分别控制图片的红(R)、绿(G)、蓝(B)三个颜色通道,你可以按照以下步骤编写代码:

  1. 导入必要的库。
  2. 加载一张图片。
  3. 创建一个窗口用于显示图片。
  4. 创建三个Trackbar,分别对应R、G、B通道。
  5. 定义一个回调函数,用于更新图片的颜色通道值。
  6. 在主循环中显示更新后的图片。

下面是一个完整的示例代码:

import cv2
import numpy as np

# 加载图片
img = cv2.imread('path_to_your_image.jpg')  # 替换为你的图片路径

# 创建一个窗口用于显示图片
cv2.namedWindow('image')

# 创建三个Trackbar,分别对应R、G、B通道
cv2.createTrackbar('R', 'image', 0, 255, lambda x: None)
cv2.createTrackbar('G', 'image', 0, 255, lambda x: None)
cv2.createTrackbar('B', 'image', 0, 255, lambda x: None)

# 初始化颜色通道值
r = 0
g = 0
b = 0

# 定义一个回调函数,用于更新图片的颜色通道值
def update_color(x):
    global r, g, b
    r = cv2.getTrackbarPos('R', 'image')
    g = cv2.getTrackbarPos('G', 'image')
    b = cv2.getTrackbarPos('B', 'image')
    new_img = np.zeros_like(img)
    new_img[:, :, 0] = r  # 更新R通道
    new_img[:, :, 1] = g  # 更新G通道
    new_img[:, :, 2] = b  # 更新B通道
    cv2.imshow('image', new_img)

# 初始调用一次回调函数以显示初始颜色
update_color(0)

# 主循环
while True:
    if cv2.waitKey(1) & 0xFF == ord('q'):  # 按'q'键退出
        break

# 释放所有资源
cv2.destroyAllWindows()

在这段代码中,我们首先加载了一张图片,并创建了一个窗口来显示它。然后,我们为R、G、B三个通道各创建了一个Trackbar,范围从0到255。我们定义了一个update_color函数,它会被Trackbar的回调自动调用,以更新图片的颜色通道值。在主循环中,我们检查是否有按键事件,如果用户按下了’q’键,则退出循环。

请确保将'path_to_your_image.jpg'替换为你的图片文件的实际路径。如果你没有图片文件,可以使用OpenCV自带的示例图片或者一张你本地的图片。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2254307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nginx中tcp_nodelay、types_hash_max_size都是什么配置?

nginx中tcp_nodelay、types_hash_max_size都是什么配置? 在 Nginx 中,tcp_nodelay 和 types_hash_max_size 是两个不同的配置项,它们分别与网络性能优化和 MIME 类型的管理相关。 1. tcp_nodelay 功能: 控制是否启用 TCP_NODELAY…

openGauss开源数据库实战十九

文章目录 任务十九 openGauss DML 语句测试任务目标实施步骤一、准备工作二、INSERT语句三、DELETE语句四、UPDATE语句五、清理工作 任务十九 openGauss DML 语句测试 任务目标 掌握DML语句的用法,包括INSERT语句、DELETE语句和UPDATE语句。 实施步骤 一、准备工作 使用Li…

400G智算网络助力知名自动驾驶企业算力训练提效

根据Gartner的最新趋势预测,自动驾驶技术正迅速发展,预计在未来几年内将带来显著的商业效益,特别是在决策智能和边缘人工智能领域。目前,一家领军企业正积极拥抱基于大模型的数字化转型之路,作为自动驾驶领域的佼佼者&…

openEuler 知:安装 GNOME 桌面

openEuler 标准版 ISO 镜像默认不带桌面安装方式,可以先用最小化方式安装系统,然后单独安装 GNOME 组来实现桌面化 dnf group install GNOME -y安装完后,将 systemd 默认 target 设置为 graphical.target systemctl set-default graphical.…

《ODIN: A Single Model for 2D and 3D Segmentation》CVPR2024

斯坦福和微软: 代码链接:ODIN: A Single Model For 2D and 3D Perception 论文链接:2401.02416 摘要 这篇论文介绍了ODIN(Omni-Dimensional INstance segmentation),一个能够同时处理2D RGB图像和3D点云…

多行为推荐-KBS 24|基于HyperGRU对比网络的短视频推荐多行为序列建模

论文:https://www.sciencedirect.com/science/article/abs/pii/S0950705124004751?via%3Dihub 关键词:短视频推荐,多行为推荐,对比学习,RNN 1 动机 这是我第一次看短视频推荐里涉及到多行为的论文,动机还…

企业网双核心交换机实现冗余和负载均衡(MSTP+VRRP)

MSTP(多生成树协议) 通过创建多个VLAN实例,将原有的STP、RSTP升级,避免单一VLAN阻塞后导致带宽的浪费,通过将VLAN数据与实例绑定,有效提升网络速率。 VRRP(虚拟路由冗余协议) 用…

图解RabbitMQ七种工作模式生产者消费者模型的补充

文章目录 1.消费者模型2.生产者-消费者模型注意事项2.1资源释放顺序问题2.2消费者的声明问题2.3虚拟机和用户的权限问题 3.七种工作模式3.1简单模式3.2工作模式3.3发布/订阅模式3.4路由模式3.5通配符模式3.6RPC通信3.7发布确认 1.消费者模型 之前学习的这个消息队列的快速上手…

制造业管理系统中ERP与MES的区别

在当今工业4.0的背景下,数字化管理已成为现代工厂不可或缺的一部分。在这一进程中,企业资源计划(ERP)系统和制造执行系统(MES)扮演着关键角色。尽管如此,许多工厂的管理者对于ERP和MES的理解仍存…

面向初学者的 Ansys Mechanical 中的接触建模

接触概述 Ansys Mechanical 中的接触建模是仿真结构不同部分在各种条件下如何相互作用的关键方面。它涉及定义表面的接触方式,即它们是接触、滑动还是分离。Ansys Mechanical 提供了广泛的接触选项来准确建模这些交互,包括粘合、摩擦和无分离接触。每个…

【C++指南】C++内存管理 深度解析

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《C指南》 期待您的关注 目录 引言 一、C 内存管理概述 二、C内存区域划分 三、C 内存管理方式 🍃1.自动内存管理…

聚类算法全面解析:理论与实践结合

聚类(Clustering)是数据挖掘和机器学习中一类重要的无监督学习方法,旨在将数据划分为多个类别,使得类别内部的数据相似度高,而类别之间的数据差异较大。聚类广泛应用于图像分割、市场分析、生物信息学、文本挖掘等领域…

Python 批量剪辑视频片头片尾工具

Python 批量剪辑视频片头片尾工具 1.简介: 批量剪辑片头片尾的软件,让你的视频创作事半功倍,视频剪辑处理完成后,用户可以在指定文件夹中查看已经剪切完片头片尾的视频‌。这些工具不仅适用于个人用户进行日常的视频编辑工作&am…

大模型分类1—按应用类型

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl根据应用领域,大模型可分为自然语言处理、计算机视觉和多模态大模型。 1. 自然语言处理大模型(NLP) 1.1 应用领域与技术架构 自然语言处理大模型(NLP)的应用领域广泛,包括但不限于文本分类、…

保姆级教程用vite创建vue3项目并初始化添加PrimeVue UI踩坑实录

文章目录 一、什么是PrimeVue二、详细教程1.添加PrimeVue2.配置main.js3.添加自动引入4.配置vite.config.js5.创建测试页面 一、什么是PrimeVue PrimeVue 是一个用于 Vue.js 3.x 开发的一款高质量、广受欢迎的 Web UI 组件库。 官网地址:https://primevue.org/ 二、…

Go的Gin比java的Springboot更加的开箱即用?

前言 隔壁组的云计算零零后女同事,后文简称 云女士 ,非说 Go 的 Gin 框架比 Springboot 更加的开箱即用,我心想在 Java 里面 Springboot 已经打遍天下无敌手,这份底蕴岂是 Gin 能比。 但是云女士突出一个执拗,非我要…

php 系统函数 记录

PHP intval() 函数 PHP函数介绍—array_key_exists(): 检查数组中是否存在特定键名 如何使用PHP中的parse_url函数解析URL PHP is_array()函数详解,PHP判断是否为数组 PHP函数介绍:in_array()函数 strpos定义和用法 strpos() 函数查找字符串在另一字符串…

关于Chrome自动同步书签的解决办法

前言 并不一定适用所有用户, 目前我在网上搜集了一些资料,也做了一些尝试。 就我个人总结的经验来讲,分享大家以下几种办法: 1.书签同步插件 点击如下🔗: Chrome书签同步https://bm.famend.cn/ …

matrixzq:基于ℤq的纯python矩阵库

1. 引言 当希望使用纯 Python 代码对整数 q 模矩阵进行操作,以演示使用学习误差 (Learning-With-Errors,LWE) 的基于格的加密方案的一些原理时,找到了 Thom Ives 编写的优秀代码“纯 Python 中无需 Numpy 或 Scipy 的 BASIC 线性代数工具”&…

深度学习笔记——模型压缩和优化技术(蒸馏、剪枝、量化)

本文详细介绍模型训练完成后的压缩和优化技术:蒸馏、剪枝、量化。 文章目录 1. 知识蒸馏 (Knowledge Distillation)基本概念工作流程关键技术类型应用场景优势与挑战优势挑战 总结 2. 权重剪枝 (Model Pruning)基本原理二分类1. 非结构化剪枝(Unstructur…