OpenCV 入门知识:图片展示、摄像头捕获、控制鼠标及其 Trackbar(滑动条)生成!

在这里插入图片描述
在这里插入图片描述

😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️
💥个人主页:🔥🔥🔥大魔王🔥🔥🔥
💥所属专栏:🔥魔王的修炼之路–Computer vision🔥
如果你觉得这篇文章对你有帮助,请在文章结尾处留下你的点赞👍和关注💖,支持一下博主。同时记得收藏✨这篇文章,方便以后重新阅读。

文章目录

显示图片(waitKey(),GUI 事件)

import cv2img = cv2.imread('D:/Zachary/6_OpenCV/images/1.png')cv2.namedWindow("new", cv2.WINDOW_NORMAL)
cv2.resizeWindow("new", 480, 360)
cv2.imshow('new', img)key = cv2.waitKey(0) # 单位毫秒,0 时不会跳过等待输入,在显示窗口时一般都要使用该函数。
# 这不用 key 接收,因为不作比较,想一直显示图片的话直接堵塞就行,参数为 0。cv2.destroyAllWindows()
  • imshow 第二个参数是图片对象,不能是图片路径。

  • 记得最后释放窗口资源。

  • cv2.waitKey(time),单位是毫秒,0 时不会跳过,等待输入,所以图片窗口才不会闪关。当为其他时间时,表示该函数等待的毫秒数。

  • cv2.waitKey(time) 返回的数据类型:返回按下键的 ASCII 值,int 类型。

  • waitKey():是 OpenCV 处理 GUI 事件的唯一入口。

  • GUI 事件:在图形界面上的操作动作(比如点击、拖动、输入等),程序会 ”监听“ 这些动作并 ”响应“ 他们。

  • GUI 事件处理流程:

    1. 用户操作(点击、输入、拖动…)
    2. 操作触发事件
    3. 程序注册的回调函数被调用
    4. 程序根据事件做出响应
  • OpenCV 中的几个 GUI 事件相关函数:

    函数名作用
    cv2.waitKey()等待键盘输入,返回按键的编码
    cv2.setMouseCallback()注册鼠标事件回调
    cv2.createTrackbar()添加滑动条控件并监听滑动变化
    cv2.namedWindow() + cv2.imshow()创建可响应事件的窗口

保存图片

import cv2cv2.namedWindow("win", cv2.WINDOW_NORMAL)
cv2.resizeWindow("win", 480, 360)
img = cv2.imread("../images/1.png")
cv2.imshow("win", img)key = 0
while key != ord('q'):key & 0xff = cv2.waitKey(0) # 单位毫秒,0 时不会跳过等待输入,在显示窗口时一般都要使用该函数。单位毫秒。 key & 0xff,处理高字节问题。if key == ord('d'):cv2.imwrite("../images/2.png", img)print("保存完成")breakelse:print(key)cv2.destroyAllWindows()
  • key 作比较时,最好 & 0xff ,处理高字节问题。
  • ord 函数:返回字符对应的 ASCII 值。
  • ord -> ordinal,序号的意思,因为 ASCII 是给字符排序号作为 ASCII 值。
  • 所以要通过 ord 转换才能进行比较,因为 python 没有字符,底层不会将单个字符看成对应的 ASCII(int 类型),就算是单个字符 python 也会看作字符串,所以没有对应的数值。

显示摄像头并保存

# 查看电脑摄像头分辨率# 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 = cap.get(cv2.CAP_PROP_FPS)  # 获取摄像头帧率
# if fps <= 0: fps = 30.0  # 默认30FPS# print(f"摄像头分辨率: {width}x{height}, 帧率: {fps}")# 引入模块
import cv2# 创建VedioWriter,为了写多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'MJPG') # 写入的多媒体文件的格式
vw = cv2.VideoWriter('../test/out.mp4', fourcc, 25, (640,480)) # 与摄像头分辨率不一样,读取出来的无法播放# 创建窗口
cv2.namedWindow("win", cv2.WINDOW_NORMAL)# 调整窗口大小
cv2.resizeWindow("win", 640, 480)# 获取视频设备,创建连接,初始化资源后(摄像头与硬件之间)返回一个对象给cap,cap是一个持久性对象,创立连接后维持与摄像头的连接。
cap = cv2.VideoCapture(0)while cap.isOpened():# 检查摄像头实时更新的数据,看它是否还打开# 接收其返回的参数,第一为读取成功 True,失败 False,第二个为读取到的帧ret, frame = cap.read()# 每次都读的这个cap,不过cap这个对象内部状态会随着每次读取而更新。# 展示帧是否读取正确if ret == True:# 展示窗口,在同一个窗口展示不同的帧,就会形成视频cv2.imshow("win", frame)# 重新将窗口设置为指定大小cv2.resizeWindow("win", 640, 480) # 这点有点不理解# 将帧写入多媒体文件vw.write(frame)elif ret == False:breakkey = cv2.waitKey(1)if key & 0xff == ord('q'):break# 释放 VideoCapture
cap.release()# 释放 VideoWriter
vw.release()# 释放窗口
cv2.destroyAllWindows()
  • 没什么说的,注释的很详细。

