加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2021-07-06 06:10:35 所属栏目:大数据 来源: https://www.jb51.cc
导读:典型的文件处理流程如下: 利用命令行参数 sys.argv 命令行参数 是读取文件时常用的方式。 命令行参数保存在 sys.argv 的列表中,列表的第一个元素是 脚本名称 ,后面的元素是 命令行参数 : ? 通过以下脚本 sys_argv.py 可以熟悉命令行参数的获取: 1 impor

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

利用命令行参数

sys.argv

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

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

?

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

1 import sys
2 
3 print(f'运行的脚本名是:{sys.argv[0]}')
4 sys.argv 列表的长度是:{len(sys.argv)}5 该脚本的参数是:{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  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  5  cv2
 创建 ArgumentParser 对象
 8 parser = argparse.ArgumentParser()
 9 
 添加参数,默认类型是字符串
path_image 解析参数
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?,可以显示图片。

?

读入/处理/写入图片

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

读入/处理/写入图片
运行脚本 python argparse_load_processing_save_image.py [path_image_input] [path_image_output]
 4  6  7 
10 parser.add_argument(path_image_input图像输入的路径11 
12 parser.add_argument(path_image_output图像输出的路径13 
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 image22 
23  保存处理后的文件
24 cv2.imwrite(args.path_image_output,1)">25 
26 27 
28 cv2.destroyAllWindows()

运行脚本后的效果如下:

?

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

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

读取+处理

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

读取摄像头数据
处理数据并且展示数据
index_camera摄像头编号12 args =14 capture = cv2.VideoCapture(args.index_camera)
 获取 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 camera24 
25 while capture.isOpened():
26     ret,frame = capture.read()
28     if ret:
29          显示摄像头捕获的帧
30         cv2.imshow(Input frame from the camera31 
32          把摄像头捕捉到的帧转换为灰度
33         gray_frame = cv2.cvtColor(frame,1)">34 
35          显示处理后的帧
36         cv2.imshow(Grayscale input camera37 
38          cv2.waitKey()这个函数是在一个给定的时间内(单位ms)等待用户按键触发
39          如果用户没有按下按键,则继续等待(循环)
40         if (cv2.waitKey(10) & 0xFF) == ord(q):
41             break
42     else:
43         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 键的时候,把某时刻的帧保存在硬盘上。

25 frame_index = 0
27     ret,1)">28 
29     30         31         cv2.imshow(32 
33         34         gray_frame =35 
36         37         cv2.imshow(38 
41         42             c44             frame_name = fcamera_frame_{frame_index}.png'
45             gray_frame_name = fgrayscale_camera_frame_{frame_index}.png46             cv2.imwrite(frame_name,1)">47             cv2.imwrite(gray_frame_name,1)">48             frame_index += 1
49     50         51 
52 53 cv2.destroyAllWindows()

读取视频文件

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

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

读取视频数据
 7 parser = 8 
 9 parser.add_argument(video_path视频文件路径10 
11 args =13 capture = cv2.VideoCapture(args.video_path)
14 
16     Error openning the video19 
20     ret,1)">21     22         23         cv2.imshow(Original frame from the video file25         26         gray_frame =28         29         cv2.imshow(Grayscale frame30 
31         34             35     38 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 需要考虑的一些因素。

?

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

接收摄像头参数
然后写入视频文件
 5 
 9 parser ="output_video_path",1)">path to the video file to write" cv2.VideoCapture(0)
16 frame_width =17 frame_height =18 fps =CV_CAP_PROP_FRAME_WIDTH: {frame_width}CV_CAP_PROP_FRAME_HEIGHT: {frame_height}21 CAP_PROP_FPS: {fps}23 fourcc = cv2.VideoWriter_fourcc(*XVID 最后一个参数指是否使用彩色图像
26 out_gray = cv2.VideoWriter(args.output_video_path,fourcc,int(fps),(int(frame_width),int(frame_height)),False)
28 29 
30     ret,1)">31     if ret  True:
35         out_gray.write(gray_frame)
36 
grayif cv2.waitKey(1) & 0xFF == ord(39             40     42 
43 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 国际许可协议

参考

  • 《Mastering OpenCV 4 with Python》by Alberto Fernandez Villan
  • argparse — Parser for command-line options,arguments and sub-commands
  • What's 0xFF for in cv2.waitKey(1)?
  • Usage of ord('q') and 0xFF
  • 关于为什么要用 if cv2.waitKey(1) & 0xFF == ord('q'): break的解释

?

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读