1. 基本操作
1.1 创建和显示窗口
1.1.1 namedWindow()创建命名窗口
cv2.WINDOW_NORMAL
:允许用户调整窗口的大小;如果未设置,窗口大小会被图像尺寸自动限制,用户无法改变大小。
import cv2
cv2.namedWindow('new', cv2.WINDOW_NORMAL)
cv2.resizeWindow('new',800,600)
key = cv2.waitKey(0)
if key == ord('q'):
exit()
cv2.destroyAllWindows()
cv2.WINDOW_AUTOSIZE
:窗口大小会自动适应显示的图像尺寸,用户无法调整窗口大小;适用于固定大小图像展示。
import cv2
cv2.namedWindow('new', cv2.WINDOW_AUTOSIZE)
key = cv2.waitKey(0)
if key == ord('q'):
exit()
cv2.destroyAllWindows()
cv2.WINDOW_FREERATIO
:窗口大小会自动调整,但不会被图像的宽高比限制,窗口的比例可以自由调整。
import cv2
cv2.namedWindow('new', cv2.WINDOW_FREERATIO)
key = cv2.waitKey(0)
if key == ord('q'):
exit()
cv2.destroyAllWindows()
cv2.WINDOW_KEEPRATIO
:窗口的宽高比保持一致,窗口大小会根据显示的图像大小进行调整,但宽高比不变。
import cv2
cv2.namedWindow('new', cv2.WINDOW_KEEPRATIO)
key = cv2.waitKey(0)
if key == ord('q'):
exit()
cv2.destroyAllWindows()
cv2.WINDOW_GUI_EXPANDED
:窗口包含额外的控件,如工具栏等(适用于某些操作系统的特定平台)。
import cv2
cv2.namedWindow('new', cv2.WINDOW_GUI_EXPANDED)
key = cv2.waitKey(0)
if key == ord('q'):
exit()
cv2.destroyAllWindows()
cv2.WINDOW_GUI_NORMAL
:窗口为普通的标准窗口,没有额外控件。
import cv2
cv2.namedWindow('new', cv2.WINDOW_GUI_NORMAL)
key = cv2.waitKey(0)
if key == ord('q'):
exit()
cv2.destroyAllWindows()
1.1.2 imshow() 显示图片与窗口
大家有没有发现一个问题,由opencv读取的图片,使用其他方法展示()例如matplotlib展示时,就会出现颜色不对的情况,附上代码
import cv2
import matplotlib
matplotlib.use('TkAgg') # 设置为交互式后端
# matplotlib.use('Agg') # 或者使用 'Agg' 后端
import matplotlib.pyplot as plt
import numpy as np
# 读取图片(默认彩色途径)
img = cv2.imread("./car.jpg")
"""
发现matplotlib显示的图片和真实的图片颜色不一样,因为opencv读进来的图片数据的通道不是默认的RGB而是BGR,
所以opencv读进来的图片不要用别的方式去展示
"""
plt.imshow(img)
plt.show()
注:左图为opencv读取的原图,右图是matplotlib展示的图片
因为opencv读进来的图片数据的通道不是默认的RGB而是BGR,所以opencv读进来的图片不要用别的方式去展示。
如果我要调整展示窗口的大小的时候使用cv2.resizeWindow('new',800,600),那么对应的要修改imshow()展示的图片大小,应该怎么做呢?
import cv2
# 读取图片(默认彩色途径)
img = cv2.imread("./car.jpg")
img = cv2.resize(img, (880, 640), interpolation=cv2.INTER_CUBIC)
cv2.imshow("car",img)
key = cv2.waitKey(0)
if key == ord('q'):
cv2.destroyAllWindows()
cv2.resize()
是 OpenCV 用于调整图像大小的函数,其基本语法如下:
resized_image = cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
参数说明
-
src
(必填):输入的图像(numpy
数组)。 -
dsize
(必填):目标大小(width, height)
,即调整后的图像尺寸。可以设置为None
,如果fx
和fy
已指定,则根据缩放比例调整大小。 -
dst
(可选):输出的目标图像,通常不需要指定,因为cv2.resize()
会返回调整后的图像。 -
fx
(可选):水平方向缩放比例。例如fx=0.5
表示宽度缩小 50%。 -
fy
(可选):垂直方向缩放比例。例如fy=0.5
表示高度缩小 50%。 -
interpolation
(可选):插值方式,默认是cv2.INTER_LINEAR
。不同插值方法适用于不同的缩放需求:-
cv2.INTER_NEAREST
:最近邻插值,计算速度快,可能会有马赛克效果。 -
cv2.INTER_LINEAR
(默认):双线性插值,适用于缩小图像时。 -
cv2.INTER_CUBIC
:双三次插值,计算较慢但效果比INTER_LINEAR
更平滑。 -
cv2.INTER_LANCZOS4
:Lanczos 插值,适用于高质量缩小图像。
-
1.2 保存图片
import cv2
img = cv2.imread("car.jpg")
img = cv2.resize(img, (880, 640), interpolation=cv2.INTER_CUBIC)
cv2.imshow("car", img)
cv2.imwrite("car_1.png", img)
key = cv2.waitKey(0)
if key == ord('q'):
cv2.destroyAllWindows()
1.3 读取摄像头和视频数据
打开摄像头,并且以窗口形式展示出来
# 打开摄像头
import cv2
# 打开摄像头 (0 代表默认摄像头,如果有多个摄像头,可以尝试 1, 2, 3...)
cap = cv2.VideoCapture(0)
# 检查摄像头是否成功打开
if not cap.isOpened():
print("无法打开摄像头")
exit()
# 循环读取视频流
while True:
# 读取一帧
ret, frame = cap.read()
# 如果读取失败,退出循环
if not ret:
print("无法获取视频帧")
break
# 在窗口中显示当前帧
cv2.imshow('Camera', frame)
# 按下 'q' 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头资源并关闭窗口
cap.release()
cv2.destroyAllWindows()
读取视频,并且以窗口形式展示
import cv2
cap = cv2.VideoCapture("../1.mp4")
print(cap.isOpened())
while cap.isOpened():
# 读取一帧
ret,frame = cap.read()
# 如果读取失败,则推出
if not ret:
print("无法获取视频帧")
break
cv2.imshow("vedio", frame)
if cv2.waitKey(1) & 0xFF ==ord('q'):
break
cap.release()
cv2.destroyAllWindows()
1.4 视频录制
# 视频录制
import cv2
cap = cv2.VideoCapture(0)
# *mp4v就是解包操作,等同于'm','p','4','v'
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter("output.mp4",fourcc,20,(640,480))
while cap.isOpened():
ret,frame = cap.read()
if not ret:
break
out.write(frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
1.4.1 VideoWriter_fourcc的用法
'mp4v'
: MPEG-4 编码格式,通常用于.mp4
文件。'MJPG'
: Motion JPEG 编码格式,常用于较老的设备或一些不需要复杂压缩的场合。'XVID'
: Xvid 编码,广泛用于.avi
格式。'DIVX'
: DivX 编码,通常用于.avi
文件。'H264'
: H.264 编码(通过cv2.VideoWriter_fourcc(*'H264')
)。适用于压缩效率较高的视频文件。
1.4.2 VideoWriter的用法
cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor=True)
参数说明:
-
filename (
str
):
视频文件的输出路径和文件名。
例如:"output.mp4"
表示输出文件名为output.mp4
,也可以是其他格式,如.avi
或.mov
,根据你选择的编码格式来确定。 -
fourcc (
int
):
视频编码格式的四字符代码(FourCC),用于指定视频编码类型。
例如:cv2.VideoWriter_fourcc(*'mp4v')
,其中*'mp4v'
表示 MPEG-4 编码格式。其他常见的编码格式还有'XVID'
、'MJPG'
、'H264'
等。 -
fps (
float
):
每秒帧数(frames per second),即视频的帧率。
例如:20
表示每秒钟写入 20 帧。你可以根据实际需求调整此值,通常视频帧率在 24 到 30 帧之间。 -
frameSize (
tuple
):
视频帧的尺寸,通常是一个元组(宽度, 高度)
。
例如:(640, 480)
表示每帧的分辨率为 640x480 像素。视频帧的尺寸应与输入图像的尺寸相匹配。 -
isColor (
bool
, optional):
一个布尔值,指定是否保存彩色视频。默认为True
,表示视频是彩色的。如果设为False
,则视频会被保存为灰度图像。
通常不需要修改,保持True
即可,除非你特别需要保存灰度视频。
2. 控制鼠标
OpenCv允许我们对窗口上的鼠标动作做出响应。
在 OpenCV 中,使用 cv2.setMouseCallback()
函数可以注册一个鼠标回调函数,该函数会在鼠标事件发生时被调用。回调函数的签名为:
callback(event, x, y, flags, userdata)
2.1 鼠标事件
-
cv2.EVENT_LBUTTONDOWN
(左键按下) -0
-
cv2.EVENT_LBUTTONUP
(左键抬起) -1
-
cv2.EVENT_RBUTTONDOWN
(右键按下) -2
-
cv2.EVENT_RBUTTONUP
(右键抬起) -3
-
cv2.EVENT_MBUTTONDOWN
(中键按下) -4
-
cv2.EVENT_MBUTTONUP
(中键抬起) -5
-
cv2.EVENT_MOUSEMOVE
(鼠标移动) -16
-
cv2.EVENT_LBUTTONDBLCLK
(左键双击) -7
-
cv2.EVENT_RBUTTONDBLCLK
(右键双击) -8
-
cv2.EVENT_MBUTTONDBLCLK
(中键双击) -9
-
cv2.EVENT_MOUSEWHEEL
(鼠标滚轮) -1024
-
cv2.EVENT_MOUSEHWHEEL
(鼠标水平滚轮) -2048
2.2 实例
def mouse_callback(event, x, y, flags, userdata):
print(event, x, y, flags, userdata)
# 创建窗口
cv2.namedWindow('mouse',cv2.WINDOW_NORMAL)
# 宽度和高度
cv2.resizeWindow('mouse', 640, 360)
# 设置鼠标的回调函数
cv2.setMouseCallback('mouse', mouse_callback,"123")
# 生成全黑的图片
img = np.zeros((360, 640, 3), np.uint8)
while True:
cv2.imshow('mouse', img)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cv2.destroyAllWindows()
3. TrackBar控件
在 OpenCV 中,cv2.createTrackbar()
可以用来创建一个滑动条(Trackbar),通过拖动 TrackBar 控件,用户可以动态调整图像的参数。我们可以使用这个控件来改变图像的颜色,例如通过调整 RGB(红、绿、蓝)通道的值来改变图像的颜色。
import cv2
import numpy as np
# 初始颜色值(R, G, B)
r, g, b = 0, 0, 0
# 回调函数,当 TrackBar 值变化时触发
def on_trackbar(val):
global r, g, b
r = cv2.getTrackbarPos("Red", "TrackBar Image")
g = cv2.getTrackbarPos("Green", "TrackBar Image")
b = cv2.getTrackbarPos("Blue", "TrackBar Image")
# 创建新的图像,填充为当前颜色值
img[:] = [b, g, r] # OpenCV 默认是 BGR 顺序
cv2.imshow("TrackBar Image", img)
# 创建一个空白图像
img = np.ones((400, 400, 3), dtype=np.uint8) * 255
# 创建一个窗口
cv2.namedWindow("TrackBar Image")
# 创建三个 TrackBar 控件,分别控制 R、G、B 颜色通道
cv2.createTrackbar("Red", "TrackBar Image", 0, 255, on_trackbar)
cv2.createTrackbar("Green", "TrackBar Image", 0, 255, on_trackbar)
cv2.createTrackbar("Blue", "TrackBar Image", 0, 255, on_trackbar)
# 显示初始图像
on_trackbar(0)
# 持续显示窗口,直到按下 'Esc' 键
while True:
if cv2.waitKey(1) & 0xFF == 27: # 按 'Esc' 键退出
break
cv2.destroyAllWindows()
第一部分基本操作结束,后面继续学习颜色空间