OpenCV(python)——一键入门--第3篇(归一化和视频操作入门)

1:图像归一化:

Python:cv.normalize(src[, dst[, alpha[, beta[, norm_type[, dtype[, mask]]]]]]) → dst

src——输入数组。

dst——与SRC大小相同的输出数组。

alpha——范数值在范围归一化的情况下归一化到较低的范围边界。

beta——上限范围在范围归一化的情况下;它不用于范数归一化。

范式——规范化类型(见下面的细节)。

dType——当输出为负时,输出数组具有与SRC相同的类型;否则,它具有与SRC相同的信道数和深度=CVH-MatthAsHead(DyType)。

mask——可选的操作mask。

这个函数提供了四种归一化方式,可根据需要选择以下四个参数,下面重点说下这四种归一化方式。

NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化。

NORM_INF: 归一化数组的(切比雪夫距离)L∞范数(绝对值的最大值)

NORM_L1 :  归一化数组的(曼哈顿距离)L1-范数(绝对值的和)

NORM_L2: 归一化数组的(欧几里德距离)L2-范数

(摘自https://blog.csdn.net/qq_29023939/article/details/81105806)

归一化介绍.png

下列代码是归一化的实现

src = cv.imread("d:/ma.jpg")
gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY)#转灰度
gray = np.float32(gray)#转浮点32,为了下面计算方便

#归一化
#minmax a=0,b=1
#inf,L1,L2 a=1,b=0
#minmax
dst = np.zeros(gray.shape,dtype=np.float32)
cv.normalize(gray,dst=dst,alpha = 0,beta = 1.0,norm_type=cv.NORM_MINMAX)
print(f"NORM_MINMAX: ----------\n\n{dst}")
cv.imshow("NORM_MINMAX", np.uint8(dst*255))

#inf
dst = np.zeros(gray.shape,dtype=np.float32)
cv.normalize(gray,dst=dst,alpha = 1.0,beta = 0,norm_type=cv.NORM_INF)
print(f"NROM_INF: --------------\n\n{dst}")
cv.imshow("NORM_INF", np.uint8(dst*255))
#L1
dst = np.zeros(gray.shape, dtype=np.float32)
cv.normalize(gray, dst=dst, alpha=1.0, beta=0, norm_type=cv.NORM_L1)
print(f"NROM_L1: --------------\n\n{dst}")
cv.imshow("NORM_L1", np.uint8(dst*10000000))
#L2
dst = np.zeros(gray.shape, dtype=np.float32)
cv.normalize(gray, dst=dst, alpha=1.0, beta=0, norm_type=cv.NORM_L2)
print(f"NROM_L2: --------------\n\n{dst}")
cv.imshow("NORM_L2",np.uint8(dst*10000) )

cv.imwrite("./dst.jpg",np.uint8(dst*10000))

2:保存图像

cv.imwrite("(路径+)图片名", 图像所在变量)

第一个参数是保存的路径及文件名,第二个是图像矩阵。
其中,imwrite()有个可选的第三个参数,如下:

cv.imwrite("D:\\cat.jpg", img,[int(cv2.IMWRITE_JPEG_QUALITY), 5])

第三个参数针对特定的格式: 对于JPEG,其表示的是图像的质量,
用0-100的整数表示,默认为95。 
注意,cv.IMWRITE_JPEG_QUALITY类型为Long,必须转换成int。

对于PNG,第三个参数表示的是压缩级别。cv.IMWRITE_PNG_COMPRESSION,
从0到9,压缩级别越高,图像尺寸越小。默认级别为3

3:视频处理与帧率调整

(注:以下代码摘自本人的实验代码,直接在代码中使用了cv2,线下动手尝试的时候记得做调整)

该demo主要是读取了视频,读取视频相关的属性,然后生成一个不同帧率的视频(素材原视频帧率40,生成一个15帧率的视频)

cap=cv2.VideoCapture('jnu.avi')
#以下是读取视频属性
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)  #帧高度
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)  #帧宽度
count = cap.get(cv2.CAP_PROP_FRAME_COUNT)  #帧数
fps = cap.get(cv2.CAP_PROP_FPS)  #帧率
print(f"height:{height}, width:{width}, count:{count}, fps:{fps}")#打印对应属性

#创建一个视频
out = cv2.VideoWriter("test.mp4", cv2.VideoWriter_fourcc('D', 'I', 'V', 'X'), 15,
                     (np.int(width), np.int(height)), True)#15为帧播放速率

while True:
    ret, frame = cap.read()
    if ret is True:
        cv2.imshow("video-input", frame) #逐帧展示
        out.write(frame)  #保存视频画面
        c = cv2.waitKey(50)
        if c == 27: # ESC
            break
    else:
        break
i=0
cap.release()  #使用完记得释放cap
out.release()

其中cap.get有以下参数可使用:

· 对于VideoCapture和VideoWriter_fourcc,有如下补充

#读取视频

import cv2
cap = cv2.VideoCapture('video.avi')

#读取摄像头,0为摄像头索引,当有多个摄像头时,从0开始编号

cap = cv2.VideoCapture(0)

#从视频或摄像头中读取一帧(即一张图像),返回是否成功标识ret
(True代表成功,False代表失败),img为读取的视频帧

ret,frame = cap.read()
--------------------------------------------------------------------
fourcc意为四字符代码(Four-Character Codes),顾名思义,该编码由四个字符组成
下面是VideoWriter_fourcc对象一些常用的参数,注意:字符顺序不能弄混

cv2.VideoWriter_fourcc('I', '4', '2', '0'),该参数是YUV编码类型,文件名后缀为.avi
cv2.VideoWriter_fourcc('P', 'I', 'M', 'I'),该参数是MPEG-1编码类型,文件名后缀为.avi
cv2.VideoWriter_fourcc('X', 'V', 'I', 'D'),该参数是MPEG-4编码类型,文件名后缀为.avi
cv2.VideoWriter_fourcc('T', 'H', 'E', 'O'),该参数是Ogg Vorbis,文件名后缀为.ogv
cv2.VideoWriter_fourcc('F', 'L', 'V', '1'),该参数是Flash视频,文件名后缀为.flv

分享小案例:以下demo是保存前15帧的图像,就不逐一解释,原理和上一个demo类似

cap=cv2.VideoCapture('jnu.avi')
out = cv2.VideoWriter("test.mp4", cv2.VideoWriter_fourcc('D', 'I', 'V', 'X'), 15,
                     (np.int(width), np.int(height)), True)#15为帧播放速率
while 1:
    if i==15:
        print('保存了视频的前15帧图像,保存结束')
        break
    else:
        i=i+1
        ret, frame = cap.read()
        file_name='img'+str(i)+'.jpg'
        cv2.imwrite(file_name, frame)

cap.release()
out.release()

参考文章链接:

https://blog.csdn.net/qq_29023939/article/details/81105806

https://blog.csdn.net/weixin_44934424/article/details/108094096

(完)