namedWindow()
用法:
cv2.namedWindow(winname, flags)
参数说明:
winname:新建窗口的名称,可任意取(字符串类型)。
flags:窗口的标识,一般默认为 WINDOW_AUTOSIZE ,还有其他几种参数,具体用法如下表所示:
参数 | 描述 |
---|---|
WINDOW_NORMAL | 显示图像后,允许用户随意调整窗口大小 |
WINDOW_AUTOSIZE | 根据图像大小显示窗口,不允许用户调整大小 |
WINDOW_OPENGL | 创建窗口的时候会支持OpenGL |
WINDOW_FULLSCREEN | 全屏显示窗口 |
WINDOW_FREERATIO | 调整图像尺寸以充满窗口 |
WINDOW_KEEPRATIO | 保持图像的比例 |
WINDOW_GUI_EXPANDED | 创建的窗口允许添加工具栏和状态栏 |
WINDOW_GUI_NORMAL | 创建没有状态栏和工具栏的窗口 |
以上两种标蓝色的参数是最为常见的。
resizeWindow()
用法:
cv2.resizeWindow(winname, width, height)
参数说明:
注意:当 namedWindow(winname, flags) 中的 flages 设为 WINDOW_AUTOSIZE 时,将不会对窗口尺寸进行修改。
imshow()
用法:
cv2.imshow(winname, mat)
参数说明:
若 mat 设置为0,即不展示任何对象,只是一个黑框。
waitKey()
用法:
cv2.waitKey(delay)
参数说明:
当然也可以设置按指定键退出,即使用 if 判断语句:
key = cv2.waitKey(0)
# 按q键退出
if key & 0xFF == ord('q'):
break
1、destroyWindow()
用法:
cv2.destroyWindow(winname)
参数说明:
2、destroyAllWindows
用法:
cv2.destroyAllWindows()
参数说明:
3、两者区别:
destroyAllWindows() 会销毁我们创建的所有窗口。
如果要销毁任何特定的窗口,使用函数 destroyWindow() ,并在其中传递确切的窗口名称作为参数。
import cv2
cv2.namedWindow('windows', cv2.WINDOW_NORMAL) # 创建命名窗口
cv2.resizeWindow('windows', 640, 360) # 修改窗口尺寸
cv2.imshow('windows', 0) # 显示窗口
cv2.waitKey(0) # 等待用户输入
cv2.destroyAllWindows() # 销毁窗口
imread()
用法:
cv2.imread(filename, flags)
参数说明:
参数 | 描述 |
---|---|
IMREAD_UNCHANGED | 如果设置,则按原样返回加载的图像(带有Alpha通道,否则将被裁剪)。 |
IMREAD_GRAYSCALE | 如果设置,请始终将图像转换为单通道灰度图像。 |
IMREAD_COLOR | 如果设置,请始终将图像转换为3通道BGR彩色图像。 |
IMREAD_ANYDEPTH | 如果设置,则当输入具有相应的深度时返回16位/ 32位图像,否则将其转换为8位。 |
IMREAD_ANYCOLOR | 如果设置,将以任何可能的颜色格式读取图像。 |
IMREAD_LOAD_GDAL | 如果设置,请使用Gdal驱动程序加载图像。 |
IMREAD_REDUCED_GRAYSCALE_2 | 如果设置,则始终将图像转换为单通道灰度图像,并且图像尺寸减小1/2。 |
IMREAD_REDUCED_COLOR_2 | 如果设置,请始终将图像转换为3通道BGR彩色图像,并且图像尺寸减小1/2。 |
IMREAD_REDUCED_GRAYSCALE_4 | 如果设置,则始终将图像转换为单通道灰度图像,并且图像尺寸减小1/4。 |
IMREAD_REDUCED_COLOR_4 | 如果设置,请始终将图像转换为3通道BGR彩色图像,并且图像尺寸减小1/4。 |
IMREAD_REDUCED_GRAYSCALE_8 | 如果设置,请始终将图像转换为单通道灰度图像,并且图像尺寸减小1/8。 |
IMREAD_REDUCED_COLOR_8 | 如果设置,请始终将图像转换为3通道BGR彩色图像,并且图像尺寸减小1/8。 |
IMREAD_IGNORE_ORIENTATION | 如果设置,请不要根据EXIF的方向标志旋转图像。 |
以上三种标蓝色的参数是最为常见的,除了这三个标志,我们可以分别简单地传递整数-1、0或1。
import cv2
cv2.namedWindow('window', cv2.WINDOW_NORMAL) # 创建命名窗口
cv2.resizeWindow('window', 502, 345) # 修改窗口尺寸
cat = cv2.imread('../resource/cat.jpg', cv2.IMREAD_GRAYSCALE) # 读取图片
cv2.imshow('window', cat) # 显示窗口(图片)
cv2.waitKey(0) # 等待用户输入
cv2.destroyAllWindows() # 销毁窗口
imwrite()
用法:
cv2.imwrite(filename, img)
参数说明:
cv2.imwrite('../resource/cat.png', cat)
,这会将图像以PNG格式保存在工作目录中。在下面的程序中,以灰度加载图像,显示图像,按 q
键直接退出而不保存,或者按 s
键保存图像并退出:
import cv2
cv2.namedWindow('window', cv2.WINDOW_NORMAL) # 创建命名窗口
cv2.resizeWindow('window', 502, 345) # 修改窗口尺寸
cat = cv2.imread('../resource/cat.jpg', cv2.IMREAD_GRAYSCALE) # 读取图片
cv2.imshow('window', cat) # 显示窗口(图片)
key = cv2.waitKey(0) # 等待用户输入
if key & 0xFF == ord('q'): # 按 q 退出
cv2.destroyAllWindows()
elif key & 0xFF == ord('s'): # 按 s 保存和退出
cv2.imwrite('../resource/cat.png', cat)
cv2.destroyAllWindows()
如果使用的是64位计算机,则必须按如示修改行: key & 0xFF == ord(‘q’)
我们想一想:cv2.waitKey() 返回的是什么数据类型?
key = cv2.waitKey(0)
print(type(key))print(type(cv2.waitKey(0)))
<class 'int'>
cv2.waitKey() 返回的是整型,那么我们如果写成 if key & 0xFF == 'q':
行不行?
答案当然是不行,因为我们知道 key 是整型,而 ‘q’ 是字符串类型,两者属于不同类型,不能给直接作比较,这就引出了 ord() 函数:
ord() 函数的作用是:将字符串转换为ASCII,也就是将字符串类型转换为相对应的整型,然后就可以直接作比较。
当上述代码运行时发现:我们不仅可以按 q
键退出还可以按其他键退出,这就不满足我们的要求,但我们可以添加一个 while
循环:
import cv2
cv2.namedWindow('window', cv2.WINDOW_NORMAL) # 创建命名窗口
cv2.resizeWindow('window', 502, 345) # 修改窗口尺寸
cat = cv2.imread('../resource/cat.jpg', cv2.IMREAD_GRAYSCALE) # 读取图片
while True:
cv2.imshow('window', cat) # 显示窗口(图片)
key = cv2.waitKey(0) # 等待用户输入
if key & 0xFF == ord('q'): # 按 q 退出
break
elif key & 0xFF == ord('s'): # 按 s 保存和退出
cv2.imwrite('../resource/cat.png', cat)
else:
print(key) # 打印 key 值
以上代码实现:按 q 键退出,按 s 键保存图像,按 其他 键打印该键的ASCII码。
VideoCapture()
用法:
cap = cv2.VideoCapture(0)
参数说明:
0
表示打开笔记本的内置摄像头,1
则打开外置摄像头。cap.read()
用法
ret, frame = cap.read()
返回值说明:
cap.release()
用法
cap.release()
import cv2
cv2.namedWindow('video', cv2.WINDOW_NORMAL) # 创建窗口
cv2.resizeWindow('video', 640, 480) # 修改窗口尺寸
cap = cv2.VideoCapture(0) # 获取视频设备
while True:
# 从摄像头读视频帧
ret, frame = cap.read()
# 将视频帧在窗口显示
cv2.imshow('video', frame)
# 等待键盘事件,如果为q,退出
key = cv2.waitKey(1)
if key & 0xFF == ord('q'):
break
cap.release() # 释放VideoCapture
cv2.destroyAllWindows() # 销毁窗口
VideoCapture()
用法:
cap = cv2.VideoCapture('../resource/fire.mp4')
参数说明:
参数为设备索引时:获取视频设备;参数为视频文件时:从视频文件中读取视频帧。
import cv2
cv2.namedWindow('video', cv2.WINDOW_NORMAL) # 创建窗口
cv2.resizeWindow('video', 640, 360) # 修改窗口尺寸
cap = cv2.VideoCapture('../resource/fire.mp4') # 从视频文件读取视频帧
while True:
# 从摄像头读视频帧
ret, frame = cap.read()
# 将视频帧在窗口显示
cv2.imshow('video', frame)
# 等待键盘事件,如果为q,退出
key = cv2.waitKey(1000 // 30)
if key & 0xFF == ord('q'):
break
cap.release() # 释放VideoCapture
cv2.destroyAllWindows() # 销毁窗口
VideoWriter_fourcc()
用法:
fourcc = cv2.VideoWriter_fourcc(c1, c2, c3, c4)
参数说明:
cv2.VideoWriter_fourcc() 的参数可以写成
('M','J','P','G')
或者(*'MJPG')
传递。
VideoWriter()
用法:
vw = cv2.VideoWriter('../resource/out.avi', fourcc, 25, (640, 480))
参数说明:
vw.write
用法:
vw.write(frame)
参数说明:
ret, frame = cap.read()
将读取到的视频帧,再通过 vw.write(frame)
将数据写入多媒体文件。vw.release
用法:
vw.release()
完成工作后释放所有内容(释放VideoCapture、释放VideoWriter、销毁窗口)。
import cv2
# 创建VideoWriter为写多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
vw = cv2.VideoWriter('../resource/out.avi', fourcc, 25, (640, 480))
cv2.namedWindow('video', cv2.WINDOW_NORMAL) # 创建窗口
cv2.resizeWindow('video', 640, 360) # 修改窗口尺寸
cap = cv2.VideoCapture(0) # 获取视频设备
while True:
# 从摄像头读视频帧
ret, frame = cap.read()
# 将视频帧在窗口显示
cv2.imshow('video', frame)
# 写数据到多媒体文件
vw.write(frame)
# 等待键盘事件,如果为q,退出
key = cv2.waitKey(1000 // 30)
if key & 0xFF == ord('q'):
break
cap.release() # 释放VideoCapture
vw.release() # 释放VideoWriter
cv2.destroyAllWindows() # 销毁窗口
1、使用 isOpened() 判断摄像头是否已打开?
while cap.isOpened():
判断摄像头是否为打开状态
2、采集数据时要判断数据是否获取到了?
if ret == True:
...
else:
break
3、优化后代码
import cv2
# 创建VideoWriter为写多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
vw = cv2.VideoWriter('../resource/out.avi', fourcc, 25, (640, 480))
cv2.namedWindow('video', cv2.WINDOW_NORMAL) # 创建窗口
cv2.resizeWindow('video', 640, 360) # 修改窗口尺寸
cap = cv2.VideoCapture(0) # 获取视频设备
# 判断摄像头是否为打开状态
while cap.isOpened():
# 从摄像头读视频帧
ret, frame = cap.read()
if ret == True:
# 将视频帧在窗口显示
cv2.imshow('video', frame)
# 写数据到多媒体文件
vw.write(frame)
# 等待键盘事件,如果为q,退出
key = cv2.waitKey(1000 // 30)
if key & 0xFF == ord('q'):
break
else:
break
cap.release() # 释放VideoCapture
vw.release() # 释放VideoWriter
cv2.destroyAllWindows() # 销毁窗口
setMouseCallback()
用法:
cv2.setMouseCallback(winname, callback, userdata)
参数说明:
callback()
用法:
callback(event, x, y, flags, userdata)
参数说明:
event:鼠标事件(鼠标移动、左键、右键…)
x, y:鼠标所在坐标点
flags:鼠标键及组合键
userdata:传递给回调函数的可选参数(默认为None)
event类型如下表所示:
event | 值 | 描述 |
---|---|---|
EVENT_MOUSEMOVE | 0 | 鼠标移动 |
EVENT_LBUTTONDOWN | 1 | 按下鼠标左键 |
EVENT_RBUTTONDOWN | 2 | 按下鼠标右键 |
EVENT_MBUTTONDOWN | 3 | 按下鼠标中键 |
EVENT_LBUTTONUP | 4 | 左键释放 |
EVENT_RBUTTONUP | 5 | 右键释放 |
EVENT_MBUTTONUP | 6 | 中键释放 |
EVENT_LBUTTONDBLCLK | 7 | 左键双击 |
EVENT_RBUTTONDBLCLK | 8 | 右键双击 |
EVENT_MBUTTONDBLCLK | 9 | 中键双击 |
EVENT_MOUSEWHEEL | 10 | 鼠标滚轮上下移动 |
EVENT_MOUSEHWHEEL | 11 | 鼠标滚轮左右移动 |
flags类型如下表所示:
flags | 值 | 描述 |
---|---|---|
EVENT_FLAG_LBUTTON | 1 | 按下左键 |
EVENT_FLAG_RBUTTON | 2 | 按下右键 |
EVENT_FLAG_MBUTTON | 4 | 按下中键 |
EVENT_FLAG_CRTLKEY | 8 | 按下CTRL键 |
EVENT_FLAG_SHIFTKEY | 16 | 按下SHIFT键 |
EVENT_FLAG_ALTKEY | 32 | 按下ALT键 |
np.zeros()
用法:
img = np.zeros(shape, dtype)
参数说明:
import cv2
import numpy as np
# 设置鼠标回调函数
def callback(event, x, y, flags, userdata):
print(event, x, y, flags, userdata)
# 创建、修改窗口
cv2.namedWindow('mouse_callback', cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse_callback', 640, 360)
# 设置鼠标回调
cv2.setMouseCallback('mouse_callback', callback, 'userdata')
# 显示窗口和背景
img = np.zeros((360, 640, 3), np.uint8)
while True:
cv2.imshow('mouse_callback', img)
key = cv2.waitKey(0)
if key & 0xFF == ord('q'):
break
# 销毁窗口
cv2.destroyAllWindows()
createTrackbar()
用法:
cv2.createTrackbar(trackbarName, windowName, value, count, onChange)
参数说明:
getTrackbarPos()
用法:
cv2.getTrackbarPos(trackbarName, windowName)
参数说明:
import cv2
import numpy as np
# 定义回调函数
def callback(value):
print(value)
# 创建窗口
cv2.namedWindow('TrackBar', cv2.WINDOW_NORMAL)
# 创建trackbar
cv2.createTrackbar('R', 'TrackBar', 0, 255, callback)
cv2.createTrackbar('G', 'TrackBar', 0, 255, callback)
cv2.createTrackbar('B', 'TrackBar', 0, 255, callback)
# 设置纯黑色背景图片(640 * 480)
img = np.zeros((480, 640, 3), np.uint8)
while True:
# 获取当前TrackBar值
r = cv2.getTrackbarPos('R', 'TrackBar')
g = cv2.getTrackbarPos('G', 'TrackBar')
b = cv2.getTrackbarPos('B', 'TrackBar')
# 改变背景图片颜色
img[:] = [b, g, r]
# 显示
cv2.imshow('TrackBar', img)
key = cv2.waitKey(10)
if key & 0xFF == ord('q'):
break
cv2.destroyAllWindows()