控制鼠标

import cv2
import numpy as np # 重命名为 np# 鼠标回调函数
def mouse_callback(event, x, y, flags, userdata):print(event, x, y, flags, userdata)# 创建窗口
cv2.namedWindow("mouse", cv2.WINDOW_NORMAL)
cv2.resizeWindow("mouse", 640, 480)# 设置鼠标回调
cv2.setMouseCallback("mouse", mouse_callback, "123") # 第一个参数为窗口名,第二个参数为回调函数,第三个参数为回调函数的最后一个参数,即上面函数的 userdata# 显示窗口和背景
img = np.zeros((480, 640, 3), np.uint8) # 调整窗口是 长、宽,这个参数顺序是 宽,长。还有三通道的顺序,是 BGR,和 RGB 是反着的。
# 参数
# 第一个,设置一个分辨率,(第一个为高,第二个为宽,BGR组数),这个函数默认bgr都为0,所以显示出来为黑色。 bgr组数 3 是因为图片的色彩就是三个通道
# 第二个参数是像素类型。数据类型是 uint8,即 0~255 的整数,图像数据通常用这个。
img[:] = (0, 0, 255)  # 红色(注意:OpenCV 是 BGR 不是 RGB)while True:cv2.imshow("mouse", img) # 因为这个代码显示的是图片,所以可以不用循环,只控制 cv2.waitKey() 参数为 0 就行。key = cv2.waitKey(1)if key & 0xFF == ord('q'):breakcv2.destroyAllWindows()
  • cv2.imshow(“mouse”, img),因为这个代码显示的是图片,所以可以不用循环,只控制 cv2.waitKey() 参数为 0 就行。但是如果用了循环,那么显示窗口和 cv2.waitKey() 都要放在循环,因为如果想要画面会变,需要不断地刷新窗口才行,这段代码的话没必要,因为就是黑的,然后 cv2.waitKey() 也要在循环,不然窗口就显示不出来了。
  • OpenCV 颜色三通道是 BGR,和 RGB 正好反着的。
目的是否必须循环调用 imshow()
仅静态显示一张图片❌ 只用一次就够
有窗口交互(鼠标、键盘)✅ 必须每帧都 imshow()
播放视频或动画✅ 必须每帧都 imshow()

Trackbar(控件:滑动条)

import cv2
import numpy as np# 创建窗口
cv2.namedWindow("trackbar", cv2.WINDOW_NORMAL)cv2.resizeWindow("trackbar", 640, 480)# 回调函数
def callback(pos): # 虽然不用回调函数,但要写一个参数,因为改变滑动条时会底层会调用 crrateTrackbar() 的回调函数,并传递当前值,所以需要有参数接收。pass# 创建 trackbar:trackbar 是 滑动条的意思
cv2.createTrackbar("R", "trackbar", 0, 255, callback)
cv2.createTrackbar("G", "trackbar", 0, 255, callback)
cv2.createTrackbar("B", "trackbar", 0, 255, callback)while True: # 获取当前 trackbar 的值:# 获取滑动条当前位置:不会再去调用回调函数,它只是读取滑动条当前的位置,不会触发任何事件,也不会执行回调函数。r = cv2.getTrackbarPos("R", "trackbar")g = cv2.getTrackbarPos("G", "trackbar")b = cv2.getTrackbarPos("B", "trackbar")# 创建图片img = np.zeros((360, 480, 3), np.uint8)# 改变图片颜色img[:] = [b, g, r]cv2.imshow("trackbar", img)key = cv2.waitKey(10)if key & 0xff == ord('q'):breakcv2.destroyAllWindows()   
  • 博主长期更新,博主的目标是不断提升阅读体验和内容质量,如果你喜欢博主的文章,请点个赞或者关注博主支持一波,我会更加努力的为你呈现精彩的内容。

