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


😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️

💥个人主页:🔥🔥🔥大魔王🔥🔥🔥

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

文章目录

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

python 复制代码
import cv2

img = 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() 创建可响应事件的窗口

保存图片

python 复制代码
import cv2

cv2.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("保存完成")
        break
    else:
        print(key)

cv2.destroyAllWindows()
  • ord 函数:返回字符对应的 ASCII 值。
  • ord -> ordinal,序号的意思,因为 ASCII 是给字符排序号作为 ASCII 值。
  • cv2.waitKey():返回按下的字符对应的 ASCII 值。
  • 所以要通过 ord 转换才能进行比较,因为 python 没有字符,底层不会将单个字符看成对应的 ASCII(int 类型),就算是单个字符 python 也会看作字符串,所以没有对应的数值。

显示摄像头并保存

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:
        break

    key = cv2.waitKey(1)
    if key == ord('q'):
        break

# 释放 VideoCapture
cap.release()

# 释放 VideoWriter
vw.release()

# 释放窗口
cv2.destroyAllWindows()
  • 没什么说的,注释的很详细。

控制鼠标

python 复制代码
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'):
        break

cv2.destroyAllWindows()
  • cv2.imshow("mouse", img),因为这个代码显示的是图片,所以可以不用循环,只控制 cv2.waitKey() 参数为 0 就行。但是如果用了循环,那么显示窗口和 cv2.waitKey() 都要放在循环,因为如果想要画面会变,需要不断地刷新窗口才行,这段代码的话没必要,因为就是黑的,然后 cv2.waitKey() 也要在循环,不然窗口就显示不出来了。
  • OpenCV 颜色三通道是 BGR,和 RGB 正好反着的。
目的 是否必须循环调用 imshow()
仅静态显示一张图片 ❌ 只用一次就够
有窗口交互(鼠标、键盘) ✅ 必须每帧都 imshow()
播放视频或动画 ✅ 必须每帧都 imshow()

Trackbar(控件:滑动条)

python 复制代码
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'):
        break

cv2.destroyAllWindows()    
  • 博主长期更新,博主的目标是不断提升阅读体验和内容质量,如果你喜欢博主的文章,请点个赞或者关注博主支持一波,我会更加努力的为你呈现精彩的内容。

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

相关推荐
失散132 小时前
深度学习——02 PyTorch
人工智能·pytorch·深度学习
图灵学术计算机论文辅导3 小时前
傅里叶变换+attention机制,深耕深度学习领域
人工智能·python·深度学习·计算机网络·考研·机器学习·计算机视觉
重启的码农5 小时前
ggml 介绍(4) 计算图 (ggml_cgraph)
c++·人工智能
重启的码农5 小时前
ggml 介绍(5) GGUF 上下文 (gguf_context)
c++·人工智能·神经网络
R-G-B5 小时前
OpenCV Python——报错AttributeError: module ‘cv2‘ has no attribute ‘bgsegm‘,解决办法
人工智能·python·opencv·opencv python·attributeerror·module ‘cv2‘·no attribute
Seeklike5 小时前
diffusers学习--stable diffusion的管线解析
人工智能·stable diffusion·diffusers
数据知道5 小时前
机器翻译:模型微调(Fine-tuning)与调优详解
人工智能·自然语言处理·机器翻译
沫儿笙6 小时前
焊接机器人保护气体效率优化
人工智能·机器人
青岛前景互联信息技术有限公司7 小时前
应急救援智能接处警系统——科技赋能应急,筑牢安全防线
人工智能·物联网·智慧城市
楚韵天工7 小时前
基于多分类的工业异常声检测及应用
人工智能·深度学习·神经网络·目标检测·机器学习·分类·数据挖掘