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 国际许可协议

参考

原文地址:https://www.cnblogs.com/noluye/p/11446146.html

时间: 2024-10-14 17:13:05

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

Python 文件的输入与输出

1. 文本文件的读写主要通过open()所构建的文件对象来实现.我们打开一个文件,并使用一个对象来表示该文件 , f = open(d,r) 其中d是文件名,r是模式 "r" 文件只读,使用 f.write()会报错 "w" 用于写入,每次使用f.write()都会把上一次给覆盖掉 "r+" 用于读写 "a" 文件追叫,每次写入会追加在前一次后面 ##1. 创建文件对象(%%在编代码的文件夹下建一个new.txt) f=ope

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

一 输入输出 python3中统一都是input,python2中有raw_input等同于python3的input,另外python2中也有input 1.res=input("python3: ") 2.res=raw_input("python2: ") 3.res=raw_input("python2: ") 1,2无论接收何种输入,都被存为字符串赋值给res,而3的意思是,用户输入何种类型,就以何种类型赋值给res #!/usr/bi

Python中的输入和输出

输入 input() #!/usr/bin/env python #-*- coding:utf-8 -*- username=input('请输入用户名: ') input()内置函数,返回字符串类型.如果输入的内容要作为其他类型使用,必须进行转换,如要转换为int,就要 int(要转换的标识符). 输出 print() 格式化输出 username='admin' password='123456' print('用户名为 %s ,密码为 %s' %(username,password))

python入门(输入、输出、if else 判断流、while循环、for循环)

# -*- coding:utf-8 -*-        -------- 申明字符编码集 注释:当行 -    # 多行 -    """ """ 或者 ''' '''  (在python中单引号双引号没有区别) 1. 输出 print ("hello word !") 2. 变量 定义编码:name = "hui" 使用编码:print ("name is",name)  (变量之

python注释、输入格式化输出输出及数据类型

一.python的注释 1.python中的注释 注释:对代码的解释或者评论,注释仅仅是给人看的,python本身不识别. 2.注释的分类 2.1. 单行注释 # 2.2. 三引号(可以是三个单也可以是三个双) 二.输入 1.python3中的输入 关键字:input() python3中的input获取的用户输入统一全部存成字符串类型 1.2.python2中的输入 1.2.1.input() 需要你人为的声明input输入的是什么数据类型 错误示范: 正确示范:   1.2.2.raw_in

Python之文件输入和输出

文件的打开方式 r        以只读方式打开 w        以写方式打开(必要时清空) a        以追加模式打开 r+        以读写方式打开 w+        以读写方式打开 a+        以读写方式打开 文件输入输出 方法                作用 read()      读取字节到字符串中,最多读取给定数目个字节 readline()    读取一行,包括行结束符,以字符串方式返回 readlines()    读取所有行,以列表方式返回 write

计算机的输入和输出

1.冯诺依曼计算机的输入和输出 2.简单的输入 假设cpu和存储器已经开始工作了,其中一条指令就是读取8个手动开关状态. cpu将地址发送到地址总线,地址总线识别出这个地址是输入输出的地址,而不是存储器的地址. 同时控制总线上cpu发出读的信号告知输入输出设备这是一个读的操作,输入输出的控制逻辑和地址译码 就会从地址为1111的读出数据11100000,通过数据总线送回到cpu.cpu根据这个数据调整后面的执行或者运算. 3.简单的输出 cpu给出输出单元对应的地址1110,通过地址总线传送到输

谈谈python的文件处理——文件的输入与输出

简单介绍一下python里IO的几种常用方式.当然除了以下介绍的几种方式之外,还可以参考python的手册,例如我想查找raw——input函数的用法,我就可以直接使用命令:python -m pydoc raw_input(windows底下)来查看使用方法,使用完毕时候,输入“q”作为退出.下面进入正题: 一.python中的输入 1.与命令行的“博弈”——raw_input函数 #Input: age = raw_input("How old are you? ") height

Python学习——输入和输出

(转自:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431643484137e38b44e5925440ec8b1e4c70f800b4e2000) 输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字.比如输出'hello, world',用代码实现如下: >>> print('hello, world') print()函数也可以接受多个字