【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()


目录
相关文章
|
2月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
110 7
基于qt的opencv实时图像处理框架FastCvLearn实战
|
1月前
|
计算机视觉
Opencv学习笔记(八):如何通过cv2读取视频和摄像头来进行人脸检测(jetson nano)
如何使用OpenCV库通过cv2模块读取视频和摄像头进行人脸检测,并提供了相应的代码示例。
96 1
|
1月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
364 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
2月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
51 4
|
2月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
1月前
|
编解码 关系型数据库 计算机视觉
Opencv学习笔记(十一):opencv通过mp4保存为H.264视频
本文介绍了如何在OpenCV中通过使用cisco开源的openh264库来解决不支持H.264编码的问题,并提供了完整的代码示例。
83 0
Opencv学习笔记(十一):opencv通过mp4保存为H.264视频
|
1月前
|
机器学习/深度学习 算法 计算机视觉
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
73 2
|
3月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
WK
|
3月前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
113 1
|
5月前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
179 1
下一篇
无影云桌面