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 时不会跳过等待输入,在显示窗口时一般都要使用该函数。# 这不用 key 接收,因为不作比较,想一直显示图片的话直接堵塞就行,参数为 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 = 0while key != ord(\'q\'): key & 0xff = cv2.waitKey(0) # 单位毫秒,0 时不会跳过等待输入,在显示窗口时一般都要使用该函数。单位毫秒。 key & 0xff,处理高字节问题。 if key == ord(\'d\'): cv2.imwrite(\"../images/2.png\", img) print(\"保存完成\") break else: 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: break key = cv2.waitKey(1) if key & 0xff == ord(\'q\'): break# 释放 VideoCapturecap.release()# 释放 VideoWritervw.release()# 释放窗口cv2.destroyAllWindows()
- 没什么说的,注释的很详细。
控制鼠标
import cv2import 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 cv2import 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
更新不易,希望得到友友的三连支持一波。收藏这篇文章,意味着你将永久拥有它,无论何时何地,都可以立即找到重新阅读;关注博主,意味着无论何时何地,博主将永久和你一起学习进步,为你带来有价值的内容。