目录
(5)鼠标事件类型 (Mouse Event Types):
(6)鼠标事件标志 (Mouse Event Flags):
一、opencv架构:
OpenCV(Open Source Computer Vision Library)是一个跨平台的开源计算机视觉库,它提供了一系列计算机视觉和机器学习算法。OpenCV的架构设计为模块化,这意味着它由多个共享或静态库组成,每个库负责不同的功能。
(1)OpenCV的主要模块包括:
此外,还有opencv_contrib模块,它包含了一些实验性的功能和算法,如ArUco标记检测、生物启发式视觉模型、3D重建、自定义校准模式、数据集框架、DNN目标检测、光流算法、图像散列、线描述符、优化流、相位展开、图像质量分析、RGBD处理、显著性检测、立体视觉、结构光、表面匹配、文本检测和识别、追踪API、视频稳定等。
-
core:核心模块,定义了OpenCV的基本数据结构,如多维数组
Mat
,以及所有其他模块使用的基本函数,包括动态数据结构、绘图函数、数组操作相关函数、辅助功能与系统函数和宏、与OpenGL的互操作等。 -
imgproc:图像处理模块,包括线性和非线性的图像滤波、图像的几何变换、其他图像转换、直方图相关、结构分析和形状描述、运动分析和对象跟踪、特征检测、目标检测等内容。
-
calib3d:多视图几何算法,包括相机校准、立体视觉、三维重建、物体位姿估计、立体对应算法等。
-
features2d:二维特征框架,包含特征检测和描述、特征检测器、描述符提取器、描述符匹配器、通用描述符匹配器、关键点绘制函数和匹配功能绘制函数。
-
flann:快速近似最近邻搜索库,用于高维数据的快速搜索和聚类。
-
gpu:利用GPU加速的计算机视觉模块,包括各种图像处理和计算摄影算法的GPU加速版本。
-
highgui:高层GUI图形用户界面模块,包含媒体的输入输出、视频捕捉、图像和视频的编码解码、图形交互界面的接口等。
-
ml:机器学习模块,提供统计分类、回归和数据聚类等算法,包括K-近邻、支持向量机、决策树、随机森林、神经网络等。
-
objdetect:目标检测模块,包括Cascade Classification和Latent SVM等。
-
photo:计算摄影模块,包括图像修复、去噪、HDR成像、无缝克隆、非真实感渲染等。
-
stitching:图像拼接模块,包含特征点寻找和匹配图像、估计旋转、自动校准、图片歪斜、接缝估测、曝光补偿、图片混合等。
-
video:视频分析模块,包括运动估计、背景分离、对象跟踪等。
-
videoio:视频输入/输出模块,用于读取/写入视频或图像序列。
-
videostab:视频稳定模块,提供用于视频稳定的算法。
-
shape:形状匹配和距离计算模块。
(2)OpenCV的架构特点:
- 自动内存管理:OpenCV自动处理所有内存分配和释放,使用引用计数机制来管理数据结构如
Mat
。 - 自动输出数据分配:大多数情况下,OpenCV函数会自动为输出数组分配或重新分配内存。
- 饱和算术:在像素值超出数据类型范围时,OpenCV使用饱和算术来避免数据溢出。
- 固定像素类型和有限的模板使用:OpenCV支持的数据类型有限,主要是为了提高编译效率和简化跨语言绑定的开发。
(3)OpenCV的应用场景:
- OpenCV被广泛应用于实时应用,如交互式艺术、地雷检测、在线地图拼接和高级机器人等。它的跨平台和多语言支持使得它可以在多种操作系统和设备上运行,包括Windows、Linux、Mac OS、iOS和Android。
二、图像输入输出模块imgcodecs:
OpenCV的imgcodecs
模块是专门用于处理图像的输入和输出的模块。它提供了一系列的函数,允许用户从文件中读取图像,以及将图像数据写入文件。
a.imread:
(1)函数原型:
cv2.imread(filename, flag)
(2)imread
函数用于从文件中读取图像数据。如果图像读取成功,函数返回一个图像矩阵;如果失败(例如,文件不存在或格式不支持),则返回None
。
(3)参数说明:
filename
:要读取的图像文件的路径。flag
:读取图像的方式。
(4)flag参数取值:
-
IMREAD_UNCHANGED
:载入图像的原貌,包括Alpha通道。 -
IMREAD_GRAYSCALE
:以灰度模式载入图像。 -
IMREAD_COLOR
:以彩色模式载入图像(任何图像深度)。这是默认选项。 -
IMREAD_ANYDEPTH
:载入图像的任何深度,而不仅限于8位。 -
IMREAD_ANYCOLOR
:载入图像,不考虑其通道数,不论图像是彩色还是灰度图。 -
IMREAD_LOAD_GDAL
:使用GDAL驱动程序载入图像,可以载入大型图像,甚至是超过内存大小的图像。 -
IMREAD_REDUCED_GRAYSCALE_2
:载入图像为2级灰度。 -
IMREAD_REDUCED_COLOR_2
:载入图像为2色(2x2x2颜色空间)。 -
IMREAD_REDUCED_GRAYSCALE_4
:载入图像为4级灰度。 -
IMREAD_REDUCED_COLOR_4
:载入图像为4色(4x4x4颜色空间)。 -
IMREAD_REDUCED_GRAYSCALE_8
:载入图像为8级灰度。 -
IMREAD_REDUCED_COLOR_8
:载入图像为8色(8x8x8颜色空间)。 -
IMREAD_IGNORE_ORIENTATION
:忽略图像的EXIF方向标签。
OpenCV的imread
函数支持多种图像格式,这主要取决于OpenCV在编译时所包含的编解码器。
|
(5)读取是否为空判断:
image = cv2.imread('path/to/your/image.jpg')
# 判断图像是否为空
if image is None:
print("图像读取失败,请检查路径是否正确")
else:
print("图像读取成功")
(6)imread读取含中文的文件路径:
方法一:使用cv2.imdecode
函数和numpy
来读取图像数据。首先,你需要将图像文件作为字节数组读取,然后使用imdecode
来从字节数组中解码图像。
import cv2
import numpy as np
# 假设文件路径包含中文
image_path = 'C:\\Users\\86173\\Desktop\\TI\\Q版阿离.png'
# 以二进制模式打开文件并读取数据
with open(image_path, 'rb') as file:
image_data = file.read()
# 将字节数据转换为numpy数组
image_data_np = np.frombuffer(image_data, dtype=np.uint8)
# 使用imdecode读取图像
image = cv2.imdecode(image_data_np, cv2.IMREAD_COLOR)
# 检查图像是否读取成功
if image is not None:
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
else:
print("图像读取失败")
方法二:如果你不想打开文件来读取数据,可以直接使用np.fromfile
来读取整个文件。
import cv2
import numpy as np
# 假设文件路径包含中文
image_path = 'C:\\Users\\86173\\Desktop\\TI\\Q版阿离.png'
# 使用numpy直接从文件读取数据
image_data_np = np.fromfile(image_path, dtype=np.uint8)
# 使用imdecode读取图像
image = cv2.imdecode(image_data_np, cv2.IMREAD_COLOR)
# 检查图像是否读取成功
if image is not None:
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
else:
print("图像读取失败")
运行结果:
(7)读取图片信息:
image.shape
:这是一个元组,包含图像的高度、宽度和通道数。例如,对于一个RGB图像,深度(通道数)通常是3。
import cv2
import numpy as np
# 读取图像
image_path = 'C:\\Users\\86173\\Desktop\\TI\\image\\faves.png' # 替换为你的图像路径
image = cv2.imread(image_path)
# 检查图像是否正确读取
if image is not None:
# 图像尺寸
height, width = image.shape[:2]
print(f"Image Height: {height} pixels")
print(f"Image Width: {width} pixels")
# 图像深度(通道数)
channels = len(image.shape) # 对于灰度图像,shape只有两个维度,所以需要特殊处理
if channels == 2:
depth = 1 # 灰度图像
else:
depth = image.shape[2] # 彩色图像
print(f"Image Depth (Channels): {depth}")
# 图像类型(数据类型)
data_type = image.dtype
print(f"Data Type: {data_type}")
# 像素值
# 例如,获取图像左上角的像素值
pixel_value = image[0, 0]
print(f"Pixel value at (0, 0): {pixel_value}")
# 显示图像
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
else:
print("Error: Image not found or unable to read.")
(8)代码示例:
import cv2
import numpy as np
# 读取彩色图像
color_image = cv2.imread('C:\\Users\\86173\\Desktop\\TI\\faves.png',cv2.IMREAD_COLOR)
cv2.imshow('color_image',color_image)
# 等待键盘事件
cv2.waitKey(0)
# 关闭所有OpenCV窗口
cv2.destroyAllWindows()
b. imwrite:
(1)函数原型:
cv2.imwrite(filename, img, params)
(2)imwrite
函数用于将图像数据写入文件。它根据文件扩展名自动选择正确的编码器。
(3)参数说明:
filename
:要写入的图像文件的路径。img
:要写入的图像矩阵。params
:一个可选的参数列表,用于指定编码参数,如JPEG质量。
(4)params参数取值:
IMWRITE_JPEG_QUALITY
:设置JPEG图像的质量(取值范围从0到100)。IMWRITE_JPEG_PROGRESSIVE
:如果设置为非零值,图像将以渐进式JPEG格式保存。IMWRITE_JPEG_OPTIMIZE
:如果设置为非零值,图像将以优化的格式保存。IMWRITE_JPEG_RST_INTERVAL
:设置JPEG图像的重新启动间隔。IMWRITE_JPEG_LUMA_QUALITY
:设置JPEG图像的亮度(Luma)质量。IMWRITE_JPEG_CHROMA_QUALITY
:设置JPEG图像的色度(Chroma)质量。IMWRITE_JPEG_SAMPLING_FACTOR
:设置JPEG图像的采样因子。IMWRITE_PNG_COMPRESSION
:设置PNG图像的压缩级别。IMWRITE_PNG_STRATEGY
:设置PNG图像的压缩策略。IMWRITE_PNG_BILEVEL
:如果设置为非零值,图像将以二值PNG格式保存。IMWRITE_PXM_BINARY
:如果设置为非零值,PXM格式的图像将以二进制格式保存。IMWRITE_EXR_TYPE
:设置EXR图像的数据类型。IMWRITE_EXR_COMPRESSION
:设置EXR图像的压缩类型。IMWRITE_EXR_DWA_COMPRESSION_LEVEL
:设置使用DWA压缩的EXR图像的压缩级别。IMWRITE_WEBP_QUALITY
:设置WebP图像的质量。IMWRITE_HDR_COMPRESSION
:设置HDR图像的压缩类型。IMWRITE_PAM_TUPLETYPE
:设置PAM格式的图像的元组类型。IMWRITE_TIFF_RESUNIT
:设置TIFF图像的分辨率单位。IMWRITE_TIFF_XDPI
:设置TIFF图像的X方向上的DPI。IMWRITE_TIFF_YDPI
:设置TIFF图像的Y方向上的DPI。IMWRITE_TIFF_COMPRESSION
:设置TIFF图像的压缩类型。IMWRITE_TIFF_ROWSPERSTRIP
:设置TIFF图像的每一条带的行数。IMWRITE_TIFF_PREDICTOR
:设置TIFF图像的预测器方案。IMWRITE_JPEG2000_COMPRESSION_X1000
:设置JPEG2000图像的压缩率(乘以1000)。IMWRITE_AVIF_QUALITY
:设置AVIF图像的质量。IMWRITE_AVIF_DEPTH
:设置AVIF图像的位深度。IMWRITE_AVIF_SPEED
:设置AVIF图像的编码速度。
(5)默认设置:
当使用 cv2.imwrite
函数保存图像时,如果 params
参数不被提供或者是一个空列表([]
),那么OpenCV将使用默认的编码参数来保存图像。
对于不同的图像格式,OpenCV有以下默认设置:
-
JPEG:默认质量通常是95,这意味着图像将以中等质量进行压缩。JPEG是一种有损压缩格式,所以图像质量会根据压缩质量而有所不同。
-
PNG:PNG是一种无损压缩格式,通常默认的压缩级别是OpenCV认为最合适的,通常是压缩率和图像大小之间的平衡。
-
BMP:位图格式通常不进行压缩,或者使用非常基本的压缩,所以没有太多默认参数。
-
TIFF:默认情况下可能会使用无损压缩,但是具体的参数取决于OpenCV的配置和编译时的设置。
(6)代码示例:
import cv2
import numpy as np
# 读取彩色图像
color_image = cv2.imread('C:\\Users\\86173\\Desktop\\TI\\faves.png',cv2.IMREAD_COLOR)
# 设置JPEG质量参数
params = [cv2.IMWRITE_JPEG_QUALITY, 90] # 注意这里是列表
cv2.imwrite('C:\\Users\\86173\\Desktop\\TI\\image\\faves.png',color_image,params)
cv2.imshow('color_image',color_image)
# 等待键盘事件
cv2.waitKey(0)
# 关闭所有OpenCV窗口
cv2.destroyAllWindows()
三、opencv界面编程:
opencv支持有限的界面编程,主要针对窗口,控件和鼠标事件等,比如滑块。
(1)创建窗口:
- 使用
cv2.namedWindow()
函数来创建一个显示图像的窗口。 - 函数原型:
cv2.namedWindow(winname, flags)
- 参数说明:
- winname:窗口的名称,这个名称在调用
cv2.imshow()
时用来引用窗口。 - flags:窗口的属性,可以是以下值之一:
WINDOW_NORMAL
:创建一个可以通过用户交互改变大小的窗口。WINDOW_AUTOSIZE
:创建一个大小自动适应其内容的窗口。这是cv2.namedWindow()
的默认标志。-
WINDOW_OPENGL
:创建一个使用 OpenGL 的窗口。这允许使用硬件加速的图形渲染。 -
WINDOW_FULLSCREEN
:创建一个全屏显示的窗口。 -
WINDOW_FREERATIO
:当与WINDOW_NORMAL
一起使用时,允许窗口在保持图像宽高比的同时改变大小。 -
WINDOW_KEEPRATIO
:当窗口大小发生变化时,保持图像的宽高比。 -
WINDOW_GUI_EXPANDED
:创建一个初始时展开的 GUI 窗口。 -
WINDOW_GUI_NORMAL
:创建一个初始时未展开的 GUI 窗口。 -
WindowFlags
:这是一个类型别名,表示窗口标志的整数类型。
(2)显示图像:
- 使用
cv2.imshow()
函数在创建的窗口中显示图像。
img = cv2.imread('image.jpg')
cv2.imshow('Window Name', img)
(3)添加滑块:
- 可以为窗口添加滑块(trackbars),以便可以动态调整参数。使用
cv2.createTrackbar()
函数来创建滑块。
cv2.createTrackbar('Threshold', 'Window Name', 0, 255, lambda x: None)
(4)处理鼠标事件:
- 通过设置鼠标回调函数来处理鼠标事件。使用
cv2.setMouseCallback()
函数来设置回调。
def mouse_callback(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
print(f'Mouse clicked at ({x}, {y})')
cv2.setMouseCallback('Window Name', mouse_callback)
(5)等待用户输入
- 使用
cv2.waitKey()
函数来等待用户的按键操作,这对于交互式应用程序非常有用。
cv2.waitKey(0)
- 当
cv2.waitKey(0)中的值不为0时,例如cv2.waitKey(1000)代表图片显示一秒后关闭。
(6)销毁窗口
- 当程序结束时,使用
cv2.destroyAllWindows()
来关闭所有OpenCV创建的窗口。
cv2.destroyAllWindows()
四、单窗口显示多图片:
在单个窗口中显示多张图片可以提高工作效率,优化屏幕空间利用,增强图像比较和分析的便捷性,同时提供更简洁和直观的用户交互体验。
(1)np.hstack()
函数:
np.hstack()
函数的全称是 "horizontal stack",意为水平堆叠。这个函数用于将多个数组水平(即沿着第二轴,也就是宽度轴)拼接在一起。
(2)函数原型:
numpy.hstack(tup)
(3)参数:
- tup : tuple 或者 ndarray
- 这是一个元组或数组的序列,它们将被水平地(沿着第二个轴)拼接起来。这些数组必须具有相同的第一个维度(即它们的高度或者说行数必须相同)。
(4)作用:
np.hstack()
将多个一维或二维数组水平地拼接在一起。对于一维数组,它相当于将数组端对端地连接起来。对于二维数组,它会将数组的列对齐并拼接,前提是这些数组的高度(行数)相同。- 该函数常用于图像处理中,将多张图片拼接成一张长条形的图片,例如创建图片画廊的预览。
(5)返回值:
- 函数返回一个新的数组,它是输入数组水平拼接后的结果。
(6)示例:
import numpy as np
# 假设有两个一维数组
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# 水平堆叠
c = np.hstack((a, b))
print(c) # 输出: [1 2 3 4 5 6]
a
和b
是两个一维数组,np.hstack()
将它们水平地拼接成一个新的一维数组c
。
(7)注意事项:
- 如果输入的数组是二维或更高维度的,那么所有数组的行数(第一个维度)必须相同,否则函数会抛出一个异常。
- 当拼接的数组维度超过2维时,
np.hstack()
会按照第二个轴(axis=1)进行拼接。 - 如果需要在不同的轴上拼接,可以使用
np.concatenate()
函数,并指定axis
参数。 - 这个函数是 NumPy 库中处理数组拼接的众多函数之一,其他类似的函数还包括
np.vstack()
(垂直堆叠)、np.dstack()
(深度堆叠)等。
(8)单窗口显示多图片:
方式一:
import cv2
import numpy as np
# C:\\Users\\86173\\Desktop\\TI\\image\\faves.png
def opecv_muti_pic():
# 读取三张要显示的图像
image1 = cv2.imread('C:\\Users\\86173\\Desktop\\TI\\image\\blue_channel.jpg')
image2 = cv2.imread('C:\\Users\\86173\\Desktop\\TI\\image\\faves.png')
image3 = cv2.imread('C:\\Users\\86173\\Desktop\\TI\\image\\green_channel.jpg')
images =np.hstack([image1,image2,image3])
# 创建窗口
cv2.namedWindow('Multiple Images', cv2.WINDOW_NORMAL)
# 显示合成的图像
cv2.imshow('Multiple Images', images)
# 等待用户按键
cv2.waitKey(0)
# 销毁所有窗口
cv2.destroyAllWindows()
opecv_muti_pic()
方式二:
import cv2 # 导入OpenCV库,用于图像处理和显示
import numpy as np # 导入NumPy库,用于数值计算和数组操作
def opencv_multi_pic(): # 定义一个函数,用于在OpenCV中显示多张图片
# 定义一个包含图像路径的列表
image_paths = [
'C:\\Users\\86173\\Desktop\\TI\\image\\blue_channel.jpg',
'C:\\Users\\86173\\Desktop\\TI\\image\\faves.png',
'C:\\Users\\86173\\Desktop\\TI\\image\\green_channel.jpg'
]
images = [] # 创建一个空列表,用于存储加载的图像
# 遍历图像路径列表,加载每张图像
for path in image_paths:
image = cv2.imread(path) # 使用cv2.imread()函数读取图像
if image is None: # 检查图像是否成功加载
print(f"Error: Unable to load image at {path}") # 如果图像未加载,打印错误信息
return # 退出函数
images.append(image) # 将加载的图像添加到images列表中
# 检查所有图像的高度是否相同
height = images[0].shape[0] # 获取第一张图像的高度
for img in images: # 遍历所有图像
if img.shape[0] != height: # 如果某张图像的高度与第一张图像的高度不同
print("Error: Images do not have the same height.") # 打印错误信息
return # 退出函数
# 使用np.hstack()函数将所有图像水平堆叠在一起
images_hstack = np.hstack(images)
# 使用cv2.namedWindow()函数创建一个名为'Multiple Images'的窗口
cv2.namedWindow('Multiple Images', cv2.WINDOW_NORMAL)
# 使用cv2.imshow()函数在'Multiple Images'窗口中显示合成的图像
cv2.imshow('Multiple Images', images_hstack)
# 使用cv2.waitKey()函数等待用户按键,参数0表示无限等待
cv2.waitKey(0)
# 使用cv2.destroyAllWindows()函数销毁所有OpenCV创建的窗口
cv2.destroyAllWindows()
# 调用函数,执行显示多图片的操作
opencv_multi_pic()
运行结果:
五、销毁窗口:
在OpenCV中,销毁窗口的函数是 cv2.destroyAllWindows()
,它用于关闭所有由OpenCV创建的窗口。这个函数没有参数,它会关闭你在程序中打开的所有窗口。以下是该函数的详细说明:
(1)函数原型:
cv2.destroyAllWindows()
(2)参数:
- 无参数。
(3)作用:
- 关闭所有由OpenCV创建的窗口。
- 通常在程序结束时调用,以确保程序退出时不会留下任何悬挂的窗口。
(4)返回值:
- 无返回值。
(5)示例:
import cv2
# 显示一张图像
cv2.imshow('Image', image)
# 等待用户按键
cv2.waitKey(0)
# 销毁所有窗口
cv2.destroyAllWindows()
- 显示了一张图像,然后等待用户按键,最后调用
cv2.destroyAllWindows()
来关闭所有窗口。
(6)注意事项:
- 如果你只想关闭特定的窗口,可以使用
cv2.destroyWindow()
函数,并传递窗口的名称作为参数。 - 在调用
cv2.waitKey()
函数后,通常需要调用cv2.destroyAllWindows()
或cv2.destroyWindow()
来关闭窗口,否则窗口可能会保持打开状态,即使程序已经结束。
(7)销毁特定窗口的函数原型:
- 如果只想销毁一个特定的窗口,而不是所有窗口,可以使用
cv2.destroyWindow()
函数:
cv2.destroyWindow(winname)
(8)参数:
- winname : str
- 要销毁的窗口的名称。
(9)作用:
- 关闭一个指定名称的窗口。
(10)返回值:
- 无返回值。
(11)示例:
import cv2
# 创建并显示图像
cv2.namedWindow('My Window', cv2.WINDOW_NORMAL)
cv2.imshow('My Window', image)
# 等待用户按键
cv2.waitKey(0)
# 销毁特定的窗口
cv2.destroyWindow('My Window')
- 创建了一个名为 'My Window' 的窗口,并在其中显示了一张图像。然后等待用户按键,最后调用
cv2.destroyWindow()
来关闭这个特定的窗口。
六、鼠标事件:
在OpenCV中,处理鼠标事件通常涉及到设置一个鼠标回调函数。这个回调函数会在鼠标事件发生时被调用。
(1)函数原型:
cv2.setMouseCallback(windowName, onm ouse, userdata=None)
(2)参数:
-
windowName : str
- 窗口的名称。这个名称是在创建窗口时通过
cv2.namedWindow()
函数指定的。
- 窗口的名称。这个名称是在创建窗口时通过
-
onMouse : function
- 鼠标回调函数。这是一个自定义函数,当鼠标事件发生时会被调用。该函数的原型通常是:
def onm ouse(event, x, y, flags, param): # event: 鼠标事件类型,如鼠标按下、释放、移动等。 # x, y: 鼠标事件相对于窗口的位置坐标。 # flags: 鼠标事件的标志,如是否按下了左键、右键等。 # param: 传递给回调函数的可选参数。
- 鼠标回调函数。这是一个自定义函数,当鼠标事件发生时会被调用。该函数的原型通常是:
-
userdata : optional
- 可选参数,可以传递任何需要的数据给回调函数。这在回调函数中作为参数
param
接收。
- 可选参数,可以传递任何需要的数据给回调函数。这在回调函数中作为参数
(3)作用:
cv2.setMouseCallback()
函数用于为指定的窗口设置一个鼠标事件回调函数。- 当用户在窗口中进行鼠标操作(如点击、拖动等)时,会触发回调函数的执行。
(4)返回值:
- 无返回值。
(5)鼠标事件类型 (Mouse Event Types):
EVENT_MOUSEMOVE
: 鼠标移动事件。EVENT_LBUTTONDOWN
: 鼠标左键按下事件。EVENT_RBUTTONDOWN
: 鼠标右键按下事件。EVENT_MBUTTONDOWN
: 鼠标中键按下事件。EVENT_LBUTTONUP
: 鼠标左键释放事件。EVENT_RBUTTONUP
: 鼠标右键释放事件。EVENT_MBUTTONUP
: 鼠标中键释放事件。EVENT_LBUTTONDBLCLK
: 鼠标左键双击事件。EVENT_RBUTTONDBLCLK
: 鼠标右键双击事件。EVENT_MBUTTONDBLCLK
: 鼠标中键双击事件。EVENT_MOUSEWHEEL
: 鼠标滚轮向上或向下滚动事件。EVENT_MOUSEHWHEEL
: 鼠标滚轮向左或向右滚动事件。
(6)鼠标事件标志 (Mouse Event Flags):
EVENT_FLAG_LBUTTON
: 鼠标左键按下的标志。EVENT_FLAG_RBUTTON
: 鼠标右键按下的标志。EVENT_FLAG_MBUTTON
: 鼠标中键按下的标志。EVENT_FLAG_CTRLKEY
: 控制键(Ctrl)被按下的标志。EVENT_FLAG_SHIFTKEY
: Shift 键被按下的标志。EVENT_FLAG_ALTKEY
: Alt 键被按下的标志。
(7)回调函数代码示例:
- 定义一个鼠标回调函数,并在用户点击或移动鼠标时执行操作。
import cv2
import numpy as np
# 定义鼠标回调函数
def mouse_callback(event, x, y, flags, param):
# 获取图像的引用
image = param
# 根据鼠标事件类型执行不同的操作
if event == cv2.EVENT_LBUTTONDOWN:
# 鼠标左键按下,打印坐标并绘制一个圆圈
print(f"Left button clicked at ({x}, {y})")
cv2.circle(image, (x, y), 5, (0, 255, 0), -1)
cv2.imshow('Image', image) # 更新窗口
elif event == cv2.EVENT_RBUTTONDOWN:
# 鼠标右键按下,打印坐标并绘制一个矩形
print(f"Right button clicked at ({x}, {y})")
cv2.rectangle(image, (x, y), (x+50, y+50), (255, 0, 0), 1)
cv2.imshow('Image', image) # 更新窗口
elif event == cv2.EVENT_MOUSEMOVE:
# 鼠标移动,如果左键或右键按下,则绘制线条
if flags == cv2.EVENT_FLAG_LBUTTON:
cv2.line(image, (x, y), (x, y+20), (0, 255, 0), 1)
cv2.imshow('Image', image) # 更新窗口
elif flags == cv2.EVENT_FLAG_RBUTTON:
cv2.line(image, (x, y), (x+20, y), (255, 0, 0), 1)
cv2.imshow('Image', image) # 更新窗口
# 读取图像
image = cv2.imread('C:\\Users\\86173\\Desktop\\TI\\image\\faves.png')
# 检查图像是否成功加载
if image is None:
print("Error: Unable to load image.")
exit()
# 创建窗口
cv2.namedWindow('Image')
# 将图像作为参数传递给回调函数
cv2.setMouseCallback('Image', mouse_callback, image)
# 显示图像
cv2.imshow('Image', image)
# 等待用户按键
cv2.waitKey(0)
cv2.destroyAllWindows()
七、键盘事件:
在OpenCV中,cv2.waitKey()
函数用于处理键盘事件。这个函数会等待用户的按键动作,并根据按下的键返回相应的ASCII码。这个函数通常用于在显示图像时,让用户通过按键来控制程序的流程,比如退出程序或进行下一步操作。
(1)函数原型:
delay = cv2.waitKey(delay)
(2)参数:
- delay : int
- 等待按键的时间,以毫秒为单位。如果参数为0,则无限期等待用户的按键;如果是正数,函数会等待指定的毫秒数,如果在这个时间内没有按键动作,函数会返回-1。
(3)作用:
cv2.waitKey()
函数用于捕捉键盘输入。在图像显示窗口中,用户可以通过按键来触发特定的事件或命令。- 这个函数通常用在图像处理程序中,以便在显示图像后等待用户响应,例如按“q”键退出程序。
(4)返回值:
- 函数返回用户按下键的ASCII码。如果等待时间结束而没有按键被按下,返回-1。
(5)示例:
import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 创建窗口
cv2.namedWindow('Image Display')
# 显示图像
cv2.imshow('Image Display', image)
# 等待用户按键,参数0表示无限等待
key = cv2.waitKey(0)
# 根据用户按键执行操作
if key == ord('q') or key == 27: # 按'q'键或ESC键退出
cv2.destroyAllWindows()
# 如果需要在指定时间内没有按键则继续执行,可以设置一个延迟
# 例如,等待5秒,如果5秒内没有按键则继续
key = cv2.waitKey(5000) # 等待5000毫秒
if key == -1:
print("No key pressed, continuing...")
# 继续执行其他操作
- 首先显示了一张图像,并使用
cv2.waitKey(0)
无限期等待用户的按键。如果用户按下了“q”键或ESC键(ASCII码为27),程序会销毁所有窗口并退出。如果设置了延迟(例如5000毫秒),在这段时间内如果没有按键动作,程序会继续执行。
(6)注意事项:
- 在不同的操作系统中,某些特殊按键(如功能键、方向键等)可能不会返回预期的ASCII码,或者需要特定的处理。
- 在使用
cv2.waitKey()
时,确保在程序开始时已经创建了窗口,否则按键事件可能无法正确捕捉。
八、滑动条事件:
在OpenCV中,滑动条(trackbar)通常用于提供一个用户界面元素,允许用户通过拖动滑块来动态调整参数。OpenCV提供了创建滑动条的函数,并且可以为滑动条设置回调函数,以便在滑块位置改变时执行特定的操作。
(1)创建滑动条函数原型:
cv2.createTrackbar(trackbarname, winname, value, count, onChange)
(2)参数:
-
trackbarname : str
- 滑动条的名称。
-
winname : str
- 滑动条所属窗口的名称。
-
value : int
- 滑动条的初始位置。
-
count : int
- 滑动条的最大值。
-
onChange : function
- 滑动条位置改变时的回调函数。这个函数必须接受两个参数:滑动条的位置和一个用户定义的数据(通过
cv2.setTrackbarPos
函数设置)。
- 滑动条位置改变时的回调函数。这个函数必须接受两个参数:滑动条的位置和一个用户定义的数据(通过
(3)作用:
- 创建一个滑动条,并将其与一个窗口关联。
- 当用户移动滑动条时,如果提供了回调函数,将调用该函数。
(4)回调函数原型:
- 回调函数通常具有以下形式:
def onChange(trackbarValue, userdata):
# 滑动条的新位置是 trackbarValue
# 用户数据是 userdata
pass
(5)示例:
示例一:
import cv2
# 回调函数,当滑动条改变时调用
def on_trackbar_change(value, userdata=None):
print(f"Trackbar value: {value}")
# 创建窗口
cv2.namedWindow('Trackbar Example')
# 创建滑动条
cv2.createTrackbar('My Trackbar', 'Trackbar Example', 0, 100, on_trackbar_change)
# 显示图像(可以是任何图像,这里只是一个示例)
image = cv2.imread('path_to_image.jpg')
cv2.imshow('Trackbar Example', image)
# 等待用户按键
cv2.waitKey(0)
cv2.destroyAllWindows()
- 在这个示例中,创建了一个名为 'Trackbar Example' 的窗口和一个名为 'My Trackbar' 的滑动条。滑动条的回调函数是
on_trackbar_change
,它将在滑动条的位置改变时被调用。在这个简单的回调函数中,只是打印了滑动条的新位置。
示例二:
import cv2
import numpy as np
# C:\\Users\\86173\\Desktop\\TI\\image\\faves.png
# 回调函数,当滑动条改变时调用
def on_trackbar_change(value):
# 使用滑动条的值作为阈值进行二值化
_, binary_image = cv2.threshold(gray_image, value, 255, cv2.THRESH_BINARY)
# 显示二值化后的图像
cv2.imshow('Binary Image', binary_image)
# 读取图像并转换为灰度图
image = cv2.imread('C:\\Users\\86173\\Desktop\\TI\\image\\faves.png')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 创建窗口
cv2.namedWindow('Original Image')
cv2.namedWindow('Binary Image')
# 显示原始图像
cv2.imshow('Original Image', image)
# 创建滑动条,并将回调函数绑定到滑动条
cv2.createTrackbar('Threshold', 'Binary Image', 0, 255, on_trackbar_change)
# 调用回调函数以初始化二值化图像的显示
on_trackbar_change(0)
# 等待用户按键
cv2.waitKey(0)
cv2.destroyAllWindows()
- 首先定义一个回调函数
on_trackbar_change
,它使用滑动条的值作为阈值来对灰度图像进行二值化处理。然后,读取一张图像,并将其转换为灰度图像。接着,创建两个窗口,一个用于显示原始图像,另一个用于显示二值化后的图像。
(6)注意事项:
- 回调函数在滑动条位置改变时被调用,这可能会导致性能问题,尤其是在处理图像或视频流时。为了避免性能问题,可以在回调函数中只执行必要的操作。
cv2.createTrackbar
函数创建的滑动条是全局的,这意味着它们可以在程序的任何部分被访问和修改。- 用户数据(
userdata
)是一个可选参数,可以用来传递额外的信息给回调函数,这在编写复杂的图像处理程序时非常有用。