zoukankan      html  css  js  c++  java
  • Python+OpenCV4:读写输入和输出的简单实践(图片、视频、摄像头)

    典型的文件处理流程如下:

    利用命令行参数

    sys.argv

    命令行参数是读取文件时常用的方式。

    命令行参数保存在 sys.argv 的列表中,列表的第一个元素是脚本名称,后面的元素是命令行参数

    通过以下脚本 sys_argv.py 可以熟悉命令行参数的获取:

    1 import sys
    2 
    3 print(f'运行的脚本名是:{sys.argv[0]}')
    4 print(f'sys.argv 列表的长度是:{len(sys.argv)}')
    5 print(f'该脚本的参数是:{sys.argv[1:]}')

    运行命令  python sys_argv.py 666 yu  可以得到以下输出:

    运行的脚本名是:sys_argv.py
    sys.argv 列表的长度是:3
    该脚本的参数是:['666', 'yu']

    argparse

    当程序比较复杂时,我们一般不会直接使用 sys.argv,而应该使用 Python 的标准库 argparse

    argparse 做了一些封装。使用 argparse,程序可以识别需要哪些参数,如何解析参数,以及提供帮助信息和使用信息,也提供自动化的错误信息。

    下面是使用 argparse 的示例:

     1 import argparse
     2 
     3 # 创建 ArgumentParser 对象,参数会自动保存到该对象中
     4 # description 在使用 -h/--help 的时候会显示这个文本
     5 parser = argparse.ArgumentParser(description='某图像处理')
     6 
     7 # 添加参数
     8 # 第一个参数是给 parser 添加的变量
     9 # type 指定类型
    10 # help 解释参数
    11 parser.add_argument('image', type=str, help='图像路径')
    12 
    13 # 调用 parse_args() 可以获取参数
    14 args = parser.parse_args()
    15 print(args.image)

    运行命令  python argparse_demo.py '../data/yiquan.jpeg' ,可以输入:

    ../data/yiquan.jpeg

    更多关于 argparse 的用法参考:argparse — Parser for command-line options, arguments and sub-commands

    读写图片

    读入图片

    一个利用参数读取图片的例子:

     1 """
     2 读取图片
     3 """
     4 import argparse
     5 import cv2
     6 
     7 # 创建 ArgumentParser 对象
     8 parser = argparse.ArgumentParser()
     9 
    10 # 添加参数,默认类型是字符串
    11 parser.add_argument('path_image', help='图像路径')
    12 
    13 # 解析参数
    14 args = parser.parse_args()
    15 
    16 # 根据图像路径加载输入图像
    17 image = cv2.imread(args.path_image)
    18 cv2.imshow('loaded image', image)
    19 cv2.waitKey(0)
    20 cv2.destroyAllWindows()

    输入命令  python argparse_load_image.py ../data/yiquan.jpeg ,可以显示图片。

    读入/处理/写入图片

    标准的图像处理流程有读取、处理、保存,以下是一个该流程的简单示例:

     1 """
     2 读入/处理/写入图片
     3 运行脚本 python argparse_load_processing_save_image.py [path_image_input] [path_image_output]
     4 """
     5 import argparse
     6 import cv2
     7 
     8 parser = argparse.ArgumentParser()
     9 
    10 parser.add_argument('path_image_input', help='图像输入的路径')
    11 
    12 parser.add_argument('path_image_output', help='图像输出的路径')
    13 
    14 args = parser.parse_args()
    15 
    16 image_input = cv2.imread(args.path_image_input)
    17 
    18 # 把彩色图片变为灰度图片
    19 gray_image = cv2.cvtColor(image_input, cv2.COLOR_BGR2GRAY)
    20 
    21 cv2.imshow('gray image', gray_image)
    22 
    23 # 保存处理后的文件
    24 cv2.imwrite(args.path_image_output, gray_image)
    25 
    26 cv2.waitKey(0)
    27 
    28 cv2.destroyAllWindows()

    运行脚本后的效果如下:

    并且在参数指定的目录保存一张 result.jpeg 图片。

    读取摄像头数据和视频文件

    读取+处理

    OpenCV 的 cv2.VieoCapture 可以根据不同源(如图像序列、视频文件、摄像头),进行视频捕捉。

     1 """
     2 读取摄像头数据
     3 处理数据并且展示数据
     4 """
     5 import argparse
     6 import cv2
     7 
     8 parser = argparse.ArgumentParser()
     9 
    10 parser.add_argument('index_camera', type=int, help='摄像头编号')
    11 
    12 args = parser.parse_args()
    13 
    14 capture = cv2.VideoCapture(args.index_camera)
    15 
    16 # 获取 capture 的一些属性
    17 frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
    18 frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
    19 fps = capture.get(cv2.CAP_PROP_FPS)
    20 print(frame_width, frame_height, fps)
    21 
    22 if capture.isOpened() is False:
    23     print('Error openning the camera')
    24 
    25 while capture.isOpened():
    26     ret, frame = capture.read()
    27 
    28     if ret:
    29         # 显示摄像头捕获的帧
    30         cv2.imshow('Input frame from the camera', frame)
    31 
    32         # 把摄像头捕捉到的帧转换为灰度
    33         gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    34 
    35         # 显示处理后的帧
    36         cv2.imshow('Grayscale input camera', gray_frame)
    37 
    38         # cv2.waitKey()这个函数是在一个给定的时间内(单位ms)等待用户按键触发
    39         # 如果用户没有按下按键,则继续等待(循环)
    40         if (cv2.waitKey(10) & 0xFF) == ord('q'):
    41             break
    42     else:
    43         break
    44 
    45 capture.release()
    46 cv2.destroyAllWindows()

    注意运行脚本的时候不要在 IDE 下运行,尽量在终端上直接运行。比如我在 PyCharm 里运行,就出现了以下错误:

    Abort trap: 6

    在终端上运行脚本可以解决该问题。注意需要设置摄像头参数(比如 0): python read_camera.py 0 。

    (cv2.waitKey(10) & 0xFF) == ord('q')  这条命令的含义可以参考 What's 0xFF for in cv2.waitKey(1)? 中的回答。

    成功运行脚本之后,可以出现两个窗口,一个是捕捉摄像头的窗口,另一个是处理成灰度图像的窗口。点击 q 键可以退出应用。

    保存某一帧到硬盘

    稍加修改,可以在按 c 键的时候,把某时刻的帧保存在硬盘上。

     1 """
     2 读取摄像头数据
     3 处理数据并且展示数据
     4 """
     5 import argparse
     6 import cv2
     7 
     8 parser = argparse.ArgumentParser()
     9 
    10 parser.add_argument('index_camera', type=int, help='摄像头编号')
    11 
    12 args = parser.parse_args()
    13 
    14 capture = cv2.VideoCapture(args.index_camera)
    15 
    16 # 获取 capture 的一些属性
    17 frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
    18 frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
    19 fps = capture.get(cv2.CAP_PROP_FPS)
    20 print(frame_width, frame_height, fps)
    21 
    22 if capture.isOpened() is False:
    23     print('Error openning the camera')
    24 
    25 frame_index = 0
    26 while capture.isOpened():
    27     ret, frame = capture.read()
    28 
    29     if ret:
    30         # 显示摄像头捕获的帧
    31         cv2.imshow('Input frame from the camera', frame)
    32 
    33         # 把摄像头捕捉到的帧转换为灰度
    34         gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    35 
    36         # 显示处理后的帧
    37         cv2.imshow('Grayscale input camera', gray_frame)
    38 
    39         # cv2.waitKey()这个函数是在一个给定的时间内(单位ms)等待用户按键触发
    40         # 如果用户没有按下按键,则继续等待(循环)
    41         if (cv2.waitKey(10) & 0xFF) == ord('q'):
    42             break
    43         if (cv2.waitKey(10) & 0xFF) == ord('c'):
    44             frame_name = f'camera_frame_{frame_index}.png'
    45             gray_frame_name = f'grayscale_camera_frame_{frame_index}.png'
    46             cv2.imwrite(frame_name, frame)
    47             cv2.imwrite(gray_frame_name, gray_frame)
    48             frame_index += 1
    49     else:
    50         break
    51 
    52 capture.release()
    53 cv2.destroyAllWindows()

    读取视频文件

    读取视频文件和读取图片文件类似。

    在 http://samples.mplayerhq.hu/ 里面找到合适的视频文件。

     1 """
     2 读取视频数据
     3 """
     4 import argparse
     5 import cv2
     6 
     7 parser = argparse.ArgumentParser()
     8 
     9 parser.add_argument('video_path', help='视频文件路径')
    10 
    11 args = parser.parse_args()
    12 
    13 capture = cv2.VideoCapture(args.video_path)
    14 
    15 if capture.isOpened() is False:
    16     print('Error openning the video')
    17 
    18 while capture.isOpened():
    19 
    20     ret, frame = capture.read()
    21     if ret:
    22         # 显示摄像头捕获的帧
    23         cv2.imshow('Original frame from the video file', frame)
    24 
    25         # 把摄像头捕捉到的帧转换为灰度
    26         gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    27 
    28         # 显示处理后的帧
    29         cv2.imshow('Grayscale frame', gray_frame)
    30 
    31         # cv2.waitKey()这个函数是在一个给定的时间内(单位ms)等待用户按键触发
    32         # 如果用户没有按下按键,则继续等待(循环)
    33         if (cv2.waitKey(10) & 0xFF) == ord('q'):
    34             break
    35     else:
    36         break
    37 
    38 capture.release()
    39 cv2.destroyAllWindows()

    运行脚本: python read_video_file.py ../data/DSCF1928_fish.AVI 。

    我所使用的测试视频文件在这里下载。

     

    保存一个视频文件

    使用 cv2.VideoWriter 可以写入视频文件。

    FPS 是一个很重要的指标,它表示每秒处理多少个帧。FPS 越大往往视频的流畅度就越高。

    视频编码(video code)用于压缩和解压一个数字视频。压缩视频格式往往遵循成为视频压缩标准或者视频编码格式的标准。

    OpenCV 提供了 FOURCC,用于指定视频编码。此外,视频文件格式用于存储数字视频数据,常见的格式有 AVI(*.avi)、MP4(*.mp4)、QuickTime(*.mov)。

    下图显示了使用 cv2.VideoWriter 需要考虑的一些因素。

    以下是使用本地摄像头作为输入,转换为灰度后保存为本地视频文件。

     1 """
     2 接收摄像头参数
     3 然后写入视频文件
     4 """
     5 
     6 import cv2
     7 import argparse
     8 
     9 parser = argparse.ArgumentParser()
    10 
    11 parser.add_argument("output_video_path", help="path to the video file to write")
    12 args = parser.parse_args()
    13 
    14 capture = cv2.VideoCapture(0)
    15 
    16 frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
    17 frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
    18 fps = capture.get(cv2.CAP_PROP_FPS)
    19 print(f'CV_CAP_PROP_FRAME_WIDTH: {frame_width}')
    20 print(f'CV_CAP_PROP_FRAME_HEIGHT: {frame_height}')
    21 print(f'CAP_PROP_FPS: {fps}')
    22 
    23 fourcc = cv2.VideoWriter_fourcc(*'XVID')
    24 
    25 # 最后一个参数指是否使用彩色图像
    26 out_gray = cv2.VideoWriter(args.output_video_path, fourcc, int(fps), (int(frame_width), int(frame_height)), False)
    27 
    28 while capture.isOpened():
    29 
    30     ret, frame = capture.read()
    31     if ret is True:
    32 
    33         gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    34 
    35         out_gray.write(gray_frame)
    36 
    37         cv2.imshow('gray', gray_frame)
    38         if cv2.waitKey(1) & 0xFF == ord('q'):
    39             break
    40     else:
    41         break
    42 
    43 capture.release()
    44 out_gray.release()
    45 cv2.destroyAllWindows()

    输入命令  python write_video_file.py ./my_video.mp4 ,会出现一个窗口,点击 q 退出,最后保存一个 my_video.mp4 文件。

    原文作者:雨先生
    原文链接:https://www.cnblogs.com/noluye/p/11446146.html 
    许可协议:知识共享署名-非商业性使用 4.0 国际许可协议

    参考

  • 相关阅读:
    Codeforces Global Round 7 题解 (ABCDE)
    猫树 简单介绍
    pip模块
    协程
    多线程threading
    多进程multiprocessing
    DOM
    标签学习
    初步了解Bootstrap4
    初步了解jQuery
  • 原文地址:https://www.cnblogs.com/noluye/p/11446146.html
Copyright © 2011-2022 走看看