目录
一.图像视频的加载与显示
1.1创建和显示窗口
1.2加载显示图片
1.3保存图片
1.4视频采集
1.5视频录制
1.1创建和显示窗口
cv2.namedWindow() 创建命名窗口
cv2.imshow()显示窗口
cv2.destroyAllWindows() 销毁窗口
cv2.resizeWindow() 自定义窗口尺寸
cv2.waitKey() 等待结束时间
(ps:我是在pycharm下运行的,其他的编译器的代码可能运行会报错)
运行代码如下:
import cv2 #导入cv2库
#cv2.namedWindow('first',cv2.WINDOW_AUTOSIZE) # 创建名为‘first’的窗口,自动适应窗口大小(不能改变窗口大小)
cv2.namedWindow('first', cv2.WINDOW_NORMAL)
cv2.resizeWindow('first', 800, 100) # (window名字,宽,高)
# img=cv2.imread('face1.jpg')
cv2.imshow('first', 0) # 显示名为‘first’的窗口,0是指啥都不显示
key = cv2.waitKey(0) # 等待按键结束,0表示能接受任意按键;如果是其它整数,表示等待按键时间,单位ms; key是int型,16位
# print(ord('o')) ord()返回的是ASCII码
cv2.destroyAllWindows() # 销毁窗口
1.2加载显示图片
cv2.imread(path,flag) :读取图片,默认读取的是彩色图片;
详细代码讲解如下:
import cv2
import matplotlib.pyplot as plt
import pylab
import numpy as np
#读取图片
img = cv2.imread('./face1.jpg')
# 绝对路径(从根目录开始)和相对路径(在同一目录下的相对路径)都可以;
print(img.max())
# 如果格式为png,值为0~1的小数;jpg、jpeg为255~2500
print(img)
# img打印为numpy的ndarray
plt.imshow(img)
#在pycharm上显示matplotlib图片与真实不一样
pylab.show()
# 在pycharm上显示matplotlib图片一定要导入pylab库,再加上这句话才可以,不然无法显示
cv2.imshow('face1',img)
key = cv2.waitKey(0)
if key == ord('q'):
print('准备销毁窗口')
cv2.destroyAllWindows()
注意:
- 调用 cv2.imread()函数引用相对路径时,图片一定要放在此.py文件同一目录中才可以
- 要先用cv2.imread()读取图片,用参数指代图片的像素点数组,才可以再用cv2.imshow()函数显示图片像素点数组即显示图片,不能直接调用cv2.imshow()
- 左边是原图,matplotlib显示如右图:
(原图) (matplotlib)
我们可以发现:
- 在pycharm上显示matplotlib图片与真实不一样,因为opencv读进来的图片数据的通道不是默认的RGB(红绿蓝),而是BGR;
- 所以opencv读进来的图片一般不要用其他方式显示,比matplotlib,用cv2.imshow()就可以了;
- 在pycharm上显示matplotlib图片一定要导入pylab库,再调用函数pylab.show()才可以,不然无法显示
另外,可以把展示图片的代码封装成函数,方便经常调用。完整代码如下:
import cv2
import matplotlib.pyplot as plt
import pylab
import numpy as np
#自定义函数显示读取之后的图像
#防止主函数未导入库,可重新导入一下
import cv2
def cv_show(name,img):
cv2.imshow(name, img)
key = cv2.waitKey()
if key ==ord('q'):
cv2.destroyAllWindows()
#先读取再显示
#读取图片
img = cv2.imread('./face1.jpg')
#调用函数
cv_show('face1', img)
1.3保存图片
cv2.imwrite(path,img)保存图片
import cv2
img = cv2.imread('./face1.jpg')
cv2.imwrite('./fafa.jpg', img)
#用“./”表示将图片保存在同一目录下;
#如果不在同一目录下保存,则需要复制绝对路径
代码结果如下:
(将与此.py文件存放在同一目录下的图片'face1.jpg'保存为此目录下的'fafa.jpg'图片)
1.4视频采集
- cv2.VideoCapture() 可以捕获摄像头,用数字来表示不同的设备,如0,1;
- isOpened() 可以返回True,False,表示视频是否成功打开;
- read() 返回两个参数,第一个参数为bool类型,表示此帧是否读取成功,第二个是此帧图片的像素矩阵数据
- 如果是视频文件,可以直接指定路径;
import cv2
# 读取视频文件
vc = cv2.VideoCapture('./vc1.mp4')
# 读取摄像头
# vc = cv2.VideoCapture(0)
# 检查是否正确打开
# if vc.isOpened():
# 循环读取视频的每一帧
while True:
ret, frame = vc.read()
# ret为布尔类型,表示是否成功读取一帧数据;frame为读取图片的一帧
# 可以读到内容则ret返回True
if not ret:
print('打开失败')
break
# 进行下一帧读取
ret, frame = vc.read()
# 显示读取到的图片数据
cv2.namedWindow('xin', cv2.WINDOW_NORMAL)
cv2.resizeWindow('xin', 500, 700)
cv2.imshow('xin', frame)
key = cv2.waitKey(1000 // 30)
# 1000指视频时间(ms),30是视频总帧数
# 数值指读取下一帧的间隔时间,时间越长,播放速度越慢
# 间隔一定要是整数,'//'是上下取整
if key == ord('q'):
break
# 释放资源
vc.release()
cv2.destroyAllWindows()
1.5视频录制
- VideoWriter 参数一为输出文件,参数二为多媒体文件格式VideoWriter_fourcc,参数三为帧率,参数四为分辨率;
- write 编码并写入缓存;
- release 缓存内容写入磁盘,并释放资源
import cv2
# 打开摄像头
cap = cv2.VideoCapture(0)
# 第一个参数是输出视频文件的名称,第二个是文件类型,第三个是帧率,第四个是视频尺寸
vw = cv2.VideoWriter('output.mp4', cv2.VideoWriter_fourcc(*'mp4v'), 30, (640, 480))
while cap.isOpened():
# 读取每一帧
ret, frame = cap.read()
if not ret:
print('cannot receive frame,exiting')
break
# 保存每一帧
vw.write(frame)
# 显示每一帧
cv2.imshow('frame', frame)
if cv2.waitKey(1) == ord('q'):
break
cap.release()
vw.release()
cv2.destroyAllWindows()