提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 1. 图片
- 2.视频(读取摄像头、视频文件)
- 2.1 从摄像头读视频
- 2.2 从视频读取文件
- 2.3 保存摄像头读取的视频
- 2.4 图片的打开,读取和保存代码
- 2.5 摄像头的打开,读取和保存代码
- 2.6 从文件读取
- 2.6 从视频读取,再保存回视频
- 总结
前言
本章主要学习图片和视频的读取和保存
1. 图片
- 读取
cv2.imread(img_path),img_path :图片路径
img_path 不存在,不会报错,但返回的是None, 这一点其实挺坑的,需要业务上做判断. - 显示
cv2.imshow(img),img : 图片
这种方式会一闪而过,需要结合 cv2.waitkey(0) 和 cv2.destroyAllwindows() 使用
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 - 灰度处理
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) - 保存图片
cv2.imwrite(img_path, img_new)
img_path: 图片路径,img_new: 处理后的图片
2.视频(读取摄像头、视频文件)
2.1 从摄像头读视频
- cv2.VideoCapture() 从摄像头获取视频流
- capture.get() 获取帧的属性
- capture.isOpened() 判断摄像头是否打开
- cv2.waitKey(20) & 0xFF == ord(‘q’) 键盘输入q退出
- cv2.waitKey(20) & 0xFF == ord(‘c’) 键盘输入c截取帧
- capture.release() 释放资源
2.2 从视频读取文件
其实没有本质区别
2.3 保存摄像头读取的视频
-
视频编码:
fourcc = cv2.VideoWriter_fourcc(*‘XVID’) -
灰度写入视频文件
cv2.VideoWriter(args.video_output, fourcc, int(fps), (int(frame_width), int(frame_height)), False)
2.4 图片的打开,读取和保存代码
# 1.导入库
import cv2
import argparse
# 2. 获取参数
parser = argparse.ArgumentParser()
# 3. 参加参数
parser.add_argument("img_input",help="read one image")
parser.add_argument("img_output",help="save the processed image")
# 4. 解析参数, 以字典形式保存参数和值
args = vars(parser.parse_args())
print(args)
# exit("=" * 100)
# 5. 加载图片
img = cv2.imread(args["img_input"])
# 6.处理: 灰度处理
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 7 保存图片
cv2.imwrite(args["img_output"],img_gray)
# 8 显示图片
cv2.imshow("Original Image", img)
cv2.imshow("Gray Image", img_gray)
# 9 等待
cv2.waitKey(0)
# 10 关闭窗口
cv2.destroyAllWindows()
启动命令
python demo1.py ../images/children.jpg ./1.jpg
2.5 摄像头的打开,读取和保存代码
自己看代码把,写的都很清楚.
# 从摄像头读取
import cv2
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("index_camera",help="the camera ID", type=int)
args = parser.parse_args()
# 视频捕获
##
##capture = cv2.VideoCapture(args.index_camera)
## [ WARN:0@2.521] global D:\a\opencv-python\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (539) `anonymous-namespace'::SourceReaderCB::~SourceReaderCB terminating async callback
##
# 方法二:(仅适用于Windows操作系统)
# 打开cmd并输入:
# setx OPENCV_VIDEOIO_PRIORITY_MSMF 0
## 这两个方法并不好使
capture = cv2.VideoCapture(0, 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("frame width:{}".format(frame_width))
print("frame height:{}".format(frame_height))
print("frames per second:{}".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
# if cv2.waitKey(20) & 0xFF == ord("q"):
# break
key_pressed = cv2.waitKey(100)
print('单机窗口,输入按键,电脑按键为',key_pressed,'按esc键结束')
if key_pressed == 27:
break
else:
break
# 释放
capture.release()
cv2.destroyAllWindows()
2.6 从文件读取
# 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)
# 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() # 关闭
2.5 和 2.6 很相似
2.6 从视频读取,再保存回视频
和前面的代码很相似,但要写入视频
只有这两部增加了
# 8 对视频进行编码
fourcc = cv2.VideoWriter_fourcc(*"XVID")
output_gray = cv2.VideoWriter(args.video_output, fourcc, int(fps), (int(frame_width), int(frame_height)), False)
# 10 将读取到的帧转换为灰度
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 11 将转换后的帧写入都新的视频文件中
output_gray.write(gray_frame)
完整代码
# 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")
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()
总结
其实读取视频这些很有用,比如从摄像头读取,可能给的是一个rstmp的地址流, 从视频流读取, 抽帧,再送入模型做识别,在报警. 这个时候就需要读取视频/抽帧这个服务常驻和读取识别的时候能够自充起, python的opencv在这方面有劣势,很多错误报不出来, c++版本的好一些, ffmeg更好,需要c++的功底.
git地址:https://github.com/justinge/opencv_tutorial.git