🌈专栏推荐
😈魔王的修炼之路–C语言
😈魔王的修炼之路–数据结构
😈魔王的修炼之路–C++
😈魔王的修炼之路–QT
😈魔王的修炼之路–算法
😈魔王的修炼之路–力扣
😈魔王的修炼之路–牛客
😈魔王的修炼之路–剑指offer
😈魔王的修炼之路–Linux
😈魔王的修炼之路–Computer vision
更新不易,希望得到友友的三连支持一波。收藏这篇文章,意味着你将永久拥有它,无论何时何地,都可以立即找到重新阅读;关注博主,意味着无论何时何地,博主将永久和你一起学习进步,为你带来有价值的内容。

请添加图片描述

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

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

相关文章

Elasticsearch是什么?

Elasticsearch&#xff08;简称ES&#xff09;是一种基于Lucene的分布式搜索引擎&#xff0c;广泛应用于大数据、日志分析、全文搜索等场景。它的核心是提供高效、可扩展的搜索和分析能力。ES 提供了强大的全文搜索、聚合分析、数据可视化等功能&#xff0c;可以用来快速地对海…

(Arxiv-2025)OmniGen2:通向先进多模态生成的探索

OmniGen2&#xff1a;通向先进多模态生成的探索 paper title&#xff1a;OmniGen2: Exploration to Advanced Multimodal Generation paper是BAAI发布在Arxiv 2025的工作 Code:链接 Abstract 在本研究中&#xff0c;我们提出了 OmniGen2&#xff0c;这是一种多功能、开源的生成…

期权到期会对大盘有什么影响?

本文主要介绍期权到期会对大盘有什么影响&#xff1f;期权到期对大盘的影响主要体现在以下几个方面&#xff0c;但整体影响通常有限且短期&#xff0c;具体效果需结合市场环境、期权规模及行权价位置综合判断。期权到期会对大盘有什么影响&#xff1f;1. 市场流动性波动到期日效…

【LeetCode刷题指南】--随机链表的复制

&#x1f525;个人主页&#xff1a;草莓熊Lotso &#x1f3ac;作者简介&#xff1a;C研发方向学习者 &#x1f4d6;个人专栏&#xff1a; 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言&#xff1a;生活是默默的坚持&#xff0c;毅力是永久的…

系统学习算法:专题十四 链表

前提知识&#xff1a;1.画图&#xff0c;数据结构相关的题&#xff0c;画图必不可少&#xff0c;只要能画出来&#xff0c;那么后面的代码就很容易能写出来&#xff0c;因为将抽象的数据结构转换为直观的图画2.引入虚拟头结点&#xff0c;也叫哨兵位&#xff0c;能够避免考虑很…

零基础学后端-PHP语言(第一期-PHP环境配置)

从本期开始&#xff0c;我们学习PHP&#xff0c;但是我们要先配置PHP环境 PHP官网链接&#xff1a;PHP For Windows: Binaries and sources Releases 我们可以看到有以下资源 可以看到有很多php的版本&#xff0c;有Non Thread Safe和Thread Safe&#xff0c;还有zip&#xf…

C++ primer知识点总结

《C Primer》系统学习指南&#xff1a;从C到C的平滑过渡根据你提供的《C Primer》目录和你的需求&#xff08;C语言背景转C&#xff0c;侧重网络编程&#xff09;&#xff0c;我将为你制定一个全面的学习计划&#xff0c;包含知识点详解、C/C对比、实战案例和分阶段项目练习。第…

异构融合 4A:重构高性能计算与复杂场景分析的安全与效率边界

当全球数据量以每两年翻一番的速度爆炸式增长&#xff0c;高性能计算&#xff08;HPC&#xff09;与复杂场景分析正成为破解气候预测、基因测序、金融风控等世界级难题的关键引擎。但异构计算环境的碎片化、多系统协同的复杂性、数据流动的安全风险&#xff0c;正在形成制约行业…

【华为机试】240. 搜索二维矩阵 II

文章目录240. 搜索二维矩阵 II描述示例 1示例 2提示解题思路核心分析问题转化算法实现方法1&#xff1a;右上角开始搜索&#xff08;推荐&#xff09;方法2&#xff1a;逐行二分查找方法3&#xff1a;分治法方法4&#xff1a;左下角开始搜索复杂度分析核心要点数学证明右上角搜…

疯狂星期四文案网第16天运营日记

