2024-12-03OpenCV图片处理基础
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
实现思路
- 打开摄像头以捕获视频流。
- 设置视频写入对象以保存录制的视频。
- 实时显示视频流,并检查用户输入。
- 如果用户按下’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()
代码解释
- 打开摄像头:使用
cv2.VideoCapture(0)
打开默认摄像头。 - 获取视频属性:获取帧的宽度、高度和FPS,这些信息用于设置输出视频的属性。
- 创建视频写入对象:使用
cv2.VideoWriter
创建一个对象来写入视频文件,指定编码器、文件名、FPS和帧大小。 - 读取和写入帧:在循环中,读取每一帧并写入视频文件,同时显示在窗口中。
- 检查按键:使用
cv2.waitKey(1)
检查是否有按键按下,如果按下’Q’键,则退出循环。 - 释放资源:确保释放摄像头和视频写入对象,并关闭所有OpenCV窗口。
4-OpenCV控制鼠标
OpenCV控制鼠标打印鼠标的移动轨迹
使用Python和OpenCV库来创建一个窗口并设置鼠标回调函数,可以按照以下步骤进行操作:
- 导入必要的库。
- 定义一个鼠标回调函数,它将接收鼠标事件、x和y坐标以及用户定义的数据。
- 创建一个窗口。
- 设置鼠标回调函数到这个窗口。
- 显示一个图像(或者保持窗口打开但不显示任何图像)。
- 等待用户按键来关闭程序。
下面是具体的实现代码:
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)三个颜色通道,你可以按照以下步骤编写代码:
- 导入必要的库。
- 加载一张图片。
- 创建一个窗口用于显示图片。
- 创建三个Trackbar,分别对应R、G、B通道。
- 定义一个回调函数,用于更新图片的颜色通道值。
- 在主循环中显示更新后的图片。
下面是一个完整的示例代码:
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, br = 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自带的示例图片或者一张你本地的图片。
相关文章:

2024-12-03OpenCV图片处理基础
OpenCV图片处理基础 OpenCV的视频教学:https://www.bilibili.com/video/BV14P411D7MH 1-OpenCV摄像头读取 OpenCV使用摄像头读取图片帧,点击S保存当前帧到指定文件夹,点击Q关闭窗口,点击其他按钮打印按钮的值 要实现这个功能&…...

本地部署开源趣味艺术画板Paint Board结合内网穿透跨网络多设备在线绘画
文章目录 前言1.关于Paint Board2.本地部署paint-board3.使用Paint Board4.cpolar内网穿透工具安装5.创建远程连接公网地址6.固定Paint Board公网地址 前言 大家好,是不是每次想要在电脑上画画时,都被那些笨重的专业绘图软件搞得头大如斗呢?…...
iOS、android的app备案超简单的公钥、md5获取方法
很多云商的备案平台,推荐下载一些工具来获取公钥和MD5,但是这些工具的跨平台性不是很好,安装也十分麻烦,安装的时候还需要设置国内源等等。 这里,其实有在线工具可以获取APP的公钥和MD5、SHA1值这些信息的。不需要安装…...
SpringCloud 与 SpringBoot版本对应关系,以及maven,jdk
目录 SpringCloud 与 SpringBoot各版本的对应关系 方式一 Learn 方式二 OverView SpringBoot与JDK、maven 容器等对应关系 SpringCloud 与 SpringBoot各版本的对应关系 SpringCloudSpringBootFinchley2.0.xFinchley.SR1Spring Boot >=2.0.3.RELEASE and <=2.0.9RELEAS…...
23种设计模式之装饰模式
目录 1. 简介2. 代码2.1 ABatterCake (抽象组件)2.2 BatterCake (具体组件)2.3 ADecorator (抽象装饰者)2.4 EggDecorator (具体装饰者)2.5 SausageDecorator(具体装饰者…...
HTMLHTML5革命:构建现代网页的终极指南 - 2. HTMLHTML5H5的区别
HTML&HTML5革命:构建现代网页的终极指南 2. HTML&HTML5&H5的区别 大家好,我是莫离老师 在上一节课,我们了解了HTML的重要性和前端开发的核心概念。 今天,我们将深入探讨 HTML、HTML5 和 H5 的区别,并重点…...

Django之ORM表操作
ORM表操作 1.ORM单表操作 首先想操作表的增删改查,需要先导入这个表,以之前创建的UserInfo表为例,在app下的views.py中导入 from app import modelsdef query(request):new_obj models.UserInfo(id1,name北北,bday2019-09-27,checked1,)new_obj.save()return Htt…...
python下几个淘宝、天猫、京东爬虫实例
以下是使用Python编写的针对淘宝、天猫、京东详情页的爬虫实例。请注意,这些实例仅供参考,实际使用时可能需要根据网站结构的变化进行调整,并且需要遵守各平台的爬虫协议和法律法规。 淘宝详情页爬虫实例 环境准备: Python 3.xSe…...

级联树结构TreeSelect和上级反查
接口返回结构 前端展示格式 前端组件 <template><div ><el-scrollbar height"70vh"><el-tree :data"deptOptions" :props"{ label: label, children: children }" :expand-on-click-node"false":filter-node-me…...

gradle下载慢解决方案2024 /12 /1android studio (Windows环境)
gradle下载慢解决方案2024 /12 /1 默认环境配置好了,环境配置和程序安装请出门右转 打开软件,点击右上角设置,找到如下设置页 选择本地安装并制定好你已经安装好的 gradle 应用保存即可 全局插件环境配置(新版本可以直接在设置中添加了) 找对应位置添加国内源并把前面的内置源…...
Python+OpenCV系列:GRAY BGR HSV
以下是 GRAY、BGR 和 HSV 三种色彩空间的对比,涵盖了它们的定义、特点、应用场景和优缺点: 1. 定义 GRAY: 灰度图像仅包含亮度信息,每个像素用一个值(通常在0到255之间)表示亮度(黑到白&#x…...
丢垃圾视频时间检测 -- 基于状态机的实现
文章目录 OverviewKey PointsPseudo-code Overview 需要考虑的方面 状态定义和转换条件时序约束空间约束异常处理 状态机的设计需要考虑的场景: 没有人人进入人携带垃圾人离开但垃圾留下垃圾消失异常情况(检测失败、多人多垃圾等) Key P…...

【QT】一个简单的串口通信小工具(QSerialPort实现)
目录 0.简介 1.展示结果 1)UI界面: 2)SSCOM(模拟下位机收发): 3)VSPD虚拟串口驱动(连接上位机和下位机的串口): 4)实际收发消息效果及视频演…...

