• OpenCV 图像与视频的基础操作


    引言

    计算机视觉领域,OpenCV是一款广泛使用的开源库,用于图像处理和计算机视觉任务。当你开始使用OpenCV时,了解如何创建和显示窗口,以及加载和保存图片是至关重要的基础知识。本文将介绍如何使用OpenCV进行这些操作,帮助你更好地掌握图像处理和视觉任务的开发技巧。

    创建和显示窗口

    创建和显示窗口是图像处理中的重要步骤之一。在OpenCV中,你可以使用一些简单而强大的函数来完成这些操作。让我们来详细了解一下这些函数:

    1. namedWindow() - 创建一个窗口,并指定窗口的名称和类型。
    2. resizeWindow() - 调整窗口的大小,接受窗口名称、宽度和高度作为参数。
    3. imshow() - 在指定的窗口中显示图像,接受窗口名称和要显示的图像作为参数。
    4. waitKey() - 等待键盘输入,接受等待时间(以毫秒为单位)作为参数,0表示无限等待用户的键盘输入。
    5. destroyAllWindows() - 关闭所有窗口。

    下面是一个完整的示例代码:

    import cv2  
    cv2.namedWindow('new', cv2.WINDOW_NORMAL)  
    cv2.resizeWindow('new', 640, 480)  
    cv2.imshow("new", 0)  
      
    key = cv2.waitKey(0)  
    if(key == 'q'):  
    	exit()  
      
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    如何通过 OpenCV 加载图片问题

    加载图像是使用 OpenCV 进行图像处理的常见操作之一。在下面的示例中,我们将了解如何使用 OpenCV 加载图像:

    1. im == image - 在代码中,im代表图像对象,通常用于存储加载的图像数据。

    2. imread(path, flag) - 这是一个用于读取图像文件的函数。它接受两个参数:path表示图像文件的路径,flag表示读取图像的方式。常见的flag选项包括:

      • cv2.IMREAD_COLOR:加载彩色图像。
      • cv2.IMREAD_GRAYSCALE:以灰度模式加载图像。
      • cv2.IMREAD_UNCHANGED:加载图像,包括 alpha 通道。

    在下面的示例代码中,我们将加载名为 sample.jpg 的图像文件并显示出来:

    import cv2
    
    cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    img = cv2.imread('sample.jpg')
    cv2.imshow('img', img)
    
    key = cv2.waitKey(0)
    if key == ord('q'):
        exit()
    
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    加载图片存在的问题

    在原始代码中,存在一些问题需要解决,包括语法检测、跨平台路径访问以及程序退出逻辑。下面是对这些问题进行优化的详细解释和示例代码:

    存在的问题:

    1. 语法检测有问题:原始代码中的缩进存在问题,影响代码的可读性和执行。

    2. Windows 下访问图片的路径与 Mac/Linux 不同:在不同的操作系统中,访问文件的路径表示方式可能有所差异。需要注意在不同平台上正确指定图像文件的路径。

    3. 程序退出的逻辑有问题:原始代码中使用key == 'q'来检测用户是否按下 ‘q’ 键退出程序,但实际上waitKey()函数返回的是一个整数值。正确的做法是将键码与 'q' 的 ASCII 码值进行比较。

    以下是优化后的代码示例:

    import cv2
    
    cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    img = cv2.imread('sample.jpg')
    cv2.imshow('img', img)
    
    key = cv2.waitKey(0)
    
    if key & 0xFF == ord('q'):
        exit()
    
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    通过以上改进,我们解决了原始代码中存在的语法检测、跨平台路径访问和程序退出逻辑的问题。这样的优化使代码更具可读性和可靠性。

    如何通过 openCV 保存图片(保存图片)

    如何通过 OpenCV 保存图片

    在OpenCV中,可以使用imwrite()函数来保存图片。该函数接受两个参数:要保存的文件名和要保存的图像(以OpenCV中的Mat类型表示)。你可以指定保存的文件名和文件格式(如.jpg、.png等),并将图像数据作为参数传递给imwrite()函数,即可将图像保存到指定的文件中。

    • imwrite(name, img)
      • name,要保存的文件名
      • img,是 Mat 类型
    import cv2  
    cv2.namedWindow('img', cv2.WINDOW_NORMAL)  
      
    img = cv2.imread('sample.jpg')  
    cv2.imshow("img", img)  
      
    key = cv2.waitKey(0)  
      
    if(key & 0xFF == ord('q')):  
    	cv2.destroyAllWindows()  
    elif(key & 0xFF == ord('s')):  
    	cv2.imwrite('sample.png', img) # 改了一下文件格式
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    改善后的代码:

    import cv2  
    cv2.namedWindow('img', cv2.WINDOW_NORMAL)  
      
    img = cv2.imread('sample.jpg')  
      
    while True:  
    cv2.imshow("img", img)  
      
    key = cv2.waitKey(0)  
      
    if(key & 0xFF == ord('q')):  
    	break  
    elif(key & 0xFF == ord('s')):  
    	cv2.imwrite('sample.png', img) # 改了一下文件格式  
    else:  
    	print(key)  
      
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    如何利用 OpenCV 从摄像头采集视频(读取视频文件)

    在许多计算机视觉应用中,从摄像头采集视频是一个常见的任务。OpenCV提供了简单而强大的函数来实现这个目标。下面我们将介绍如何利用OpenCV从摄像头读取视频帧。

    • VideoCapture():用于获取视频设备。它接受一个参数index,表示要使用的视频设备的索引。通常情况下,索引为0表示使用默认的摄像头。
    • cap.read():用于从摄像头读取视频帧。
      • 返回两个值,第一个为状态值,读到帧为 true
      • 第二个值为视频帧
    • cap.release():用于释放VideoCapture对象。在程序结束时,应该调用该函数释放占用的资源。

    下面是一个完整的示例代码,展示了如何利用OpenCV从摄像头采集视频并实时显示:

    import cv2
    
    # 创建窗口
    cv2.namedWindow('video', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('video', 640, 480)
    
    # 获取视频设备
    cap = cv2.VideoCapture(0)
    
    while True:
        # 从摄像头读视频帧
        ret, frame = cap.read()
    
        # 将视频帧在窗口中显示
        cv2.imshow('video', frame)
    
        # 等待键盘时间,如果为q,退出
        key = cv2.waitKey(1)    # 设置1ms,最低为1ms
        if(key & 0xFF == ord('q')):
            break
    
    # 释放 VideoCapture
    cap.release()
    cv2.destroyAllWindows()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    如何从多媒体文件中读取视频帧(读取视频文件)

    除了从摄像头采集视频帧,OpenCV还提供了读取视频文件中的视频帧的功能。下面我们将介绍如何使用cv2.VideoCapture()函数从多媒体文件中读取视频帧。

    • cv2.VideoCapture() 从视频文件中读取视频帧

    下面是一个完整的示例代码,展示了如何从视频文件中读取视频帧并显示:

    import cv2
    
    # 创建窗口
    cv2.namedWindow('video', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('video', 640, 480)
    
    # 获取视频设备/从视频文件中读取视频帧
    cap = cv2.VideoCapture("sample.mp4")
    
    while True:
        # 从摄像头读视频帧
        ret, frame = cap.read()
    
        # 将视频帧在窗口中显示
        cv2.imshow('video', frame)
    
        # 等待键盘时间,如果为q,退出
        key = cv2.waitKey(40)    # 设置1ms,最低为1ms
        if(key & 0xFF == ord('q')):
            break
    
    # 释放 VideoCapture
    cap.release()
    cv2.destroyAllWindows()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    如何将视频数据录制成多媒体文件(视频录制)

    OpenCV提供了VideoWriter类,可以将视频数据录制成多媒体文件。

    • VideoWriter
      • 参数一为输出文件
      • 参数二为多媒体文件格式(VideoWriter_fourcc
      • 参数三为帧率
      • 参数四为分辨率大小
    • write
    • release

    下面是使用VideoWriter类进行视频录制的示例代码:

    import cv2
    
    # 创建 VideoWriter 为写多媒体文件
    fourcc = cv2.VideoWriter_fourcc(*'MJPG')
    vw = cv2.VideoWriter('./out.mp4', fourcc, 25, (1280, 720))   # 分辨率要按照真实摄像头分辨率填写
    
    # 创建窗口
    cv2.namedWindow('video', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('video', 640, 480)
    
    # 获取视频设备/从视频文件中读取视频帧
    cap = cv2.VideoCapture(0)
    
    while True:
        # 从摄像头读视频帧
        ret, frame = cap.read()
    
        # 将视频帧在窗口中显示
        cv2.imshow('video', frame)
    
        # 写数据到多媒体文件
        vw.write(frame)
    
        # 等待键盘时间,如果为q,退出
        key = cv2.waitKey(1)    # 设置1ms,最低为1ms
        if(key & 0xFF == ord('q')):
            break
    
    # 释放 VideoCapture
    cap.release()
    
    # 释放VideoWriter
    vw.release()
    
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    代码优化

    在下面的代码中,我们对代码进行了优化以解决一些问题:

    • 显示窗口为什么变大了?
    • 使用 isOpened() 判断摄像头是否已打开
    • 采集数据时要判断数据是否获取到了
    import cv2
    
    # 创建 VideoWriter 为写多媒体文件
    fourcc = cv2.VideoWriter_fourcc(*'MJPG')
    vw = cv2.VideoWriter('./out.mp4', fourcc, 25, (1280, 720))   # 分辨率要按照真实摄像头分辨率填写
    
    # 创建窗口
    cv2.namedWindow('video', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('video', 640, 480)
    
    # 获取视频设备/从视频文件中读取视频帧
    cap = cv2.VideoCapture(0)
    
    while cap.isOpened():   # ⭐判断摄像头是否打开
        # 从摄像头读视频帧
        ret, frame = cap.read()
    
        if ret == True: # ⭐判断是否获取到数据
            # 将视频帧在窗口中显示
            cv2.imshow('video', frame)
            cv2.resizeWindow('video', 640, 480) # ⭐窗口变大了
    
            # 写数据到多媒体文件
            vw.write(frame)
    
            # 等待键盘时间,如果为q,退出
            key = cv2.waitKey(1)    # 设置1ms,最低为1ms
            if(key & 0xFF == ord('q')):
                break
        else:
            break
    
    # 释放 VideoCapture
    cap.release()
    
    # 释放VideoWriter
    vw.release()
    
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    OpenCV 控制鼠标

    下面将了解如何使用 OpenCV 控制鼠标。具体来说,我们将了解如何设置鼠标回调函数,以便在鼠标事件发生时执行特定的操作。

    设置鼠标回调函数

    • setMouseCallback(winname, callback, userdata)
    • callback(event, x, y, flags, userdata)
      • event:鼠标移动,按下左键
      • x,y:鼠标左键
      • flags:鼠标键及组合键

    下面是一个完整的示例代码,演示了如何设置鼠标回调函数并在窗口中显示鼠标事件的信息:

    import cv2
    import numpy as np
    
    
    # 鼠标回调函数
    def mouse_callback(event, x, y, flags, userdata):
        print(event, x, y, flags, userdata)
    
    # mouse_callback(1, 100, 100, 16, "666")
    
    # 创建窗口
    cv2.namedWindow('mouse', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('mouse', 640, 360)
    
    # 设置鼠标回调
    cv2.setMouseCallback('mouse', mouse_callback, "123")
    
    # 显示窗口和背景
    img = np.zeros((360, 640, 3), np.uint8) # 全黑图片
    while True:
        cv2.imshow('mouse', img)
        key = cv2.waitKey(1)
        if key & 0xFF == ord('q'):
            break
    
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    OpenCV 中的 TrackBar 控件

    TrackBar 是 OpenCV 提供的一个图形用户界面控件,用于在窗口中创建滑动条,通过滑动条可以动态调整某个参数的值。下面将介绍如何在 OpenCV 中使用 TrackBar 控件。

    在这里插入图片描述

    • createTrackbar
      • trackbarname,winname
      • value:trackbar 当前值
      • count:最小值为0,最大值为 count
      • callback,userdata
    • getTrackbarPos
      • 输入参数:trackbarname
      • 输入参数:winname
      • 输出:当前值

    在下面代码中,我们将创建了一个名为 ‘trackbar’ 的窗口,并在其中创建了三个 TrackBar,分别用于控制红、绿、蓝三个通道的值。每个 TrackBar 的取值范围为 0~255。我们还创建了一个背景图片,其颜色将根据 TrackBar 的值进行实时更新。

    import cv2
    import numpy as np
    
    
    def callback():
        pass
    
    # 创建窗口
    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)
    
    # 创建一个背景图片
    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]  # img[:] 表示所有像素
        cv2.imshow('trackbar', img)
    
        key = cv2.waitKey(10)
        if key & 0xFF == ord('q'):
            break
    
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    总结

    这篇博客简单介绍了 OpenCV 的OpenCV 图像与视频的基础操作,包括窗口创建、图像加载和保存、摄像头视频采集以及多媒体文件录制等内容。同时,还提供了代码优化技巧以及鼠标交互和 TrackBar 控件的应用。通过阅读这篇博客,读者可以全面了解 OpenCV 的功能和用法,掌握图像处理的基本技能。

  • 相关阅读:
    leetcode 698. 划分为k个相等的子集
    HOOK Native API
    【论文笔记_知识蒸馏_2021】PANets: Learning from the Universal Pixel Attention Networks
    Lua学习资料和视频
    自定义SpringBoot启动图标
    Flutter——最详细(AppBar)使用教程
    【微信小程序开发】宠物预约医疗项目实战-开发功能介绍
    JDK8 stream常见用法
    华为机试 - 机器人走迷宫
    MyBatis记录(一)----与MyBatis初识
  • 原文地址:https://blog.csdn.net/qq_21484461/article/details/131153134