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)
posted @ 2021-07-05 18:47  贝壳里的星海  阅读(977)  评论(0编辑  收藏  举报