OpenCV学习笔记(1):图像和视频的加载和显示


文章目录

  • OpenCV学习笔记(1):图像和视频的加载和显示
  • 01 创建和显示窗口
  • 02 读取和显示图像
  • 03 保存图片
  • 04 显示视频
  • 05 视频录制
  • 06 控制鼠标
  • 07 TrackBar拖动控件的使用



想学习的全面一点看过来吧~ 最全注释,初学不懂的都在注释上面了

01 创建和显示窗口

# opencv名字叫做opencv 但是导包的时候cv2
import cv2

import matplotlib.pyplot as plt	
import numpy as np

"""
https://www.bilibili.com/video/BV12Z4y1z7jb?spm_id_from=333.337.search-card.all.click
【不要再看那些过时的OpenCV老教程了】2022巨献,OpenCV零基础小白最新版全套
33h19m46s
"""
# 01 创建和显示窗口
def display_window():
    cv2.namedWindow(winname="window",)
    # namedWindow(winname[, flags]) []代表可选参数 该函数创建一个可以放置图片或者可拖动控件的窗口,winname表示创建窗口的名字
    # WINDOW_NORMAL or WINDOW_AUTOSIZE:前者可以resize窗口大小;后者根据待显示图像大小自动调整窗口大小
    # WINDOW_FREERATIO or WINDOW_KEEPRATIO:ratio比例 是否保持图像长宽比
    # WINDOW_GUI_NORMAL or WINDOW_GUI_EXPANDED:前者时是绘制窗口的旧方法,没有状态栏和工具栏,而WINDOW_GUI_EXPANDED是一个新的增强的GUI。
    # 默认flags参数 == WINDOW_AUTOSIZE | WINDOW_KEEPRATIO | WINDOW_GUI_EXPANDED
    cv2.imshow('window', 0)
    key = cv2.waitKey(0)

    if key & 0xFF == ord('q'):  # ord是python中计算ascii值的函数 oxFF要不要都可以
        print('准备销毁窗口')
        # cv2.destroyWindow('window')	两种销毁窗口的方式
        cv2.destroyAllWindows()
        
display_window()

02 读取和显示图像

opencv 显示图片 读取图片的颜色通道是按照蓝绿红(BGR)
所以一般opencv读出来的图片不要用别的方式去展示 比如matplotlib
matplotlib显示 注意要加plt.show()函数

# 02 读取和显示图像
def display_picture():
    # opencv 显示图片 读取图片的颜色通道是按照蓝绿红(BGR)
    # 所以一般opencv读出来的图片不要用别的方式去展示 比如matplotlib
    img1 = cv2.imread('picture.png')
    cv2.imshow('test', img1)
    key = cv2.waitKey(0)  # @param delay Delay in milliseconds. 0 is the special value that means "forever". 0永远不关闭
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()

    # # matplotlib显示 注意要加plt.show()函数
    # img2 = plt.imread('picture.png')
    #
    # # 对比一下两张显示方式
    # plt.subplot(1, 2, 1)
    # plt.imshow(img1)
    # plt.subplot(1, 2, 2)
    # plt.imshow(img2)
    # plt.show()

display_picture()

测试一下颜色通道不一致时的图像区别:

运行注释掉上边的plt绘图函数后有以下结果:

opencv 显示点云 opencv显示yuv422图像_计算机视觉


原图在这:

opencv 显示点云 opencv显示yuv422图像_opencv_02

03 保存图片

cv2.imwrite(filename, img, params=None) 保存图片函数

# 03 保存图片
def save_picture():
    # 创建窗口
    cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('img', 640, 480)

    # 读取图片
    img = cv2.imread('picture.png')
    while True:
        cv2.imshow('img', img)
        key = cv2.waitKey(0)

        # 按下q退出循环,按下s保存图片
        if key == ord('q'):
            break
        elif key == ord('s'):
            cv2.imwrite('123.jpeg', img)
        else:
            print(key)

    cv2.destroyAllWindows()
    
