OpenCV学习笔记1-图像与视频的加载与显示(附代码实现)

1 创建和显示窗口

1.1创建命名窗口

  • cv2.namedWindow(winname[, flags]) 创建命名窗口
    • winname 窗口名称,自己随意取
    • frags 窗口的标识
      • (默认)frags = 1:cv2.WINDOW_AUTOSIZE
        窗口大小自动适应图片大小,并且不可手动更改
      • frags = 0:cv2.WINDOW_NORMAL
        用户可以改变这个窗口大小

1.2改变窗口大小

  • cv2.resizeWindow(winname, width, height) 改变窗口大小
    • winname 窗口名
    • width 窗口宽度
    • height 窗口高度

1.3显示窗口

  • cv2.imshow(winname, mat) 显示窗口
    • winname 窗口名称(一般来说,名字和namedWindow/resizeWindow一致)
    • mat 传入的图像(ndarray)
      • 为0 ,黑图
      • others 其他图像

1.4 等待

  • cv2.waitKey([, delay]) 等待用户输入
    • delay <= 0:一直等待按键,一般为0
    • delay取正整数:等待按键的时间,单位是毫秒,超过时间没有按的话窗口会自动关闭
    • 返回值:等待期间有按键,则返回对应按键的ASCII码;等待期间无按键,返回-1

1.5销毁窗口

  • cv2.destroyAllwindows() 摧毁所有窗口

  • cv2.destroyWindow(winname) 摧毁指定窗口

    • winname 窗口名
    # opencv名字叫做opencv但是导包的时候, 叫做cv2
    import cv2
    # python函数编码规范, 单词首字母小写, 单词与单词之间用下滑线连接.wait_key
    # 创建窗口
    # cv2.WINDOW_AUTOSIZE不允许修改窗口大小
    # cv2.namedWindow('window', cv2.WINDOW_AUTOSIZE)
    # cv2.namedWindow('window', 1)
    
    # WINDOW_NORMAL可以让窗口大小变得可以调节
    cv2.namedWindow('window', cv2.WINDOW_NORMAL)
    # cv2.namedWindow('window', 0)
    
    # 更改窗口的大小
    cv2.resizeWindow('window', 800, 600)
    
    # 展示名字为window的窗口
    cv2.imshow('window', 0)
    
    # 等待按键
    # waitKey会返回按键的ascii的值
    # 0表示接受任意按键. 如果给其他的整数, 表示等待按键的时间. 单位是毫秒. 
    #  可以利用waitkey来销毁窗口, 不用每次都重启python.
    key = cv2.waitKey(0)
    # key是int型, 最少都是16位, 但是ascii码是8位. 
    if key & 0xFF == ord('q'): # if key ==ord('q'): ->计算ascii码
        print('准备销毁窗口')
        cv2.destroyAllWindows()
    

2 加载显示图片

  • cv2.imread(filename[, flags]):

    • filename 路径+图片名.格式 ,例如:./cat.jpeg
    • flags 标志位,表示读取数据的格式
      • flags = 1(默认),读取彩色图像(cv2.IMREAD_COLOR)
      • flags = -1,读取灰度图像(cv2.IMREAD_GRAYSCALE)
      • flags = 0,读取原始图像(cv2.IMREAD_UNCHANGED)
  • 使用imread可以读取图片, 默认读取的是彩色图片.比如:

    # 导入opencv包
    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 读取图片
    img = cv2.imread('./cat.jpeg')
    
    • 原图长这样:
      请添加图片描述

      使用matplotlib显示plt.imshow(img), 长这样:

请添加图片描述

发现这个猫的样子没变, 但是颜色不太对, 这是因为OpenCV读取的图片颜色通道是按照BGR(蓝绿红)排列的, 一般图片通道都是按照RGB来排列的.为了正常的显示猫的图片, 我们要用OpenCV的图像显示方法:

