当前位置: 首页 > news >正文

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

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

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

文章目录

  • 显示图片(waitKey(),GUI 事件)
  • 保存图片
  • 显示摄像头并保存
  • 控制鼠标
  • Trackbar(控件:滑动条)

显示图片(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 时不会跳过等待输入,在显示窗口时一般都要使用该函数。单位毫秒。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 = cv2.waitKey(0) # 单位毫秒,0 时不会跳过等待输入,在显示窗口时一般都要使用该函数。单位毫秒。if key == ord('d'):cv2.imwrite("../images/2.png", img)print("保存完成")breakelse:print(key)cv2.destroyAllWindows()
  • ord 函数:返回字符对应的 ASCII 值。
  • ord -> ordinal,序号的意思,因为 ASCII 是给字符排序号作为 ASCII 值。
  • cv2.waitKey():返回按下的字符对应的 ASCII 值。
  • 所以要通过 ord 转换才能进行比较,因为 python 没有字符,底层不会将单个字符看成对应的 ASCII(int 类型),就算是单个字符 python 也会看作字符串,所以没有对应的数值。

显示摄像头并保存

# 引入模块
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 == 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.lryc.cn/news/593985.html

相关文章:

  • Ubuntu 24.04 设置静态 IP 的方法
  • Linux操作系统之线程(四):线程控制
  • HarmonyOS 启动提速秘籍:懒加载全链路实战解析
  • 反序列化漏洞4-Thinkphp5.4靶场安装及Thinkphp反序列化漏洞任意文件删除演示
  • 讲座|人形机器人多姿态站起控制HoST及宇树G1部署
  • python学智能算法(二十六)|SVM-拉格朗日函数构造
  • 什么是 ELK/Grafana
  • C#.NET EFCore.BulkExtensions 扩展详解
  • 手写tomcat
  • LINUX720 SWAP扩容;新增逻辑卷;逻辑卷扩容;数据库迁移;gdisk
  • DAY 20 奇异值分解(SVD)
  • RocketMQ核心编程模型
  • 咨询进阶——解读业务流程优化与重组【附全文阅读】
  • 5.2.4 指令执行过程
  • 【原创】微信小程序添加TDesign组件
  • ChatIM项目语音识别安装与使用
  • ARFoundation系列讲解 - 101 VisionPro 真机调试
  • USRP B210生成信号最大带宽测试之BPSK
  • 人脸识别:AI 如何精准 “认人”?
  • FreeSwitch编译部署
  • 【星海出品】python安装调试篇
  • 【数据集】NOAA 全球监测实验室(GML)海洋边界层(MBL)参考简介
  • Docker实践:使用Docker部署WhoDB开源轻量级数据库管理工具
  • 传输层协议 TCP
  • Java什么是原子性
  • Java SpringBoot 对接FreeSwitch
  • AtCoder Beginner Contest 415
  • Web-SQL注入数据库类型用户权限架构分层符号干扰利用过程发现思路
  • 向日葵远程命令执行漏洞
  • 《深入C++多态机制:从虚函数表到运行时类型识别》​