典型的文件处理流程如下:
利用命令行参数sys.argv命令行参数是读取文件时常用的方式。
命令行参数保存在 sys.argv 的列表中,列表的第一个元素是脚本名称,后面的元素是命令行参数:
通过以下脚本 sys_argv.py 可以熟悉命令行参数的获取:
1 import sys2 3 print(f'运行的脚本名是:{sys.argv[0]}')4 sys.argv 列表的长度是:{len(sys.argv)}5 该脚本的参数是:{sys.argv[1:]}')
运行命令 python sys_argv.py 666 yu 可以得到以下输出:
运行的脚本名是:sys_argv.pysys.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 break42 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 = 027 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 += 149 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 国际许可协议
总结
以上是内存溢出为你收集整理的Python+OpenCV4:读写输入和输出的简单实践(图片、视频、摄像头)全部内容,希望文章能够帮你解决Python+OpenCV4:读写输入和输出的简单实践(图片、视频、摄像头)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)