24/12/5 算法笔记<强化学习> doubleDQN,duelingDQN
我们前面了解了DQN网络的一些知识,然而DQN还有一些改进的方法,比如doubleDQN和duelingDQN,我们先来将一下doubleDQN和DQN. 先来对比一下 单一网络 vs. 双重网络 DQN:是一个深度神经网络来估计每个动作的Q值 DDQN:使用两个独立的深度神经网络…...
道可云人工智能元宇宙每日资讯|全国工商联人工智能委员会成立会议在南京举办
道可云元宇宙每日简报(2024年12月5日)讯,今日元宇宙新鲜事有: 全国工商联人工智能委员会成立会议在南京举办 全国工商联人工智能委员会成立会议日前在江苏省南京市举办。中央统战部副部长、全国工商联党组书记沈莹出席会议并讲话…...

MySQL数据库(2)-检查安装与密码重置
1. 数据库下载安装 下载地址:MySQL :: Download MySQL Community Server 2. My.ini配置文件 my.ini 文件通常在MySQL安装过程中自动创建, 并且可以根据需要进行编辑以调整服务器的行为。 3. 配置环境变量 4. 查询版本号 查询版本号:mysql…...
C# 13 中的新增功能
C# 12 中的新增功能C# 11 中的新增功能C# 10 中的新增功能C# 9.0 中的新增功能C# 8.0 中的新增功能C#7.0中有哪些新特性?C#6.0中10大新特性的应用和总结C# 5.0五大新特性 将C#语言版本升级为预览版 C# 13 包括一些新增功能。 可以使用最新的 Visual Stu…...

视频自学笔记
一、视频技术基本框架 二、视频信号分类 2.1信号形式 2.1.1模拟视频 模拟视频是指由连续的模拟信号组成的视频图像,以前所接触的电影、电视都是模拟信号,之所以将它们称为模拟信号,是因为它们模拟了表示声音、图像信息的物理量。摄像机是获…...

easyexcel 导出日期格式化
1.旧版本 在新的版本中formate已经被打上废弃标记。那么不推荐使用这种方式。 2.推荐方式 推荐使用另外一种方式【 Converter 】代码如下,例如需要格式化到毫秒【yyyy-MM-dd HH:mm:ss SSS】级别 创建一个公共Converter import com.alibaba.excel.converters.Conv…...

02-开发环境搭建
02-开发环境搭建 鸿蒙开发环境的准备主要分为以下环节: 注册开发者实名认证创建应用下载安装开发工具新建工程 注册开发者 在华为开发者联盟网站上,注册成为开发者,并完成实名认证。 打开华为开发者联盟官网,点击“注册”进入…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...