cv2-加载和保存
图像视频加载和保存
图像读取
import cv2
print(cv2.version.opencv_version)
image = cv2.imread(filename,flags)
h, w, c = image.shape
rows,cols,ch=img.shape
# 行,列,通道
# 高,宽,ting
# h, w, cl
"""
cv2.imread() 两个参数(filename,flags)
其中 flags 为色彩空间
IMREAD_COLOR 彩色
IMREAD_GRAYSCALE 灰色
函数读取RGB图像时,返回的图像格式的通道并不是按R、G、B排列的,而是按B、G、R顺序排列的,
image.shape= h,w,c
"""
cv2.cvtColor(src,code)
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
"""
yo颜色空间转化
cv2.COLOR_BGR2RGB 将BGR格式转换成RGB格式
cv2.COLOR_BGR2GRAY 将BGR格式转换成灰度图片
....
"""
输出图片
cv2.imshow("Display window", img)
cv2.waitKey(0)
"""
两个参数,显示窗口名称name,img
"""
图像保存
保存图片
img = np.asarray(img).astype(float)
cv2.imwrite('D:\\code\\1.png',img)
"""
cv2.imwrite()两个参数 filename, img
对于cv2.imwrite()则需要把它的动态范围转变到[0,255]才能正确保存
"""
压缩和解压
从指定的缓存中,读出数据,并进行格式转码,用于网络传图的恢复
"""
cv2.imdecode 从网络中读取数据并转换格式
cv2.imencode() 将图片编码到缓存,保存到本地
"""
img_cv = cv2.imdecode(np.frombuffer(img, np.uint8), cv2.IMREAD_COLOR)
import cv2
import numpy as np
# import urllib # 导入 urllib h
import urllib.request
url = 'http://www.pyimagesearch.com/wp-content/uploads/2015/01/google_logo.png'
resp = urllib.request.urlopen(url)
bytearr=bytearray(resp.read())
image = np.asarray(bytearr, dtype="uint8")
image = cv2.imdecode(image, cv2.IMREAD_COLOR)
cv2.imshow('URL2Image',image)
cv2.waitKey()
img = cv2.imread('0122.jpg')
# '.jpg'表示把当前图片img按照jpg格式编码,按照不同格式编码的结果不一样
img_encode = cv2.imencode('.jpg', img)[1]
data_encode = np.array(img_encode)
str_encode = data_encode.tobytes()
视频读取
VideoCapture()
VideoCapture() 是用于从视频文件、图片序列、摄像头捕获视频的类
cap = cv2.VideoCapture( *args, **kwargs)
"""输出参数
(1) 输入视频路径 (str)
cv2.VideoCapture('D:/123.mp4')
(2) 输入摄像头id
cv2.VideoCapture(0)
"""
相关属性
cap.read()
cap.release()
cap.get()
cap.set()
cap.open()
cap.grab()
cap.isOpened()
cap.getBackendName()
cap.getExceptionMode()
fps = cap.get(cv2.CAP_PROP_FPS) # 获取视频fps
frame_all = cap.get(cv2.CAP_PROP_FRAME_COUNT) # 获取视频总帧数
rval, frame = cap.read() # 返回两个参数rval
"""
ret是布尔值,读取帧是正确.返回True,文件结尾,返回值False。
frame就是每一帧的图像,是个三维矩阵 (720, 1280, 3)
"""
# cv2.imshow() 显示
cap = cv2.VideoCapture('D:/123/MP4')
if cap.isOpened():
print('读取数据流成功')
else:
print('失败')
rate =cap.get(cv2.CV_CAP_PROP_FPS) # 获取帧率
# 循环读取每一帧
while True:
rval, frame = cap.read()
if rval:
cv2.imshow('frame', frame)
cv2.waitKey(10)
else:
cv2.waitKey(1000)
break
cap.release() # 释放视频流
cv2.destroyAllWindows() # 关闭所有窗口
cap.get()
cap.get() 参数
cv2.CAP_PROP_FPS 视频帧率
cv2.CAP_PROP_FRAME_COUNT 视频总的帧数
cv2.CAP_PROP_FRAME_WIDTH 帧的宽度
cv2.CAP_PROP_FRAME_HEIGHT 帧的高度
cv2.CAP_PROP_POS_MSEC 当前视频读取的时间戳
cv2.CAP_PROP_POS_FRAMES 基于0的索引将被解码/捕获下一帧
cv2.CAP_PROP_POS_AVI_RATIO
cv2.CAP_PROP_FOURCC 视频编码器格式
cv2.CAP_PROP_FORMAT byretrieve()返回的Mat对象的格式
cv2.CAP_PROP_MODE 指示当前捕获模式的后端特定值
cv2.CAP_PROP_BRIGHTNESS 视频图像的亮度(仅适用于相机)
cv2.CAP_PROP_CONTRAST 视频图像对比度(仅适用于相机)
cv2.CAP_PROP_SATURATION 视频图像的饱和度(仅适用于相机)
cv2.CAP_PROP_HUE 视频图像的色相(仅适用于相机)
cv2.CAP_PROP_GAIN 视频图像的增益(仅适用于相机)
cv2.CAP_PROP_EXPOSURE 视频的曝光(仅适用于相机)
cv2.CAP_PROP_CONVERT_RGB 视频图像是否已转换为RGB的布尔标志
cv2.CAP_PROP_WHITE_BALANCE_U 白平衡的U值
cv2.CAP_PROP_WHITE_BALANCE_V 白平衡的V值
cv2.CAP_PROP_RECTIFICATION 立体摄像机的整流标志
视频保存
cv2.VideoWriter()
cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor=None)
- filename :文件路径
- fourcc: 四个字符用来表示压缩帧的codec
- fps: 视频帧率
- frameSize 要保存的文件的画面尺寸
(w,h)
(img.shape(1),img.shape(0))
- isColor:默认为True, 默认是彩色
#fourcc意为四字符代码(Four-Character Codes),顾名思义,该编码由四个字符组成,下面是VideoWriter_fourcc对象一些常用的参数,注意:字符顺序不能弄混
cv2.VideoWriter_fourcc('I', '4', '2', '0')
# 未压缩的YUV颜色编码,4:2:0色度子采样。兼容性好,但文件较大。文件扩展名.avi
cv2.VideoWriter_fourcc('P', 'I', 'M', 'I'),
MPEG-1编码类型,文件扩展名.avi。随机访问,灵活的帧率、可变的图像尺寸、定义了I-帧、P-帧和B-帧 、运动补偿可跨越多个帧 、半像素精度的运动向量 、量化矩阵、GOF结构 、slice结构 、技术细节、输入视频格式
cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')
# MPEG-4编码类型,视频大小为平均值,MPEG4所需要的空间是MPEG1或M-JPEG的1/10,它对运动物体可以保证有良好的清晰度,间/时间/画质具有可调性
cv2.VideoWriter_fourcc('T', 'H', 'E', 'O')
# 音频压缩格式,有损压缩,类似于MP3等的音乐格式。,兼容性差,件扩展名.ogv
cv2.VideoWriter_fourcc('F', 'L', 'V', '1'),
# FLV是FLASH VIDEO的简称,FLV流媒体格式是一种新的视频格式。由于它形成的文件极小、加载速度极快,使得网络观看视频文件成为可能,它的出现有效地解决了视频文件导入Flash后,使导出的SWF文件体积庞大,不能在网络上很好的使用等缺点。文件扩展名为.flv。
# 定义编解码器和创造对象
fourcc = cv2.VideoWriter_fourcc('I', '4', '2', '0')
videoWrite = cv2.VideoWriter('out.avi',fourcc,20.0,(640,480))
videoWrite.write(img)
# 案例
# 在视频的每帧上面添加 文字
import cv2
old_videopath='/home/old.avi'
new_videopath='/home/new.avi'
video = cv2.VideoCapture(old_videopath)
# get size and fps of video
width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = video.get(cv2.CAP_PROP_FPS)
fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', '2')
outVideo = cv2.VideoWriter(new_videopath, fourcc, fps, (width, height))
while (True):
ret, frame = video.read()
if not ret:
print("... end")
break
cv2.putText(frame, 'This is a test', (int(width / 20), int(height / 8)),cv2.FONT_HERSHEY_SIMPLEX, 6, (0, 255, 0), 20, cv2.LINE_AA)
cv2.namedWindow('frame', 0)
cv2.imshow('frame', frame)
cv2.waitKey(2)
outVideo.write(frame)
cv2.destroyAllWindows() # 关闭所有窗口
video.release() # 释放视频流
outVideo.release() # 释放视频流
实用变换
视频转图像(抽帧)
def extract_frames(video_path, save_dir, img_name, step=1):
"""
:param video_path: 视频文件
:param save_dir: 保存的目录
:param png_name: 图片名称
:param step: 抽帧间隙 step>=1
:return:
"""
video = cv2.VideoCapture()
if not video.open(str(video_path)):
print("can not open the video")
count = 0
while True:
_, frame = video.read()
if frame is None:
break
if count % step == 0:
imgfile_path = os.path.join(str(save_dir), str(img_name) + '-' + '{:04d}.png'.format(count))
# '{:04d}.png' 四位编号以0补齐
cv2.imwrite(imgfile_path, frame)
count += 1
video.release()
return
video_path = Path('databases/video/123.avi')
save_path = Path('databases/image2')
png_name = 'imge'
extract_frames(video_path, save_path, png_name, 1)
图像转视频(合成)
import cv2
from pathlib import Path
def image2video(img_dir, savevideo_path, savevideo_name, startimg_path,
V_fourcc=cv2.VideoWriter_fourcc('I', '4', '2', '0'),
V_FPS=7):
"""
:param img_dir: 图像目录
:param savevideo_path: video要保存位置
:param savevideo_name: video要保存名字
:param startimg_path: 起始图像
:param V_fourcc: 保存格式
:param V_FPS: 保存帧率
:return:
"""
# res = [x for x in reslist if os.path.isfile(x) and os.path.splitext(x)[0] == '.jpg' or '.png'] # img_dir(str)
imgfile_list = [x for x in img_dir.iterdir() if x.is_file() and x.suffix == '.jpg' or '.png'] # img_dir(Path)
startimg = cv2.imread(startimg_path)
imgInfo = startimg.shape
size = (imgInfo[1], imgInfo[0]) # 注意size
videoWrite = cv2.VideoWriter(str(savevideo_path.joinpath(savevideo_name)), V_fourcc, V_FPS, size)
# 写入对象 1 file name 2 编码器 3 帧率 4 尺寸大小
for i, imgfile in enumerate(imgfile_list):
img = cv2.imread(str(imgfile)) # read img
videoWrite.write(img) # write img
print('end1')
return
img_dir = Path('./databases/image/99')
savevideo_path = Path('./databases/image/99')
startimg_path = Path('./databases/image/99_75.jpg')
savevideo_name = 'test.avi'
fourcc = cv2.VideoWriter_fourcc('I', '4', '2', '0')
image2video(img_dir, savevideo_path, savevideo_name, startimg_path, V_fourcc=fourcc, V_FPS=7)