opencv-python学习笔记2-opencv基本操作

目录

 一、opencv架构:

(1)OpenCV的主要模块包括:

(2)OpenCV的架构特点:

(3)OpenCV的应用场景:

二、图像输入输出模块imgcodecs: 

a.imread:

b. imwrite:

三、opencv界面编程:

(1)创建窗口:

(2)显示图像:

(3)添加滑块:

(4)处理鼠标事件:

(5)等待用户输入

(6)销毁窗口

四、单窗口显示多图片:

(1)np.hstack() 函数: 

(2)函数原型:

(3)参数:

(4)作用:

(5)返回值:

(6)示例:

(7)注意事项:

(8)单窗口显示多图片:

五、销毁窗口:

(1)函数原型:

(2)参数:

(3)作用:

(4)返回值:

(5)示例:

(6)注意事项:

(7)销毁特定窗口的函数原型和参数:

(8)参数:

(9)作用:

(10)返回值:

(11)示例:

六、鼠标事件:

(1)函数原型:

(2)参数:

(3)作用:

(4)返回值:

(5)鼠标事件类型 (Mouse Event Types):

(6)鼠标事件标志 (Mouse Event Flags):

(7)回调函数代码示例: 

七、键盘事件:

(1)函数原型:

(2)参数:

(3)作用:

(4)返回值:

(5)示例:

(6)注意事项:

八、滑动条事件: 

(1)创建滑动条函数原型:

(2)参数:

(3)作用:

(4)回调函数原型:

(5)示例:

(6)注意事项:


 一、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在编译时所包含的编解码器。 

  • JPEG (*.jpeg*.jpg*.jpe)
  • PNG (*.png)
  • BMP (*.bmp*.dib)
  • TIFF (*.tif*.tiff)
  • GIF (*.gif)
  • XPM (*.xpm*.ppm*.pbm*.pgm)
  • WebP (*.webp)
  • PBM/PGM/PPM (*.pbm*.pgm*.ppm)
  • SGI (*.sgi*.rgba*.sgi*.bw)
  • TGA (*.tga)
  • PCX (*.pcx)
  • PBM (*.pbm)
  • PSD (*.psd)
  • FLI/FLC (*.fli*.flc)
  • GIF (动画) (*.gif)
  • ICO (*.ico)
  • PCD (*.pcd)
  • PBM/PGM (Raw) (*.pgmraw*.pbmraw)

(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]
  • ab 是两个一维数组,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, onMouse, userdata=None)

(2)参数:

  • windowName : str

    • 窗口的名称。这个名称是在创建窗口时通过 cv2.namedWindow() 函数指定的。
  • onMouse : function

    • 鼠标回调函数。这是一个自定义函数,当鼠标事件发生时会被调用。该函数的原型通常是:
      def onMouse(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)是一个可选参数,可以用来传递额外的信息给回调函数,这在编写复杂的图像处理程序时非常有用。

  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值