读取图像和视频
1、图像处理
在OpenCV中使用vc2.imread()函数读取图像,cv2.imread()有两个参数,第一个参数filename是图片路径,第二个参数flags表示图片读取模式,常用有两种。
cv2.IMREAD_COLOR:加载彩色图片,这个是默认参数,可以直接写1。
cv2.IMREAD_GRAYSCALE:以灰度模式加载图片,可以直接写0。
在OpenCV开发过程中,经常用将RGB图像转换为灰度图像进行操作,因为在灰度图像中更利于检测和操作。在OpenCV的任意阶段,均可以将灰度图与彩色图进行互相转换。
读取灰色图示例如下。
import cv2
img = cv2.imread(“xx.png”, cv2.IMREAD_GRAYSCALE)
或者
import cv2
img = cv2.imread(“xx.png”, 1)
运行结果如图1.1。
图1.1 灰度图运行结果
1.1 常用属性
img.shape:获取图片的hwc,其中h为图片高度,w为图片宽度,c为图片通道。彩色图像有3个通道,分别为B、G、R;灰度图像只有1个通道,使用shape属性查询后不显示通道个数。
type(img):type()函数用于查看变量类型,所有的图像对象的底层类型是numpy.ndarray类型。
img.size:用于获取图像的像素个数(即:宽 X 高)。
img.dtype:用于查看数据的类型。
cv2.imwrite(dst, img):用于保存图像到指定位置。dst表示存储的路径,img表示图像对象。
2、视频读取
2.1 读取视频或连接摄像头
OpenCV中使用cv2.VideoCapture(str | 0)函数来读取视频,返回值为cv2.VideoCapture类型,如果该函数中的值是str,参数是视频文件路径。如果函数中的值是0,表示打开笔记本的内置摄像头。
视频是由多帧组成,每一帧可以看成一张图像,将图像连接在一起就可以看成一个动态的图像集(即视频)。
示例如下。
video = cv2.VideoCapture("E:/tmp/img/2023711.mp4")
2.2 按帧读取视频
ret, frame = video.read()
video.read()按帧读取视频,ret, frame是获cap.read()方法的两个返回值。 其中ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵。
2.3 等待键盘输入
cv2.waitKey(50)
waitKey()方法本身表示等待键盘输入,参数是50,表示延时50ms切换到下一帧图像。
对于视频而言;参数为0,如cv2.waitKey(0)只显示当前帧图像,相当于视频暂停;参数过大如cv2.waitKey(1000),会因为延时过久而卡顿感觉到卡顿。
v2.waitKey()返回值是键盘输入的ASCII码,esc键对应的ASCII码是27,即当按esc键是if条件句成立。
2.4 显示每一帧图像
cv2.imshow("result", frame)
imshow()函数用于显示图像,result为是窗口的名字(ID),frame是需要显示图像的三维矩阵。
使用video.read()函数循环读取视频,然后使用cv2.imshow()函数循环在同一个窗口中显示,即可以实现视频播放效果。
2.5 释放摄像头
调用video.release()函数用于释放摄像头或视频,调用cv2.destroyAllWindows()关闭所有图像窗口。
2.6 视频读取示例
以下示例用于打开一个视频,并将每一帧图像修改为灰度图像,然后再循环显示出来,实现彩色视频转为黑白视频的效果。
import cv2
# 读取视频文件,参数为0表示打开摄像头
video = cv2.VideoCapture("E:/tmp/img/2023711.mp4")
while True:
# read()读取当前桢图片,返回两个值,ret用于接收是否成功读取,frame用于接收读取到的当前图像矩阵
ret, frame = video.read()
# 如果frame为空,则表示没有图像矩阵,中止循环即可
if frame is None:
break
# 如果当前图像为True,进行图像处理后再显示
if ret:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 将转换好的图像在result窗口中打开(即下一张会覆盖上一张)
cv2.imshow("result", gray)
# 如果键盘输入为Esc键,则结束视频
# 27表示Esc键,更多字符对应数字见“符号对应数字表”
# ord()函数用于将字符转为对应数字
key = cv2.waitKey(25)
if key == 27 or key == ord("q"):
break
# 释放视频
video.release()
# 销毁所有窗口
cv2.destroyAllWindows()