首页 > 编程语言 >opencv-python学习笔记2-opencv基本操作

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

时间:2024-09-07 14:20:51浏览次数:12  
标签:窗口 函数 python image cv2 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, 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)是一个可选参数,可以用来传递额外的信息给回调函数,这在编写复杂的图像处理程序时非常有用。

标签:窗口,函数,python,image,cv2,opencv,图像,基本操作,鼠标
From: https://blog.csdn.net/The_xz/article/details/141969427

相关文章

  • 【小白深度教程 1.11】手把手教你使用 PSMNet 估计视差和计算深度,并映射到 3D 点云(含
    【小白深度教程1.11】手把手教你使用PSMNet估计视差和计算深度,并映射到3D点云(含Python代码)1.PSMNet简介2.环境配置3.下载预训练模型4.修改推理代码5.用PSMNet估计视差6.报错解决7.映射到3D点云8.对比传统方法9.点云可视化在之前的章节......
  • 计算机毕业设计选题-基于python的企业人事管理系统【源码+文档+数据库】
    ......
  • Python教程(二十一) : 从零开始制作计算器应用【PyQt6】
    文章目录专栏列表环境准备代码解析主要组件初始化界面布局设置事件处理计算逻辑运行应用完整代码示例截图总结注意专栏列表Python教程(十):面向对象编程(OOP)Python教程(十一):单元测试与异常捕获Python教程(十二):面向对象高级编程详解Python教程(十三):常用内置模块详解Python......
  • 【Python系列】使用切片移动元素位置
    ......
  • python镜像库替换为国内镜像
    全局生效,而非单个项目!!windows系统使用命令:type%USERPROFILE%\pip\pip.ini查看是否有pip.ini文件,没有的话创建该文件,可以在C:\Users\username下使用notepad++等编辑pip.ini文件,添加下面代码:[global]index-url=https://mirrors.aliyun.com/pypi/simple/[install]trust......
  • Python 中文分词
    Python中文分词结巴中文分词https://github.com/fxsjy/jieba安装 pipinstalljiebapipinstallpaddlepaddle 20.5.1. 分词演示 #encoding=utf-8importjiebaimportpaddlepaddle.enable_static()jieba.enable_paddle()#启动paddle模式。strs=[......
  • Python 语音识别
    STT(SpeechToText)语音转文本17.2.1. SpeechRecognitionhttps://github.com/Uberi/speech_recognition17.2.1.1. 安装 pipinstallSpeechRecognition 麦克风相关 brewinstallportaudiopipinstallpyaudio 运行下面命令授权访问麦克风 ......
  • python PaddleOCR库用法及知识点详解
    识别图片的设置https://blog.csdn.net/f2315895270/article/details/128147744?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-128147744-blog-89082526.pc_relevant_default&spm=1001.2101.3001.4242.1&utm_relevant_in......
  • 使用Python海龟绘图画出奥运五环图
    本套课程在线学习视频https://pan.quark.cn/s/3a470a7bbe67Python的海龟绘图(TurtleGraphics)是一个非常有趣且易于使用的绘图模块,特别适合初学者学习编程和简单的图形绘制。在这篇博客中,我们将使用海龟绘图模块绘制奥运五环图。奥运五环图是由五个相互重叠的圆环组成的标志,代表五大......
  • 计算机毕业设计必看必学!! 10192 springboot巡更系统,原创定制程序, java、PHP、python
    摘 要目前,在日常生活中随处可见社区巡更人员对特定的区域进行定期或者不定期的安全巡查管理。包括勤前训示、必到点签到、巡更路线等,各项勤务工作均由巡更员本人在执勤日志本中手工填写,且工作点分散,不利于统一监管,存在信息化手段不足,勤务信息获取、输入复杂,监管信息不能......