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)
下列代码是归一化的实现
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
- 点赞
- 收藏
- 关注作者
评论(0)