一、argparse模块
1. 定义
(1)argparse模块使编写用户友好的命令行接口变得容易。
(2)程序定义了它需要的参数,而argparse将找出如何从sys.argv中解析这些参数。
(3)argparse模块还会自动生成帮助和使用消息,并在用户给程序提供无效参数时发出错误信息。
2. 讲解
import argparse # 导入库
parser = argparse.ArgumentParser() # 获取所有参数
parser.add_argument(“-n1”, “–number one”, help=“第一个参数”, type=int) # 添加参数1
parser.add_argument(“-n2”, “–number two”, help=“第二个参数”, type=int) # 添加参数2
args = parser.parse_args() # 解析所有参数
实战:
import argparse # 导入库 parser = argparse.ArgumentParser() # 获取所有参数 # print(parser) #添加参数 #第一个参数 parser.add_argument('number1',help='第一个参数',type=int) #第二个参数 parser.add_argument('number2',help='第二个参数',type=int) #解析参数 args = parser.parse_args() #获取参数 print('第一个参数',args.number1) print('第二个参数',args.number2) print('所有参数',args)
注意,我们运行该代码时,需要在命令行运行
下面我们就运用这个argparse来动态加载我们指定的图片
import cv2 import argparse #加载参数 parse = argparse.ArgumentParser() #添加参数 parse.add_argument('path_image',help='path to input the image') #解析参数 args = parse.parse_args() #加载图片,方式一 image = cv2.imread(args.path_image) #展示图片 cv2.imshow('image',image) #加载图片,方式二。将图片路径转换成字典形式 args_dict = vars(parse.parse_args()) #{'path_image':'123.png'} image2 = cv2.imread(args_dict['path_image']) #展示图片 cv2.imshow('image2',image2) #等待 cv2.waitKey(0) #关闭窗口 cv2.destroyAllWindows()
终端命令行运行
python 03.read_picture.py 123.png
两种方式都展示了照片
这样,当我们读取不同图片时,就可以在命令行动态指定,不需要我们经常修改代码
二、读取、处理、保存图片
1.读取图片
cv2.imread()
2.灰度处理
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
3.保存图片
cv2.imwrite(img2_path, gray_img) #img_path: 图片路径,gray_img: 处理后的图片
import cv2 import argparse #加载参数 parse = argparse.ArgumentParser() #添加参数 parse.add_argument('ori_image',help='path to input the image') parse.add_argument('out_image',help='save the new image') #解析参数 args = parse.parse_args() #加载图片。将图片路径转换成字典形式 args_dict = vars(parse.parse_args()) #{'path_image':'123.png'} image = cv2.imread(args_dict['ori_image']) #图片灰度处理 gray_image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) #保存处理后的图片 cv2.imwrite(args_dict['out_image'],gray_image) #显示图片 cv2.imshow('ori_image',image) cv2.imshow('out_image',gray_image) cv2.waitKey(0) cv2.destroyAllWindows()
命令行执行
python .\04.图片处理.py .\123.png 234.png
灰度处理成功,并且保存图片成功
三、读取摄像头、视频文件
人脸识别,人脸支付领域应用比较多
交通领域车辆车牌识别
- cv2.VideoCapture() 从摄像头获取视频流
- capture.get() 获取帧的属性
- capture.isOpened() 判断摄像头是否打开
- cv2.waitKey(20) & 0xFF == ord(‘q’) 键盘输入q退出
- cv2.waitKey(20) & 0xFF == ord(‘c’) 键盘输入c截取帧
- capture.release() 释放资源
项目实战
1.从摄像头读取
import cv2 import argparse parser = argparse.ArgumentParser() parser.add_argument("index_camera", help="the camera ID", type=int) args = parser.parse_args() print("the camera index :", args.index_camera) capture = cv2.VideoCapture(args.index_camera) # 视频捕获 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("帧的宽度: {}".format(frame_width)) print("帧的高度: {}".format(frame_height)) print("FPS: {}".format(fps)) if capture.isOpened() is False: print("Error Camera !") # 读取视频直到关闭 while capture.isOpened(): # 通过摄像头,一帧一帧的捕获 ret, frame = capture.read() if ret is True: # 显示捕获的帧 cv2.imshow("frame", frame) # 将捕获的帧转化为灰度的帧 gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 显示灰度的帧 cv2.imshow("gray frame", gray_frame) # 键盘输入q,退出视频捕获,关闭摄像头 if cv2.waitKey(20) & 0xFF == ord('q'): break else: break # 释放 capture.release() cv2.destroyAllWindows()
#运行流程
Terminal —> python read_camera.py 0
由于我这台台式机没安装摄像头,所以没有输出视频
正常有摄像头电脑会显示出视频
并输出相关我们打印的数据
2.从视频文件读取视频内容
# 1 加载库 import cv2 import argparse # 2 获取参数 parser = argparse.ArgumentParser() # 3 添加参数 parser.add_argument("video_path", help="the path to the video file") # 4 解析参数 args = parser.parse_args() # 5 加载视频文件 capture = cv2.VideoCapture(args.video_path) #获取视频参数 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("视频宽度: {}".format(frame_width)) print("视频高度: {}".format(frame_height)) print("FPS: {}".format(fps)) # 6 读取视频 ret, frame = capture.read() # ret 是否读取到了帧(图片) while ret: cv2.imshow("video", frame) #一旦读取到,就继续一帧一帧地往下读取 ret, frame = capture.read() # 继续读取帧 if cv2.waitKey(20) & 0xFF == ord('q'): break capture.release() cv2.destroyAllWindows() # 关闭
命令行执行
python .\06.从视频文件读取视频.py .\buildings.mp4
视频可以顺利播放
3.保存从摄像头读取的视频
api介绍
- 视频编码:
fourcc = cv2.VideoWriter_fourcc(*‘XVID’)
灰度写入视频文件
cv2.VideoWriter(args.video_output, fourcc, int(fps), (int(frame_width), int(frame_height)), False)
实战代码:
# 1 导入库 import cv2 import argparse # 2 获取参数 parser = argparse.ArgumentParser() # 3 添加参数 parser.add_argument("video_output", help="the path to the output video") # 4 解析参数 args = parser.parse_args() # 5 捕获摄像头 capture = cv2.VideoCapture(0) # 6 是否打开了摄像头 if capture.isOpened() is False: print("Camera Error !") # 7 获取帧的属性:宽,高,以及fps 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) # 8 对视频进行编码 fourcc = cv2.VideoWriter_fourcc(*"XVID") #false表示灰度方式写入 output_gray = cv2.VideoWriter(args.video_output, fourcc, int(fps), (int(frame_width), int(frame_height)), False) # 9 读取摄像头 while capture.isOpened(): ret, frame = capture.read() # 一帧一帧地读取 if ret is True: # 10 将读取到的帧转换为灰度 gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 11 将转换后的帧写入都新的视频文件中 output_gray.write(gray_frame) # 12 显示视频 cv2.imshow("gray", gray_frame) # 13 等待或按q退出 if cv2.waitKey(1) & 0xFF == ord('q'): break else: break # 14 释放资源 capture.release() output_gray.release() cv2.destroyAllWindows()