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

利用命令行参数

sys.argv

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

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

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

 import sys

 print(f'运行的脚本名是:{sys.argv[0]}')
print(f'sys.argv 列表的长度是:{len(sys.argv)}')
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 的示例:

 import argparse

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

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

../data/yiquan.jpeg

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

读写图片

读入图片

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

 """
读取图片
"""
import argparse
import cv2 # 创建 ArgumentParser 对象
parser = argparse.ArgumentParser() # 添加参数,默认类型是字符串
parser.add_argument('path_image', help='图像路径') # 解析参数
args = parser.parse_args() # 根据图像路径加载输入图像
image = cv2.imread(args.path_image)
cv2.imshow('loaded image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

读入/处理/写入图片

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

 """
读入/处理/写入图片
运行脚本 python argparse_load_processing_save_image.py [path_image_input] [path_image_output]
"""
import argparse
import cv2 parser = argparse.ArgumentParser() parser.add_argument('path_image_input', help='图像输入的路径') parser.add_argument('path_image_output', help='图像输出的路径') args = parser.parse_args() image_input = cv2.imread(args.path_image_input) # 把彩色图片变为灰度图片
gray_image = cv2.cvtColor(image_input, cv2.COLOR_BGR2GRAY) cv2.imshow('gray image', gray_image) # 保存处理后的文件
cv2.imwrite(args.path_image_output, gray_image) cv2.waitKey(0) cv2.destroyAllWindows()

运行脚本后的效果如下:

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

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

读取+处理

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

 """
读取摄像头数据
处理数据并且展示数据
"""
import argparse
import cv2 parser = argparse.ArgumentParser() parser.add_argument('index_camera', type=int, help='摄像头编号') args = parser.parse_args() capture = cv2.VideoCapture(args.index_camera) # 获取 capture 的一些属性
frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = capture.get(cv2.CAP_PROP_FPS)
print(frame_width, frame_height, fps) if capture.isOpened() is False:
print('Error openning the camera') while capture.isOpened():
ret, frame = capture.read() if ret:
# 显示摄像头捕获的帧
cv2.imshow('Input frame from the camera', frame) # 把摄像头捕捉到的帧转换为灰度
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 显示处理后的帧
cv2.imshow('Grayscale input camera', gray_frame) # cv2.waitKey()这个函数是在一个给定的时间内(单位ms)等待用户按键触发
# 如果用户没有按下按键,则继续等待(循环)
if (cv2.waitKey(10) & 0xFF) == ord('q'):
break
else:
break capture.release()
cv2.destroyAllWindows()

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

Abort trap: 6

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

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

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

保存某一帧到硬盘

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

 """
读取摄像头数据
处理数据并且展示数据
"""
import argparse
import cv2 parser = argparse.ArgumentParser() parser.add_argument('index_camera', type=int, help='摄像头编号') args = parser.parse_args() capture = cv2.VideoCapture(args.index_camera) # 获取 capture 的一些属性
frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = capture.get(cv2.CAP_PROP_FPS)
print(frame_width, frame_height, fps) if capture.isOpened() is False:
print('Error openning the camera') frame_index = 0
while capture.isOpened():
ret, frame = capture.read() if ret:
# 显示摄像头捕获的帧
cv2.imshow('Input frame from the camera', frame) # 把摄像头捕捉到的帧转换为灰度
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 显示处理后的帧
cv2.imshow('Grayscale input camera', gray_frame) # cv2.waitKey()这个函数是在一个给定的时间内(单位ms)等待用户按键触发
# 如果用户没有按下按键,则继续等待(循环)
if (cv2.waitKey(10) & 0xFF) == ord('q'):
break
if (cv2.waitKey(10) & 0xFF) == ord('c'):
frame_name = f'camera_frame_{frame_index}.png'
gray_frame_name = f'grayscale_camera_frame_{frame_index}.png'
cv2.imwrite(frame_name, frame)
cv2.imwrite(gray_frame_name, gray_frame)
frame_index += 1
else:
break capture.release()
cv2.destroyAllWindows()

读取视频文件

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

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

 """
读取视频数据
"""
import argparse
import cv2 parser = argparse.ArgumentParser() parser.add_argument('video_path', help='视频文件路径') args = parser.parse_args() capture = cv2.VideoCapture(args.video_path) if capture.isOpened() is False:
print('Error openning the video') while capture.isOpened(): ret, frame = capture.read()
if ret:
# 显示摄像头捕获的帧
cv2.imshow('Original frame from the video file', frame) # 把摄像头捕捉到的帧转换为灰度
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 显示处理后的帧
cv2.imshow('Grayscale frame', gray_frame) # cv2.waitKey()这个函数是在一个给定的时间内(单位ms)等待用户按键触发
# 如果用户没有按下按键,则继续等待(循环)
if (cv2.waitKey(10) & 0xFF) == ord('q'):
break
else:
break capture.release()
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 需要考虑的一些因素。

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

 """
接收摄像头参数
然后写入视频文件
""" import cv2
import argparse parser = argparse.ArgumentParser() parser.add_argument("output_video_path", help="path to the video file to write")
args = parser.parse_args() capture = cv2.VideoCapture(0) frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = capture.get(cv2.CAP_PROP_FPS)
print(f'CV_CAP_PROP_FRAME_WIDTH: {frame_width}')
print(f'CV_CAP_PROP_FRAME_HEIGHT: {frame_height}')
print(f'CAP_PROP_FPS: {fps}') fourcc = cv2.VideoWriter_fourcc(*'XVID') # 最后一个参数指是否使用彩色图像
out_gray = cv2.VideoWriter(args.output_video_path, fourcc, int(fps), (int(frame_width), int(frame_height)), False) while capture.isOpened(): ret, frame = capture.read()
if ret is True: gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) out_gray.write(gray_frame) cv2.imshow('gray', gray_frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break capture.release()
out_gray.release()
cv2.destroyAllWindows()

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

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

参考

Python+OpenCV4:读写输入和输出的简单实践(图片、视频、摄像头)的更多相关文章

  1. Python基础篇--输入与输出

    站长资讯平台:Python基础篇--输入与输出在任何语言中,输入和输出都是代码最基础的开始,so,先来聊一聊输入和输出输出输入END在任何语言中,输入和输出都是代码最基础的开始,so,先来聊一聊输入和 ...

  2. Python(输入、输出;简单运算符;流程控制;转译)

    一 输入输出 python3中统一都是input,python2中有raw_input等同于python3的input,另外python2中也有input 1.res=input("pyth ...

  3. python中的输入和输出

    输入和输出   输出: 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字.比如输出'hello, world',用代码实现如下: >>> print('hello, ...

  4. 从0开始的Python学习015输入与输出

    简介 在之前的编程中,我们的信息打印,数据的展示都是在控制台(命令行)直接输出的,信息都是一次性的没有办法复用和保存以便下次查看,今天我们将学习Python的输入输出,解决以上问题. 复习 得到输入用 ...

  5. Python核心技术与实战——四|Python黑箱:输入与输出

    抽象的看,Python程序可以被看成一个黑箱:通过输入流将数据送达,经过处理后在输入,也就是说具备了一个图灵机运作的必要条件. 输入输出基础 最简单的输入是来自键盘的操作 name = input(' ...

  6. Python学习--02输入和输出

    命令行输入 x = input("Please input x:") y = raw_input("Please input x:") 使用input和raw_ ...

  7. Python学习--02输入和输出、运算符

    命令行输入 x = input("Please input x:") y = raw_input("Please input x:") 使用input和raw_ ...

  8. Python 文件的输入与输出

    1. 文本文件的读写主要通过open()所构建的文件对象来实现.我们打开一个文件,并使用一个对象来表示该文件 , f = open(d,r) 其中d是文件名,r是模式 "r" 文件 ...

  9. Python简介之输入和输出

    输出 输入 输出 用print()在括号中加上字符串就可以向屏幕上输出指定的文字.比如输出'hello,world!',用代码实现如下:print('hello world!'). print()函数 ...

随机推荐

  1. TCP三次握手及四次断开,TCP有限状态机

    TCP 的连接建立 上图画出了 TCP 建立连接的过程.假定主机 A 是 TCP 客户端,B是服务端.最初两端的 TCP 进程都处于 CLOSED 状态.图中在主机下面的是 TCP进程所处的状态.A ...

  2. Vue实际中的应用开发【分页效果与购物车】

    作者 | Jeskson 来源 | 达达前端小酒馆 分页组件 首先来创建项目: 分页组件,做项目不要写动手写代码,要想想业务逻辑,怎么写,如何写才是最好的呈现方式,做项目不急,要先想好整体的框架,从底 ...

  3. [LeetCode] 888. Fair Candy Swap 公平糖果交换

    Alice and Bob have candy bars of different sizes: A[i] is the size of the i-th bar of candy that Ali ...

  4. Linux设置定时任务方法

    linux下定时执行任务的方法: 在LINUX中你应该先输入crontab -e,然后就会有个vi编辑界面,再输入0 3 * * 1 /clearigame2内容到里面 :wq 保存退出.   在LI ...

  5. C++ 版本ORM访问数据库之ODB访问oracle的Demo(三)

    ODB的组成部分: 1: 操作系统的ODB编译器 2: odb核心库libodb 3: 各种数据库的相关链接库 使用ODB访问数据需要的库和头文件(不懂, 请看https://www.cnblogs. ...

  6. [转载]3.1 UiPath鼠标操作元素的介绍和使用

    一.鼠标(mouse)操作的介绍 模拟用户使用鼠标操作的一种行为,例如单击,双击,悬浮.根据作用对象的不同我们可以分为对元素的操作.对文本的操作和对图像的操作 二.鼠标对元素的操作在UiPath中的使 ...

  7. Javascript笔记:作用域和执行上下文

    一.作用域 Javascript的作用域规则是在编译阶段确定的,有声明时的位置决定. JS中有全局作用域,函数作用域,块级作用域(ES6引入). 1. 全局作用域 在整个程序生命周期内都是有效的,在任 ...

  8. [Powershell]使用Msbuild构建基于.NET Framework的WebAPI项目

    查找最高版本的MsBuildTools. 清理缓存垃圾. 还原NuGet包. 构建解决方案. 按项目发布程序到本地. 按项目ZIP打包. <# .NOTES ================== ...

  9. jmeter和ab的对比

    压测比较常用的工具:ab,webbench,jmeter ab和webbench作为shell模式下轻量级的测试工具,ab比webbench功能更多一些 jmeter作为有GUI界面的更高级测试工具 ...

  10. HTTP之网关的分类

    网关的分类 ========================摘自<HTTP权威指南>============================= 1.  HTTP/*:服务器端Web网关 请 ...