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 事件处理流程:
- 用户操作(点击、输入、拖动…)
- 操作触发事件
- 程序注册的回调函数被调用
- 程序根据事件做出响应
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
更新不易,希望得到友友的三连支持一波。收藏这篇文章,意味着你将永久拥有它,无论何时何地,都可以立即找到重新阅读;关注博主,意味着无论何时何地,博主将永久和你一起学习进步,为你带来有价值的内容。