cv2.imshow('cat', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

我们可以把显示图片的方法封装成一个函数方便我们显示图片:

def cv_show(name, img):
    cv2.imshow(name, img)
    while True:
        key = cv2.waitKey(0)
        if key & 0xFF == ord('q'):
            cv2.destroyAllWindows()
            break

3 保存图片

  • cv2.imwrite(filename, img[, params]): 使用imwrite保存图片.

    • filename 路径+图片名.格式 ,例如:./cat_save.png
    • img 想要保存的图像(mat类型的图像数据,ndarray)
    • params 特定格式保存的参数编码,有默认值,一般不写
    import cv2
    
    # 创建窗口,并调整大小
    cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('img', 640, 480)
    
    # 读取图片
    img = cv2.imread('./cat.jpeg')
    
    # 利用while循环优化退出逻辑
    while True:
        cv2.imshow('img', img)
        key = cv2.waitKey(0)
        
        if key == ord('q'):
            break
        elif key == ord('s'):
            cv2.imwrite('./cat_save.png', img)
        else:
            print(key)
        
    cv2.destroyAllWindows()
    

4 视频采集-摄像头/视频

4.1捕获摄像头

  • 视频是由图片组成的, 视频的每一帧就是一幅图片, 一般是30帧, 表示一秒显示30张图片.
  • cv2.VideoCapture(self, /, *args, **kwargs)
    • self:可以捕获摄像头, 用数字来表示不同的设备

      • 0:调用电脑自带摄像头
      • 1:电脑有自带摄像头,然后外接了一个USB摄像头,想使用USB摄像头
    • 如果是视频文件, 可以直接指定路径即可.

# 打开视频文件
cap = cv2.VideoCapture('./1.mp4')

# 打开摄像头
cap = cv2.VideoCapture(0)
  • isOpened( ):检查是否正确打开

    if cap.isOpened(): # 若打开成功
        # 读取视频的一帧.返回标记和这一帧数据. True表示读到了数据, False表示没读到数据. 
        ret, frame = cap.read()
    else:
        ret = False
    
  • 循环读取视频每一帧数据

    while True:
        # 可以读到内容ret返回True
        ret, frame = cap.read()
        # 读到最后frame就是空
        if frame is None:
            break
        if ret == True:
            cv2.imshow('result', gray)
            # 0xFF == 27表示按esc退出键会退出
            if cv2.waitKey(33) & 0xFF == 27:
                break
    cap.release()
    cv2.destroyAllWindows()
    
  • read([, image])

    • 参数不写。返回两个值(标记和帧数据), 第一个为状态值, 读到帧为True, 第二个值为视频帧
  • release( ) 释放资源

  • 循环读取摄像头的每一帧数据

    # 打开摄像头
    import  cv2
    
    # 创建窗口,并调整大小
    cv2.namedWindow('video', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('video', 640, 480)
    
    # 如果打开失败, 不会报错. 
    # cap = cv2.VideoCapture(1)
    cap = cv2.VideoCapture(0)
    
    # 循环读取摄像头的每一帧
    # while True:
    while cap.isOpened(): # 若打开成功
        # 读一帧数据, 返回标记和这一帧数据. True表示读到了数据, False表示没读到数据. 
        ret, frame = cap.read()
        
        # 可以根据ret做个判断
        if not ret:
            # 没读到数据, 直接退出
            break
            
        # 显示数据
        cv2.imshow('video', frame)
        
        # 按键退出
        key = cv2.waitKey(10) # 这里给的参数不要写0,不然只会给一帧的数据然后一直保持静止
        if key & 0xFF == ord('q'):
            break
            
    # 别忘了释放资源
    cap.release()
    cv2.destroyAllWindows()
    

4.2读取视频

  • 循环读取视频每一帧数据

    # 打开视频
    import  cv2
    
    cv2.namedWindow('video', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('video', 640, 480)
    
    # 如果打开失败, 不会报错. 
    # cap = cv2.VideoCapture(1)
    # 打开视频, 输入视频的地址
    cap = cv2.VideoCapture('./1.mp4')
    
    # 循环读取摄像头的每一帧
    # while True:
    while cap.isOpened():
        # 读一帧数据, 返回标记和这一帧数据. True表示读到了数据, False表示没读到数据. 
        ret, frame = cap.read()
        
        # 可以根据ret做个判断
        if not ret:
            # 没读到数据, 直接退出
            break
            
        # 显示数据
        cv2.imshow('video', frame)
        
        # 假如一个视频是30帧, 那么每张图之间要间隔多少毫秒
        # 只能是整数
        key = cv2.waitKey(1000 // 30)
        if key & 0xFF == ord('q'):
            break
            
    # 别忘了释放资源
    cap.release()
    cv2.destroyAllWindows()
    

5 视频录制

  • cv2.VideoWrite_fourcc( ) 用来设置需要保存视频的格式

    • *‘mp4v’:mp4格式的视频
    • *‘XVID’:avi格式的视频
  • cv2.VideoWriter( self, /, *args, **kwargs) :

    • 参数一为输出文件,要加后缀
    • 参数二为多媒体文件格式(VideoWriter_fourcc)
    • 参数三为帧率
    • 参数四为分辨率,这个大小弄错了也不行,可打开自己电脑摄像头查看参数大小
  • write( ) 编码并写入缓存(每一帧数据)

  • release( ) 缓存内容写入磁盘, 并释放资源

完整视频录制代码:

import cv2

cap = cv2.VideoCapture(0)

# mp4格式的视频,解包操作,等用于'm','p','4','v'
fourcc = cv2.VideoWriter_fourcc(*'mp4v')

# avi格式的视频
# fourcc = cv2.VideoWriter_fourcc(*'XVID')

# 创建videowriter
# 名称,传入录好的视频,视频帧数,视频分辨率
# (640,480) 表示摄像头拍视频,这个大小弄错了也不行,主要是分辨率
vw = cv2.VideoWriter('ywl_vedio.mp4', fourcc, 30, (640, 480))
# vw = cv2.VideoWriter('ywl_vedio.avi', fourcc, 30, (640, 480))

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
        
    # 写每一帧数据
    vw.write(frame)
    cv2.imshow('frame', frame)
    
    if cv2.waitKey(30) == ord('q'):
        break
        
# 别忘了release
cap.release()
vw.release()
cv2.destroyAllWindows()

附OpenCV目录:OpenCV总目录学习笔记

智科专业小白,写博文不容易,如果喜欢的话可以点个赞哦!
请添加图片描述

猜你喜欢

转载自blog.csdn.net/weixin_56197703/article/details/123818139