目录
2.1 opencv 基础入门
1. 图片读显存
- 图像基本概念:图像由像素点组成,每个像素点包含三个值R,G,B,取值范围在0-225之间,其值越大则强度越大,越接近于白色,一般来说一个彩色图像是具有三个通道构成的数组,灰度图像只有一个表示强度的通道。
- 函数讲解:cv2.imread;cv2.imshow;cv.imwrite
1.1 读取图片:retval= cv2.imread(filename, flags)
说明:retval 表示返回值,为一个numpy数组;filename表示图片的路径,需要注意不能包含中文路径,且路径错误时不会报错,但retval为none;flags表示读取图片的格式,主要有以下三种:
cv2.IMREAD_COLOR:默认参数,彩图,可以用1代替,忽略alpha通道;
cv2.IMREAD_GRAYSCALE:读入灰度图片,可以用0代替;
cv2.IMREAD_UNCHANGED:读取完整图片,可以用-1代替,包括alpha通道。
1.2 显示图像:cv2.imshow(window_name, image) #窗口自适应图片大小
说明:window_name表示窗口的名称,image为读取进来的图像
1.3 保存图片:retval =cv2.imwrite(filename,image,num)
说明:retval为True表示保存成功,反之为False;filename表示保存文件路径,一般来说也不可以包含中文,image表示需要保存的图像,num是可选参数,针对特定图片格式:
JPEG/jpg,num表示的是图像质量,默认为95,取值范围为0-100的整数,值越大保存质量越高。需要配合函数使用
Png:num表示压缩级别,默认为3,取值范围为0-9,值越大则图片压缩的越小,压缩时间越长。需要配合函数使用
alpha通道是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度复信息,定义透明、不透明和半透明区域,其中黑表示全透明,白表示不透明,灰表示半透明。
- 代码示例:显示框时长、删除窗口、更改保存图片大小与质量等
import cv2
#1. 读取图片
img = cv2.imread('1.png', cv2.IMREAD_COLOR) #彩色图像
print(type(img),img.shape)
# img = cv2.imread('messi5.jpg', 0) #灰度图片
#2. 展示图片
cv2.imshow('image',img)
cv2.waitKey(0) #无限等待键盘输入,键入程序将会继续运行
#cv2.destroyAllWindows() # 删除所有建立的窗口
cv2.destroyWindow('image') #删除指定窗口,需要传入特定窗口名称
#3.写入图片
cv2.imwrite('messigray.png',img,3) #普通写入
cv2.imwrite('111.png',img, [int( cv2.IMWRITE_JPEG_QUALITY), 95]) #更改图片质量
cv2.imwrite('11.png',img, [int(cv2.IMWRITE_PNG_COMPRESSION), 8]) #压缩图片
2. 读显存进阶
- 函数讲解:cv2.imdecode;cv2.imencode;cv2.encode
2.1 读取含中文路径图片:cv2.imdecode(buf,flags)
说明:从指定内存缓存中读取数据,并把数据转换(解码)成图像格式,常用于从网络传输数据中恢复出图像。buf表示以字节为单位接收到的图像数据;flags表示读取图片的格式,与上文imread中flags一致。
如果给定的 buf 不是图像数据,则将返回 NULL
2.2 写入含中文路径图片:retval = cv2.imencode(ext, img[, params])
说明:将图片格式转换(编码)成流数据,赋值到内存缓存中,主要用于图像数据格式的压缩,方便网络传输。ext表示图片名称后缀,img为np.ndarray格式的图像,params表示保存图片的参数,与imwrite中num参数一致;retval为二元数组,第一个元素与cv2.imwrite返回值一致,第二个元素为np.ndarray类型的图像文件内容。
2.3 将图像编码到内存缓冲区中:cv2.encode
说明:将数组中的数据以二进制格式写进文件:np.tofile
- 代码示例: 中文路径的读取与保存,以及显示设置的键盘交互
import cv2
import numpy as np
#1. 读取中文路径的图像
imgFile = "图1.png" # 带有中文的文件路径和文件名
img = cv2.imdecode(np.fromfile(imgFile, dtype=np.uint8), -1)
#2. 展示图片
cv2.imshow('image',img)
k= cv2.waitKey(0) #等待键盘输入,键入程序将会继续运行
if k ==27: #esc键继续往下执行
cv2.destroyWindow('image') #删除指定窗口,需要传入特定窗口名称
elif k == ord('s'): # s键保存图片
saveFile = "测试图.jpg" # 带有中文的保存文件路径
img_write = cv2.imencode(".jpg", img)[1].tofile(saveFile)
3. 视频读存属性
- 视频基本概念:视频是由一系列的图片组成的,它们被称为 “帧” (frame)。所以,所需做的就是通过循环将一个是视频流中的所有的帧都进行处理,每次处理一帧。
- 函数讲解:
3.1 创建读取视频的对象:cap = cv2.VideoCapture(path)
说明:path表示视频的路径。1)当其为帧数时,读取本地摄像头,0为默认相机;2)当其为视频路径时,表示读取本地视频文件;3)当前为url时,表示读取指定ip摄像头。
3.2 判断视频是否打开:retval = cv.VideoCapture.isOpened()
说明:retval为布尔类型数据,当其为True时,表示视频已成功捕获;当其为False时表示视频被破坏或者一些帧被破坏。
3.3 读取每帧图像:retval, frame = cv.VideoCapture.read( [, frame] )
说明:retval为布尔类型数据,当其为True时,表示该帧数据是否被正确读取,当读取到视频末尾,返回False;frame表示该帧视频的像素点。
3.4 视频保存:cv2.VideoWriter (path, fourcc, fps, size)
说明:path表示视频保存地址;fourcc表示视频编码器4字节代码;fps(float)表示视频帧率,size(数组)表示保存视频的帧的大小,为(宽,高)
3.5 获取视频的编码器:fourcc = cv2.VideoWriter_fourcc(*'XVID')
说明:fourcc是视频的播放格式,主要包括DIVX(“.avi”), MJPG(“.mp4”), X264(“.mkv”)等,其中DIVX被应用最为广泛,Windows和os中都可以应用。被传给代码的写入方法为cv2.VideoWriter_fourcc("D","I","V","X")
3.6 释放视频:cap.realease()
3.7 将图片变为灰度图:cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
3.8 修改视频的属性信息: cap.set(propId,value)
说明:proid: 属性的索引;value: 修改后的属性值
3.9 获取视频属性:retval = cap.get(propId)
说明:propId(0-18数字):每个数字表示视频的属性,常用属性为0-7如下图
- 代码示例
import cv2
cap = cv2.VideoCapture('2.dav') # 读取视频文件
#VideoCapture()中参数是0,表示打开笔记本的内置摄像头。
# video = cv.VideoCapture(0)
# 读取ip摄像头, 举例海康威视摄像头主码流
#reader = cv2.VideoCapture("rtsp://admin:12345@192.168.2.65:554/h264/ch1/av_stream")
if (cap.isOpened() == False): # 检查是否正确打开
print("Error opening the video file")
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc,20.0, (640,480))
while cap.isOpened():
ret, frame = cap.read()
if frame is None:
break
if ret: # 若是读取成功
# gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #转为灰度图像显示
cv2.imshow('frame', frame) # 显示读取到的这一帧画面
out.write(frame)
key = cv2.waitKey(25) # 等待一段时间25毫秒,并且检测键盘输入
if key == ord('q'): # 若是键盘输入'q',则退出,释放视频
cap.release() # 释放视频
break
else:
cap.release()
out.release()
cv2.destroyAllWindows() # 关闭所有窗
标签:视频,读取,img,cv2,opencv,数据处理,2.1,retval,图片 From: https://blog.csdn.net/m0_59148663/article/details/144163142补充:视频读写进阶