python读取数据视频_Python+OpenCV4:读写输入和输出的简单实践(图片、视频、摄像头)...

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

1046925-20190902110859214-31478506.png

利用命令行参数

sys.argv

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

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

1046925-20190902111356940-1264727945.png

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

1 importsys2

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 importargparse2

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

读写图片

读入图片

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

1 """

2 读取图片3 """

4 importargparse5 importcv26

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 ,可以显示图片。

1046925-20190902125832962-961310771.png

读入/处理/写入图片

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

1 """

2 读入/处理/写入图片3 运行脚本 python argparse_load_processing_save_image.py [path_image_input] [path_image_output]4 """

5 importargparse6 importcv27

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()

运行脚本后的效果如下:

1046925-20190902131027652-825967878.png

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

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

读取+处理

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

1 """

2 读取摄像头数据3 处理数据并且展示数据4 """

5 importargparse6 importcv27

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() isFalse:23 print('Error openning the camera')24

25 whilecapture.isOpened():26 ret, frame =capture.read()27

28 ifret: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 importargparse6 importcv27

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() isFalse:23 print('Error openning the camera')24

25 frame_index =026 whilecapture.isOpened():27 ret, frame =capture.read()28

29 ifret: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()

读取视频文件

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

1 """

2 读取视频数据3 """

4 importargparse5 importcv26

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() isFalse:16 print('Error openning the video')17

18 whilecapture.isOpened():19

20 ret, frame =capture.read()21 ifret: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 。

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

1046925-20190902173115405-1057639051.png

保存一个视频文件

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

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

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

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

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

1046925-20190902145652892-1046450549.png

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

1 """

2 接收摄像头参数3 然后写入视频文件4 """

5

6 importcv27 importargparse8

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 whilecapture.isOpened():29

30 ret, frame =capture.read()31 if ret isTrue: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 文件。

参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值