网站运营第16天&#xff0c;点击观站&#xff1a; 疯狂星期四 crazy-thursday.com 全网最全的疯狂星期四文案网站 运营报告 昨日访问量 昨日30多ip, 今天也差不多&#xff0c;同步上周下降了一些&#xff0c;感觉明天疯狂星期四要少很多了&#xff0c;记得上周四700多ip&…

Linux系统基础入门与配置指南

Linux基本概述与配置 一、我们为什么使用Linux&#xff08;Linux的优点&#xff09;开源与自由 免费&#xff1a; 无需支付许可费用&#xff0c;任何人都可以自由下载、安装和使用。源代码开放&#xff1a; 任何人都可以查看、修改和分发源代码。这带来了极高的透明度、安全性和…

如何删除VSCode Marketplace中的publisher

网页上并没有提供删除的按钮&#xff0c;需要通过命令的形式删除。 vsce delete-publisher [要删除的名字]# 键入token # y 确认这里的token是之前在Azure DevOps中创建的token&#xff0c;忘了的话可以重建一个 刷新网页看一下 成功删除了。

Windows安装git教程(图文版)

Git 是一个分布式版本控制系统&#xff0c;用于跟踪文件的变化&#xff0c;特别是在软件开发中。它使得多个开发者可以在不同的机器上并行工作&#xff0c;然后将他们的改动合并在一起。是在开发过程中&#xff0c;经常会用到的一个工具。本章教程&#xff0c;主要介绍Windows上…

Remote Framebuffer Protocol (RFB) 详解

RFC 6143 规范文档&#xff1a;The Remote Framebuffer Protocol 文章目录1. 引言2. 初始连接流程2.1 TCP连接建立2.2 协议版本协商2.3 安全握手3. 显示协议机制3.1 核心概念3.2 像素格式4. 输入协议4.1 键盘事件(KeyEvent)4.2 鼠标事件(PointerEvent)5. 协议消息详解5.1 握手消…

从 DeepSeek-V3 到 Kimi K2:八种现代大语言模型架构设计

编译&#xff1a;青稞社区Kimi 原文&#xff1a;https://magazine.sebastianraschka.com/p/the-big-llm-architecture-comparison 首发&#xff1a;https://mp.weixin.qq.com/s/lSM2jk1UxJVz1WllWYQ4aQ 自原始 GPT 架构开发以来已经过去了七年。乍一看&#xff0c;从 2019 年的…

linux驱动开发笔记--GPIO驱动开发

目录 前言 一、设备树配置 二、驱动编写 三、用户空间测试 总结 前言 开发平台&#xff1a;全志A133&#xff0c;开发环境&#xff1a;linux4.9andrio10&#xff0c;开发板&#xff1a;HelperBoard A133_V2.5。 一、设备树配置 打开板级设备树配置文件&#xff0c;路径&a…

腾讯iOA:企业软件合规与安全的免费守护者

人们眼中的天才之所以卓越非凡&#xff0c;并非天资超人一等而是付出了持续不断的努力。1万小时的锤炼是任何人从平凡变成超凡的必要条件。———— 马尔科姆格拉德威尔 目录 一、为什么要使用腾讯iOA&#xff1f; 二、中小企业软件合规痛点 三、腾讯iOA解决方案 3.1 核心技…

C#定时任务实战指南:从基础Timer到Hangfire高级应用

高效管理后台作业&#xff0c;让定时任务成为应用的可靠引擎 在C#应用开发中&#xff0c;定时任务是实现数据同步、报表生成、系统维护等后台作业的核心技术。本文将深入探讨C#生态中主流的定时任务解决方案&#xff0c;从基础的内置Timer到强大的Quartz.NET和Hangfire框架&…

软件开发、项目开发基本步骤

• 立项阶段&#xff1a;项目定义、需求收集与分析、可行性分析、风险评估与规划、项目团队组建、制定项目计划、获取批准与支持。• 需求评审与分析&#xff1a;◦ 项目团队&#xff08;包括产品经理、开发人员、测试人员等&#xff09;共同参与&#xff0c;明确项目的目标、功…

慢 SQL接口性能优化实战

在对某电商项目进行接口性能压测时&#xff0c;发现 /product/search 接口响应缓慢&#xff0c;存在明显性能瓶颈。通过慢查询日志排查和 SQL 优化&#xff0c;最终实现了接口响应速度的显著提升。本文完整还原此次优化过程&#xff0c;特别强调操作步骤和问题分析过程&#xf…