save_picture()

04 显示视频

cv2.VideoCapture(‘video.mp4’)
cv2.waitKey(1000 // 30) 读到的图片显示的时间 越小切换到下一帧的时间越短 相当于视频快进
想和原视频播放一致的话,需要计算延时时间 需要知道原先视频的帧数

# 04 显示视频
def display_video():
    cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('img', 640, 480)

    # 读取视频文件
    cap = cv2.VideoCapture('video.mp4')
    # 打开摄像头 数字代表不同的设备 比如0 1
    # cap = cv2.VideoCapture(0)

    # 循环读取视频的每一帧
    while True:
        # 读一帧数据,返回标记和这一帧数据。True表示读到了数据,False表示没读到数据
        ret, frame = cap.read()  # 读一帧

        # 根据ret做个判断
        if not ret:
            # 没读到数据,直接退出
            break

        # 显示数据
        cv2.imshow('img', frame)

        # 加入一个视频是30帧,那么每张图之间要间隔多少毫秒
        key = cv2.waitKey(1000 // 30)  # 读到的图片显示的时间 越小切换到下一帧的时间越短 相当于视频快进
        # 想和原视频播放一致的话,需要计算延时时间 需要知道原先视频的帧数

        if key == ord('q'):
            break

    # 别忘了释放资源
    cap.release()
    cv2.destroyAllWindows()

display_video()

05 视频录制

# 05 视频录制
def record_video():
    cap = cv2.VideoCapture(0)
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')	# 对应mp4格式
    # fourcc = cv2.VideoWriter_fourcc(*'XVID')  #   avi格式 下面保存后缀名要改

    # 创建videowriter 30帧,640 480 为分辨率 帧数可调,分辨率不能错
    vw = cv2.VideoWriter('output.mp4', 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(1000 // 30) == ord('q'):
            break

    # 别忘了release
    cap.release()
    vw.release()
    cv2.destroyAllWindows()


# record_video()

06 控制鼠标

# 06 控制鼠标
def control_mouse():
    import numpy

    # 函数名可以随便取,但是参数必须是5个
    # event表示鼠标事件,x,y是鼠标的坐标 flags鼠标的组合按键 userdata传入的数据
    # 想深入了解鼠标事件可以查一下
    def mouse_callback(event, x, y, flags, userdata):
        print(event, x, y, flags, userdata)

        # 按下鼠标右键退出
        if event == 2:
            cv2.destroyAllWindows()

    # 创建窗口
    cv2.namedWindow('mouse', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('mouse', 640, 360)

    # 设置鼠标的回调函数
    cv2.setMouseCallback('mouse', mouse_callback, '123')

    # 生成全黑的图片
    img = numpy.zeros((360, 360, 3), np.uint8)
    while True:
        cv2.imshow('mouse', img)
        key = cv2.waitKey(1)
        if key == ord('q'):
            break

    cv2.destroyAllWindows()


control_mouse()

结果:

单击时显示

opencv 显示点云 opencv显示yuv422图像_图像处理_03


为了方便大家,整理了一下常用的鼠标事件

事件名

鼠标活动

代号

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

07 TrackBar拖动控件的使用

# 07 TrackBar拖动控件的使用
def trackbar():
    cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('trackbar', 640, 480)

    # 定义回调函数
    def callback(value):
        # print(value)
        pass

    # 创建3个trackbar
    cv2.createTrackbar('R', 'trackbar', 0, 255, callback)
    cv2.createTrackbar('G', 'trackbar', 0, 255, callback)
    cv2.createTrackbar('B', 'trackbar', 0, 255, callback)

    # 创建背景图片
    img = np.zeros((360, 360, 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(1)
        if key == ord('q'):
            break

    cv2.destroyAllWindows()


trackbar()

延时1ms即改变,也就是实时,没事可以玩一下,像画图的调色板一样


opencv 显示点云 opencv显示yuv422图像_图像处理_04

opencv 显示点云 opencv显示yuv422图像_计算机视觉_05