【OpenCV图像处理1】图像&视频的加载与显示(下)

简介: 【OpenCV图像处理1】图像&视频的加载与显示(下)

6.3 写数据 vw.write

vw.write用法:

vw.write(frame)

参数说明:

  • ret, frame = cap.read() 将读取到的视频帧,再通过 vw.write(frame) 将数据写入多媒体文件。

6.4 释放资源 vw.release

vw.release用法:

vw.release()

完成工作后释放所有内容(释放VideoCapture、释放VideoWriter、销毁窗口)。

6.5 代码实现

import cv2
# 创建VideoWriter为写多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
vw = cv2.VideoWriter('../resource/out.avi', fourcc, 25, (640, 480))
cv2.namedWindow('video', cv2.WINDOW_NORMAL)  # 创建窗口
cv2.resizeWindow('video', 640, 360)  # 修改窗口尺寸
cap = cv2.VideoCapture(0)  # 获取视频设备
while True:
    # 从摄像头读视频帧
    ret, frame = cap.read()
    # 将视频帧在窗口显示
    cv2.imshow('video', frame)
    # 写数据到多媒体文件
    vw.write(frame)
    # 等待键盘事件,如果为q,退出
    key = cv2.waitKey(1000 // 30)
    if key & 0xFF == ord('q'):
        break
cap.release()  # 释放VideoCapture
vw.release()  # 释放VideoWriter
cv2.destroyAllWindows()  # 销毁窗口

6.6 代码优化

1、使用 isOpened() 判断摄像头是否已打开?

while cap.isOpened():

判断摄像头是否为打开状态

2、采集数据时要判断数据是否获取到了?

if ret == True:
  ...
else:
  break

3、优化后代码

import cv2
# 创建VideoWriter为写多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
vw = cv2.VideoWriter('../resource/out.avi', fourcc, 25, (640, 480))
cv2.namedWindow('video', cv2.WINDOW_NORMAL)  # 创建窗口
cv2.resizeWindow('video', 640, 360)  # 修改窗口尺寸
cap = cv2.VideoCapture(0)  # 获取视频设备
# 判断摄像头是否为打开状态
while cap.isOpened():
    # 从摄像头读视频帧
    ret, frame = cap.read()
    if ret == True:
        # 将视频帧在窗口显示
        cv2.imshow('video', frame)
        # 写数据到多媒体文件
        vw.write(frame)
        # 等待键盘事件,如果为q,退出
        key = cv2.waitKey(1000 // 30)
        if key & 0xFF == ord('q'):
            break
    else:
        break
cap.release()  # 释放VideoCapture
vw.release()  # 释放VideoWriter
cv2.destroyAllWindows()  # 销毁窗口

7、鼠标控制

7.1 设置鼠标回调 setMouseCallback()

setMouseCallback()用法:

cv2.setMouseCallback(winname, callback, userdata)

参数说明:

  • winname:窗口名称
  • callback:鼠标事件的回调函数
  • userdata:传递给回调函数的可选参数(默认为None)

7.2 回调函数 callback()

callback()用法:

callback(event, x, y, flags, userdata)

参数说明:

  • event:鼠标事件(鼠标移动、左键、右键…)
  • x, y:鼠标所在坐标点
  • flags:鼠标键及组合键
  • userdata:传递给回调函数的可选参数(默认为None)

event类型如下表所示:

event 描述
EVENT_MOUSEMOVE 0 鼠标移动
EVENT_LBUTTONDOWN 1 按下鼠标左键
EVENT_RBUTTONDOWN 2 按下鼠标右键
EVENT_MBUTTONDOWN 3 按下鼠标中键
EVENT_LBUTTONUP 4 左键释放
EVENT_RBUTTONUP 5 右键释放
EVENT_MBUTTONUP 6 中键释放
EVENT_LBUTTONDBLCLK 7 左键双击
EVENT_RBUTTONDBLCLK 8 右键双击
EVENT_MBUTTONDBLCLK 9 中键双击
EVENT_MOUSEWHEEL 10 鼠标滚轮上下移动
EVENT_MOUSEHWHEEL 11 鼠标滚轮左右移动

flags类型如下表所示:

flags 描述
EVENT_FLAG_LBUTTON 1 按下左键
EVENT_FLAG_RBUTTON 2 按下右键
EVENT_FLAG_MBUTTON 4 按下中键
EVENT_FLAG_CRTLKEY 8 按下CTRL键
EVENT_FLAG_SHIFTKEY 16 按下SHIFT键
EVENT_FLAG_ALTKEY 32 按下ALT键

7.3 设置背景 np.zeros()

np.zeros()用法:

img = np.zeros(shape, dtype)

参数说明:

  • shape:创建新数组的形状(维度),与显示窗口相反。
  • dtype:数据类型

7.4 代码实现

import cv2
import numpy as np
# 设置鼠标回调函数
def callback(event, x, y, flags, userdata):
    print(event, x, y, flags, userdata)
# 创建、修改窗口
cv2.namedWindow('mouse_callback', cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse_callback', 640, 360)
# 设置鼠标回调
cv2.setMouseCallback('mouse_callback', callback, 'userdata')
# 显示窗口和背景
img = np.zeros((360, 640, 3), np.uint8)
while True:
    cv2.imshow('mouse_callback', img)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        break
# 销毁窗口
cv2.destroyAllWindows()

8、TrackBar控件

8.1 创建TrackBar控件 createTrackbar()

createTrackbar()用法:

cv2.createTrackbar(trackbarName, windowName, value, count, onChange)

参数说明:

  • trackbarName:轨迹条名
  • windowName:窗口名
  • value:滑块初始位置
  • count:滑块达到最大位置的值(最小值为0,最大值为count)
  • onChange:默认值为0,指回调函数
  • userdate:默认值为0,用户传递给回调函数的数据值

8.2 获取当前TrackBar值 getTrackbarPos()

getTrackbarPos()用法:

cv2.getTrackbarPos(trackbarName, windowName)

参数说明:

  • trackbarName:轨迹条名
  • windowName:窗口名

8.3 代码实现

import cv2
import numpy as np
# 定义回调函数
def callback(value):
    print(value)
# 创建窗口
cv2.namedWindow('TrackBar', cv2.WINDOW_NORMAL)
# 创建trackbar
cv2.createTrackbar('R', 'TrackBar', 0, 255, callback)
cv2.createTrackbar('G', 'TrackBar', 0, 255, callback)
cv2.createTrackbar('B', 'TrackBar', 0, 255, callback)
# 设置纯黑色背景图片(640 * 480)
img = np.zeros((480, 640, 3), np.uint8)
while True:
    # 获取当前TrackBar值
    r = cv2.getTrackbarPos('R', 'TrackBar')
    g = cv2.getTrackbarPos('G', 'TrackBar')
    b = cv2.getTrackbarPos('B', 'TrackBar')
    # 改变背景图片颜色
    img[:] = [b, g, r]
    # 显示
    cv2.imshow('TrackBar', img)
    key = cv2.waitKey(10)
    if key & 0xFF == ord('q'):
        break
cv2.destroyAllWindows()


目录
相关文章
|
16天前
|
算法 计算机视觉
OpenCV高斯差分技术实现图像边缘检测
OpenCV高斯差分技术实现图像边缘检测
|
18天前
|
存储 计算机视觉 流计算
【OpenCV】计算视频的光流并跟踪物体calcOpticalFlowPyrLK
【OpenCV】计算视频的光流并跟踪物体calcOpticalFlowPyrLK
24 0
|
18天前
|
计算机视觉
OpenCV图像运动模糊
OpenCV图像运动模糊
17 0
|
18天前
|
计算机视觉
OpenCV图像阈值
OpenCV图像阈值
6 0
|
18天前
|
计算机视觉
OpenCV图像混合
OpenCV图像混合
14 0
|
18天前
|
计算机视觉 Python
OpenCV为图像扩边(填充)
OpenCV为图像扩边(填充)
16 0
|
18天前
|
计算机视觉 Python
轻松掌握opencv的8种图像变换
轻松掌握opencv的8种图像变换
|
18天前
|
算法 计算机视觉
【OpenCV】- 图像修复
【OpenCV】- 图像修复
|
18天前
|
Serverless 计算机视觉
【OpenCV】-图像的矩
【OpenCV】-图像的矩
|
18天前
|
编解码 物联网 计算机视觉
【OpenCV】—图像金子塔与图片尺寸缩放
【OpenCV】—图像金子塔与图片尺寸缩放