当前位置: 首页 > news >正文

学习日志024--opencv中处理轮廓的函数

目录

前言​​​​​​​

一、 梯度处理的sobel算子函数

功能

参数

返回值

代码演示

二、梯度处理拉普拉斯算子

功能

参数 

返回值 

代码演示 

三、Canny算子

功能

参数

 返回值

 代码演示

 四、findContours函数与drawContours函数

功能

参数

 返回值

代码演示

五、透视变换矩阵函数

功能

参数

返回值

代码演示 

 六、图像的外接边框

总结



前言

在计算机视觉(Computer Vision, CV)中,边缘识别是一个至关重要的步骤,它对于多种图像处理和计算机视觉任务都具有重要意义。在OpenCV等计算机视觉库中,提供了多种边缘检测算法(如Sobel算子、Laplacian算子、Canny边缘检测等),这些算法可以有效地识别图像中的边缘信息,为后续的图像处理和分析任务提供有力支持。通过合理地选择和调整算法参数,我们可以获得更好的边缘检测效果,从而提高计算机视觉任务的准确性和效率。


一、 梯度处理的sobel算子函数

功能

 Sobel算子是一种用于图像处理中边缘检测的算法,主要利用图像像素梯度的方法来计算图像亮度的一阶梯度,从而突出图像中的边缘。它通常用于计算机视觉和图像处理任务中,如物体检测、图像分割等。Sobel 函数通常用于边缘检测、图像分割、特征提取等图像处理任务中。通过计算图像在 x 和 y 方向上的梯度,可以突出图像中的边缘信息,这对于后续的图像分析和处理非常有用。

@_typing.overload
def Sobel(src: cv2.typing.MatLike,ddepth: int,dx: int, dy: int, dst: cv2.typing.MatLike | None = ..., ksize: int = ..., scale: float = ...,delta: float = ..., borderType: int = ...)\-> cv2.typing.MatLike: ...

参数

  • src (cv2.typing.MatLike)‌:

    • 输入图像,必须是一个灰度图像或彩色图像的一个通道。
    • 类型:cv2.typing.MatLike,表示兼容 OpenCV 矩阵类型的输入。
  • ddepth (int)‌:

    • 输出图像的所需深度。当参数值为 -1 时,输出图像与输入图像具有相同的深度。否则,它可以是 cv2.CV_8Ucv2.CV_16Ucv2.CV_32F 等之一,表示 8 位无符号、16 位无符号或 32 位浮点类型。
  • dx (int)‌:

    • x 方向上的导数阶数。当需要计算 x 方向上的梯度时,将其设置为 1;否则设置为 0.
  • dy (int)‌:

    • y 方向上的导数阶数。当需要计算 y 方向上的梯度时,将其设置为 1;否则设置为 0。
  • dst (cv2.typing.MatLike | None)‌:

    • 输出图像,与输入图像具有相同的大小和类型。如果此参数为 None,则函数会创建一个新的输出图像。
    • 类型:cv2.typing.MatLike | None,表示可以是兼容 OpenCV 矩阵类型的输出,或者为 None
  • ksize (int, 默认值为 3)‌:

  • Sobel 算子的大小,必须是 1、3、5、7 之一。它表示算子在 x 或 y 方向上使用的像素邻域的大小。
  • scale (float, 默认值为 1)‌:

    • 可选的比例因子,用于缩放导数的绝对值。默认情况下,不进行缩放。
  • delta (float, 默认值为 0)‌:

    • 可选的增量值,该值会被加到最终的梯度图像中。这可以用于调整结果的亮度或对比度。
  • borderType (int, 默认值为 cv2.BORDER_DEFAULT)‌:

  • 边界模式,用于指定边界外像素的外推方法。常见的边界模式包括 cv2.BORDER_CONSTANTcv2.BORDER_REFLECTcv2.BORDER_REPLICATE 等。默认值为 cv2.BORDER_DEFAULT,它通常表示一种合理的默认边界外推方法。

返回值

  • cv2.typing.MatLike‌:
    • 输出图像,包含了计算得到的梯度信息。如果 dst 参数不为 None,则此输出图像与 dst 参数指向的图像相同;否则,函数会返回一个新的图像。

代码演示

import cv2
import numpy as np# 读取一张图
img = cv2.imread('./shudu.png')# sobel算子# 水平梯度处理
img_sobel1 = cv2.Sobel(img,-1,0,dy=1,ksize=3)# 垂直梯度处理
img_sobel2 = cv2.Sobel(img,-1,1,dy=0,ksize=3)# 进行梯度处理 方法一cv2.imshow('image',img)cv2.imshow('img_sobel',img_sobel1)
cv2.imshow('img_sobel2',img_sobel2)
cv2.waitKey(0)

                                 

二、梯度处理拉普拉斯算子

Laplacian算子是一种用于图像处理中边缘检测的二阶微分算子。与Sobel算子不同,Laplacian算子通过计算图像像素值的二阶导数来检测边缘,因此它对图像中的噪声更加敏感,但也能更精确地定位边缘。

功能

Laplacian算子函数的主要功能是检测图像中的边缘和纹理变化。它通过计算图像的二阶导数来突出图像中的快速变化区域,这些区域通常对应于边缘或纹理。 

def Laplacian(src: cv2.typing.MatLike,ddepth: int, dst: cv2.typing.MatLike | None = ...,ksize: int = ..., scale: float = ..., delta: float = ...,borderType: int = ...) \-> cv2.typing.MatLike: ...

参数 

  1. src (cv2.typing.MatLike)‌:

    • 输入图像,必须是一个灰度图像。
    • 类型:cv2.typing.MatLike,表示兼容 OpenCV 矩阵类型的输入。
  2. ddepth (int)‌:

    • 输出图像的所需深度。它决定了输出图像的数据类型,如 cv2.CV_8U(8 位无符号)、cv2.CV_16U(16 位无符号)、cv2.CV_32F(32 位浮点)或 cv2.CV_64F(64 位浮点)等。当参数值为 -1 时,输出图像与输入图像具有相同的深度。
  3. dst (cv2.typing.MatLike | None)‌:

    • 输出图像,与输入图像具有相同的大小和类型(除非 ddepth 指定了不同的深度)。如果此参数为 None,则函数会创建一个新的输出图像。
    • 类型:cv2.typing.MatLike | None,表示可以是兼容 OpenCV 矩阵类型的输出,或者为 None
  4. ksize (int, 默认值为 1)‌:

    • 用于计算二阶导数的滤波器的大小。它必须是正奇数,且通常取值为 1、3、5 等。当 ksize=1 时,表示使用标准的 Laplacian 滤波器(即二阶导数滤波器);当 ksize 大于 1 时,表示使用扩展的 Laplacian 滤波器,这有助于在保持边缘检测精度的同时减少噪声的影响。
  5. scale (float, 默认值为 1)‌:

    • 可选的比例因子,用于缩放二阶导数的绝对值。默认情况下,不进行缩放。
  6. delta (float, 默认值为 0)‌:

    • 可选的增量值,该值会被加到最终的梯度图像中。这可以用于调整结果的亮度或对比度。
  7. borderType (int, 默认值为 cv2.BORDER_DEFAULT)‌:

    • 边界模式,用于指定边界外像素的外推方法。常见的边界模式包括 cv2.BORDER_CONSTANT(常数填充)、cv2.BORDER_REFLECT(反射)、cv2.BORDER_REPLICATE(复制)等。默认值为 cv2.BORDER_DEFAULT,它通常表示一种合理的默认边界外推方法。

返回值 

  • cv2.typing.MatLike‌:
    • 输出图像,包含了计算得到的二阶导数信息(即 Laplacian 结果)。如果 dst 参数不为 None,则此输出图像与 dst 参数指向的图像相同;否则,函数会返回一个新的图像。

代码演示 

import cv2img = cv2.imread('./shudu.png')img_lap = cv2.Laplacian(img,-1,ksize=3)cv2.imshow('image',img)cv2.imshow('image_lap',img_lap)cv2.waitKey(0)

三、Canny算子

Canny算子(Canny Edge Detector)是一种多级边缘检测算法,被广泛应用于图像处理中,以获取图像的边缘信息。它以其良好的检测性能和抗噪声能力而著称。下面是Canny算子函数的功能、参数、返回值以及应用。

功能

Canny算子函数的主要功能是检测图像中的边缘,同时尽可能地减少噪声的影响,并精确地定位边缘。它通过一系列的处理步骤,包括高斯滤波、计算梯度、非极大值抑制和双阈值检测,来实现这一目标。

参数

def Canny(image: cv2.typing.MatLike,threshold1: float, threshold2: float,edges: cv2.typing.MatLike | None = ..., apertureSize: int = ..., L2gradient: bool = ...) \-> cv2.typing.MatLike: ...

  1. 输入图像 (src)‌:

    • 类型:灰度图像(二维数组或矩阵)。
    • 说明:需要进行边缘检测的源图像。
  2. 阈值1 (threshold1)‌:

    • 类型:浮点数或整数。
    • 说明:低阈值,用于双阈值检测中的较低阈值。
  3. 阈值2 (threshold2)‌:

    • 类型:浮点数或整数。
    • 说明:高阈值,用于双阈值检测中的较高阈值。通常是低阈值的两倍或三倍。
  4. 边缘 (edges)‌:

    • 类型:二维数组或矩阵。
    • 说明:用于存储检测到的边缘的输出图像。通常是一个与输入图像大小相同的二值图像。
  5. apertureSize (可选)‌:

    • 类型:整数。
    • 说明:Sobel算子的大小,它决定了梯度计算的精度。默认值为3,表示使用3x3的Sobel算子。
  6. L2gradient (可选)‌:

    • 类型:布尔值。
    • 说明:一个标志,指示是否使用更精确的L2范数进行梯度计算。如果为True,则使用L2范数;如果为False(默认),则使用L1范数。

 返回值

Canny算子函数的返回值通常是检测到的边缘图像,它是一个二维数组或矩阵,包含了图像中的边缘信息。这个边缘图像通常是一个二值图像,其中边缘像素的值为非零(如255),非边缘像素的值为零。

 代码演示

 四、findContours函数与drawContours函数

findContours 函数是 OpenCV 中用于检测图像中轮廓(contours)的非常有用的函数。轮廓是图像中形状或物体的边界,它们对于图像分析、物体检测和识别等任务至关重要。

drawContours 函数是 OpenCV 中用于在图像上绘制轮廓的非常实用的函数。它可以将通过 findContours 函数检测到的轮廓绘制在原始图像或任何其他图像上,以便进行可视化或进一步的处理

功能

findContours 函数的主要功能是从二值图像中检测轮廓。这些轮廓可以表示图像中物体的边界,为后续的图像分析提供关键信息

drawContours 函数的主要功能是在图像上绘制一个或多个轮廓。这些轮廓通常是通过 findContours 函数从二值图像中检测到的,但也可以是由用户自定义的点集。 

参数

def findContours(image: cv2.typing.MatLike, mode: int,method: int, contours: _typing.Sequence[cv2.typing.MatLike] | None = ...,hierarchy: cv2.typing.MatLike | None = ..., offset: cv2.typing.Point = ...) \-> tuple[_typing.Sequence[cv2.typing.MatLike],cv2.typing.MatLike]: ...

  1. image (输入图像)‌:

    • 类型:二维数组(通常是二值图像)。
    • 说明:需要进行轮廓检测的源图像。通常,这是通过阈值分割、边缘检测或其他二值化方法得到的图像。
  2. mode (轮廓检索模式)‌:

    • 类型:整数。
    • 说明:指定轮廓检索的模式。常用的模式包括 cv2.RETR_EXTERNAL(只检索外部轮廓)、cv2.RETR_LIST(检索所有轮廓,但不创建任何父子关系)、cv2.RETR_CCOMP(检索所有轮廓,并将它们组织为两层结构,顶层是外部边界,底层是孔的边界)、cv2.RETR_TREE(检索所有轮廓,并重建完整的层次结构)。
  3. method (轮廓近似方法)‌:

    • 类型:整数。
    • 说明:指定轮廓近似的方法。常用的方法包括 cv2.CHAIN_APPROX_NONE(存储所有的轮廓点,不进行任何近似)、cv2.CHAIN_APPROX_SIMPLE(压缩水平、垂直和对角线段,只保留它们的终点)、cv2.CHAIN_APPROX_TC89_L1cv2.CHAIN_APPROX_TC89_KCOS(使用 Teh-Chin 链式近似算法)。
  4. contours (输出轮廓)‌:

    • 类型:列表的列表。
    • 说明:这是一个输出参数,用于存储检测到的轮廓。每个轮廓都是一个点的列表,这些点表示了轮廓的边界。
  5. hierarchy (轮廓的层次结构, 可选)‌:

    • 类型:NumPy 数组。
    • 说明:这是一个输出参数,用于存储轮廓之间的层次关系。如果不需要层次信息,可以将其设置为 None
  6. offset (轮廓点的偏移量, 可选, 在某些版本中可能不可用)‌:

    • 类型:元组(两个整数)。
    • 说明:指定轮廓点的偏移量。这个参数在某些版本的 OpenCV 中可能不可用,或者其用法可能有所不同。

def drawContours(image: cv2.typing.MatLike,contours: _typing.Sequence[cv2.typing.MatLike],contourIdx: int,color: cv2.typing.Scalar, thickness: int = ...,lineType: int = ...,hierarchy: cv2.typing.MatLike | None = ..., maxLevel: int = ..., offset: cv2.typing.Point = ...) \-> cv2.typing.MatLike: ...
  1. image (目标图像)‌:

    • 类型:三维数组(通常是彩色图像,但也可以是灰度图像)。
    • 说明:要在其上绘制轮廓的图像。这个图像将被修改,以包含绘制的轮廓。
  2. contours (轮廓列表)‌:

    • 类型:列表的列表,其中每个内部列表都包含表示轮廓的点。
    • 说明:要绘制的轮廓列表。这些轮廓通常是通过 findContours 函数获取的。
  3. contourIdx (轮廓索引)‌:

    • 类型:整数。
    • 说明:指定要绘制的轮廓的索引。如果设置为 -1,则绘制所有轮廓。
  4. color (轮廓颜色)‌:

    • 类型:元组(三个整数,表示 BGR 颜色值)。
    • 说明:轮廓的颜色。在 OpenCV 中,颜色通常以 BGR(蓝、绿、红)格式指定,而不是常见的 RGB 格式。
  5. thickness (轮廓线宽)‌:

    • 类型:整数。
    • 说明:轮廓线的宽度。如果设置为 -1(或某些负值,具体取决于 OpenCV 版本),则轮廓内部将被填充。
  6. lineType (线条类型, 可选)‌:

    • 类型:整数。
    • 说明:线条的类型,例如 cv2.LINE_8(8-连通线)、cv2.LINE_4(4-连通线)或 cv2.LINE_AA(抗锯齿线)。默认值是 cv2.LINE_8
  7. hierarchy (轮廓层次结构, 可选)‌:

    • 类型:NumPy 数组。
    • 说明:与轮廓列表相关联的层次结构信息。这个参数通常与 findContours 函数一起使用,但在 drawContours 中通常是可选的,因为绘制轮廓时通常不需要层次信息。
  8. maxLevel (最大层次深度, 可选, 某些版本中可能不可用)‌:

    • 类型:整数。
    • 说明:指定要绘制的轮廓的最大层次深度。这个参数在某些版本的 OpenCV 中可能不可用。
  9. offset (轮廓点偏移量, 可选, 某些版本中可能不可用)‌:

    • 类型:元组(两个整数)。
    • 说明:指定轮廓点的偏移量。这个参数在某些版本的 OpenCV 中可能不可用,或者其用法可能有所不同。

 返回值

  1. contours‌: 检测到的轮廓列表。每个轮廓都是一个点的列表(或 NumPy 数组),表示了轮廓的边界。
  2. hierarchy‌: 轮廓之间的层次关系(如果请求了的话)。这是一个 NumPy 数组,包含了关于轮廓之间如何相互关联的信息。

  cv2.typing.MatLike:输出图像。如果 dst 参数不为 None,则此输出图像与 dimage参数指向的图像相同;否则,函数会返回一个新的图像。

代码演示

import cv2img = cv2.imread('./tubao.png')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
_, img_binary = cv2.threshold(img_gray,125,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)# 寻找轮廓
contours,hierarchy = cv2.findContours(img_binary,cv2.RETR_EXTERNAL, # 查询轮廓方式cv2.CHAIN_APPROX_SIMPLE) # 保存轮廓点坐标的方式img_copy = img.copy()
# 绘制轮廓
img_draw = cv2.drawContours(img_copy, # 要绘制轮廓的图像contours, # 轮廓坐标顶点坐标集合-1, # 轮廓集合的索引(255,0,0), # 轮廓颜色3) # 轮廓粗细cv2.imshow('image_binary',img_binary)
cv2.imshow('img_copy',img_copy)
cv2.waitKey(0)

 

五、透视变换矩阵函数

getPerspectiveTransform 函数是 OpenCV 中用于计算透视变换矩阵的关键函数。这个函数接受源点集(src)和目标点集(dst),然后计算出一个变换矩阵,该矩阵可以将源点集中的点映射到目标点集中的相应点。下面是对 getPerspectiveTransform 函数的详细解释,包括其功能、参数、返回值以及应用。

warpPerspective 函数是 OpenCV 中用于对图像进行透视变换的关键函数。它接受一个源图像(src)、一个透视变换矩阵(M)、一个目标图像的大小(dsize),以及可选的目标图像(dst)、插值方法(flags)、边界模式(borderMode)和边界值(borderValue),然后返回透视变换后的图像。 

功能

getPerspectiveTransform 函数的主要功能是计算一个透视变换矩阵,该矩阵可以将一个平面上的点集映射到另一个平面上的点集。这种变换在图像拼接、图像矫正、增强现实等应用中非常有用。

warpPerspective 函数的主要功能是对源图像进行透视变换,使其看起来像是从另一个角度或位置拍摄的。这种变换在图像拼接、图像矫正、3D效果模拟等应用中非常有用。 

参数

def getPerspectiveTransform(src: cv2.typing.MatLike,dst: cv2.typing.MatLike, solveMethod: int = ...) \-> cv2.typing.MatLike: ...
  1. src (源点集)‌:

    • 类型:cv2.typing.MatLike,通常是一个包含四个二维点(通常是浮点型)的 NumPy 数组或类似结构。
    • 说明:源点集,表示要进行透视变换的原始图像或平面中的四个点。这些点通常按照某种顺序排列,例如顺时针或逆时针。
  2. dst (目标点集)‌:

    • 类型:cv2.typing.MatLike,与源点集相同,也是一个包含四个二维点的 NumPy 数组或类似结构。
    • 说明:目标点集,表示透视变换后的图像或平面中的四个点。这些点应该与源点集中的点一一对应。
  3. solveMethod (求解方法, 可选)‌:

    • 类型:整数。
    • 说明:指定用于计算透视变换矩阵的求解方法。在 OpenCV 中,通常使用 cv2.DECOMP_LUcv2.DECOMP_QRcv2.DECOMP_NORMAL 等方法。如果省略此参数,OpenCV 将选择一种默认的方法。
def warpPerspective(src: cv2.typing.MatLike,M: cv2.typing.MatLike, dsize: cv2.typing.Size,dst: cv2.typing.MatLike | None = ..., flags: int = ...,borderMode: int = ...,borderValue: cv2.typing.Scalar = ...) \-> cv2.typing.MatLike: ...
  1. src (源图像)‌:

    • 类型:cv2.typing.MatLike,通常是一个包含图像数据的 NumPy 数组或类似结构。
    • 说明:要进行透视变换的源图像。
  2. M (透视变换矩阵)‌:

    • 类型:cv2.typing.MatLike,通常是一个 3x3 的浮点型矩阵。
    • 说明:透视变换矩阵,可以通过 getPerspectiveTransform 函数计算得到。
  3. dsize (目标图像大小)‌:

    • 类型:cv2.typing.Size,是一个包含两个整数的元组或类似结构。
    • 说明:透视变换后目标图像的大小,以像素为单位。
  4. dst (目标图像, 可选)‌:

    • 类型:cv2.typing.MatLike 或 None
    • 说明:如果提供,则透视变换后的图像将存储在这个参数中。如果为 None,则函数将创建一个新的图像来存储结果。
  5. flags (插值方法, 可选)‌:

    • 类型:整数。
    • 说明:指定用于图像插值的方法,例如 cv2.INTER_LINEARcv2.INTER_NEARESTcv2.INTER_CUBIC 等。默认值是 cv2.INTER_LINEAR
  6. borderMode (边界模式, 可选)‌:

    • 类型:整数。
    • 说明:指定边界像素的外推方法,例如 cv2.BORDER_CONSTANTcv2.BORDER_REFLECT 等。当图像进行透视变换后,有些像素可能会超出目标图像的边界,此时需要使用这种方法来处理这些像素。默认值是 cv2.BORDER_CONSTANT
  7. borderValue (边界值, 可选)‌:

    • 类型:cv2.typing.Scalar,通常是一个包含三个整数的元组或类似结构,表示 BGR 颜色值。
    • 说明:当 borderMode 设置为 cv2.BORDER_CONSTANT 时,这个参数指定了边界像素的颜色值。默认值是黑色 (0, 0, 0)

返回值

getPerspectiveTransform 函数返回一个 cv2.typing.MatLike 对象,通常是一个 3x3 的浮点型矩阵,表示计算出的透视变换矩阵。这个矩阵可以用于将源点集中的点映射到目标点集中的点

warpPerspective 函数返回一个 cv2.typing.MatLike 对象,表示透视变换后的图像。 

代码演示 

import cv2
import matplotlib.pyplot as plt
import numpy as npimg  = cv2.imread('./youhua.png')
img_arr = np.array(img)
plt.imshow(img_arr)
# points1 = np.array([[200,120],[700,170],[140,400],[650,460]],dtype=np.float32)
points1 =np.array([[174,141],[622,35],[88,493],[652,550]],dtype=np.float32)
points2 = np.array([[0,0],[img.shape[1],0],[0,img.shape[0]],[img.shape[1],img.shape[0]]],dtype=np.float32)
M = cv2.getPerspectiveTransform(points1,points2)
img_Perspective = cv2.warpPerspective(img,M,(img.shape[1],img.shape[0]))
cv2.imshow('img_',img_Perspective)
cv2.imshow('image',img)
cv2.waitKey(0)
plt.show()
 

 六、图像的外接边框

 在图像处理中,轮廓的外接边界框(Bounding Box)是一个非常重要的概念,它通常用于表示轮廓的外部边界。外接边界框是一个简单的矩形,它完全包含轮廓内的所有点,并且其各边与图像的坐标轴平行。

  • 轮廓‌:轮廓是图像中物体边缘的集合,通常通过边缘检测或轮廓检测算法得到。轮廓可以是不规则的形状,准确地反映了物体的外形。
  • 外接边界框‌:外接边界框是一个完全包含轮廓的矩形,它的各边与图像的坐标轴平行。外接边界框不一定紧贴轮廓,但它一定包含轮廓内的所有点

用途‌:

    • 轮廓通常用于图像分割、物体识别、形状分析等任务,因为它们提供了物体的精确边界信息。
    • 外接边界框则更多地用于物体定位、跟踪、标注等任务,因为它们简化了物体的表示,使得处理和分析更加高效。

计算‌:

  • 轮廓的计算通常涉及复杂的边缘检测或轮廓检测算法,如Canny边缘检测、Sobel算子、findContours函数等。
  • 外接边界框的计算则相对简单,一旦得到轮廓的点集,只需要找到这些点的最小和最大x、y坐标,就可以确定外接边界框的位置和大小。

 代码演示

import cv2
import numpy as np# 读取图片
img = cv2.imread('./outline.png')img = cv2.resize(img,dsize=None,fx=0.8,fy=0.8)
# 灰度化
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 二值化
_,img_binary = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)# 寻找论轮廓
c,v= cv2.findContours(img_binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓
img_copy = img.copy()
img_copy = cv2.drawContours(img_copy,c,-1,(0,0,255),2)# 外接矩形
# 给所有轮廓都绘制
for cnt in c:x,y,w,h = cv2.boundingRect(cnt)# 调用外接矩形函数 获取左上角坐标(x,y) 和宽w,高hcv2.rectangle(img_copy,[x,y],  # 左上角坐标[x+w,y+h], # 右下角坐标(255,255,0), # 矩形颜色2          # 矩形线条粗细)# 调用最小面积外接矩形函数 获取包含中心点坐标 、长宽、旋转角度的三个元组ret = cv2.minAreaRect(cnt)box = np.int32(cv2.boxPoints(ret)) # 可以获取旋转矩阵的四个顶点cv2.drawContours(img_copy,[box],-1,(255,0,0),3)cv2.polylines(img_copy,[box],True,(255,255,0),1)# 调用最小外接圆的函数,获取圆心和半径(x,y),radius = cv2.minEnclosingCircle(cnt)(x,y,radius) = np.int32((x,y,radius))cv2.circle(img_copy,(x,y),radius,(0,255,255),2)cv2.imshow('img',img)
cv2.imshow('img_copy',img_copy)cv2.waitKey(0)


总结

在计算机视觉(Computer Vision, CV)中,边缘识别是一个至关重要的步骤,它对于多种图像处理和计算机视觉任务都具有重要意义。在OpenCV等计算机视觉库中,提供了多种边缘检测算法(如Sobel算子、Laplacian算子、Canny边缘检测等),这些算法可以有效地识别图像中的边缘信息,为后续的图像处理和分析任务提供有力支持。通过合理地选择和调整算法参数,我们可以获得更好的边缘检测效果,从而提高计算机视觉任务的准确性和效率。

相关文章:

学习日志024--opencv中处理轮廓的函数

目录 前言​​​​​​​ 一、 梯度处理的sobel算子函数 功能 参数 返回值 代码演示 二、梯度处理拉普拉斯算子 功能 参数 返回值 代码演示 三、Canny算子 功能 参数 返回值 代码演示 四、findContours函数与drawContours函数 功能 参数 返回值 代码演示 …...

【从零开始入门unity游戏开发之——C#篇05】转义字符、@处理多行文本或者不使用转义字符、随机数

文章目录 一、转义字符1、什么是转义字符?2、常见的转义字符3、总结 二、使用处理多行文本或者不使用转义字符1、多行字符串2、不使用转义字符 三、随机数1、Random.Next()生成随机整数示例:生成一个随机整数生成指定范围内的随机整数 2、Random.NextSin…...

PHP获取指定日期的下周日至下周六的日期(下周几的日期)

PHP获取指定日期的下周日至下周六的日期(下周几的日期) 在PHP中,可以使用strtotime()函数来获取指定日期的下周日至下周六的日期。 // 周天 sunday // 周一 monday // 周二 tuesday // 周三 wednesday // 周四 thursday // 周五 friday // …...

超越飞书钉钉:探索高效内部知识库平替方案与应用

在团队协作日益频繁的今天,飞书与钉钉作为两大主流的企业沟通与协作平台,广受企业青睐。然而,随着企业规模的扩大和知识的累积,单纯的沟通与协作已难以满足企业对知识管理与传承的需求。因此,寻找一款能够高效整合内部…...

3D相框案例讲解(详细)

前言 通过现阶段的学习,我们已经掌握了HTML,CSS和JS部分的相关知识点,现在让我们通过一篇案例,来巩固我们近期所学的知识点。 详细视频讲解戳这里 任务一 了解目标案例样式 1.1了解案例 3D相框 1.2 分析案例 首先我们看到一个…...

一、基于langchain使用Qwen搭建金融RAG问答机器人--技术准备

一,LangChain框架介绍 LangChain 框架是一个开源工具,通过为各种 LLM 提供通用接口来简化应用程序的开发流程,帮助开发者自由构建 LLM应用。 LangChain封装了很多组件,通过这些组件的组合可以构建多种类型的RAG应用。开发者可以直接将私有数…...

2024年全球安全光幕装置行业总体规模、主要企业国内外市场占有率及排名

根据研究团队调研统计,2023年全球安全光幕装置市场销售额达到了46亿元,预计2030年将达到70亿元,年复合增长率(CAGR)为6.4%(2024-2030)。中国市场在过去几年变化较快,2023年市场规模为…...

uniapp跨端适配—条件编译

在uniapp中,跨端适配是通过条件编译实现的。条件编译允许开发者根据不同的平台(如iOS、Android、微信小程序、百度小程序等)编写不同的代码。这样可以确保每个平台上的应用都能得到最优的性能和用户体验。 以下是uniapp中条件编译的基本语法…...

HTML、CSS表格的斜表头样式设置title 画对角线

我里面有用到layui框架的影响&#xff0c;实际根据你自己的框架来小调下就可以 效果如下 上代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wi…...

自动驾驶控制与规划——Project 2: 车辆横向控制

目录 零、任务介绍一、环境配置二、算法三、代码实现四、效果展示 零、任务介绍 补全src/ros-bridge/carla_shenlan_projects/carla_shenlan_stanley_pid_controller/src/stanley_controller.cpp中的TODO部分。 一、环境配置 上一次作业中没有配置docker使用gpu&#xff0c;…...

Docker的初识

目录 1. 容器技术发展史1.1 Jail 时代1.2 云时代1.3 云原生时代1.3.1 Google & Docker 竞争1.3.2 k8s 成为云原生事实标准 2. 虚拟化和容器化的概念2.1 什么是虚拟化、容器化2.2 为什么要虚拟化、容器化&#xff1f;2.3 虚拟化实现方式2.3.1 应用程序执行环境分层2.3.2 虚拟…...

R-Studio Technician,无网络负担地进行远程数据分析和数据恢复任务

对于数据恢复技术人员和技术支持团队来说&#xff0c;时间就是金钱。这不仅包括您在客户机器上花费的时间 - 还包括您往返公司办公室的时间&#xff0c;这可能会带来巨大的不便&#xff0c;特别是如果客户位于其他省市。电话支持通常不适用于需要数小时才能完成的复杂任务&…...

Couchbase的OLAP支持情况

Couchbase 是一个高性能的 NoSQL 数据库&#xff0c;主要用于在线事务处理&#xff08;OLTP&#xff09;场景&#xff0c;但它也提供了一些功能来支持在线分析处理&#xff08;OLAP&#xff09;需求。以下是 Couchbase 对 OLAP 支持的几个方面&#xff1a; 1. N1QL 查询语言 …...

路径规划之启发式算法之十六:和声搜索算法(Harmony Search, HS)

和声搜索算法(Harmony Search, HS)是一种新兴的启发式全局搜索算法,是一种模拟音乐家即兴演奏过程的群体智能优化算法。这种算法由Zong Woo Geem等人在2001年提出,灵感来源于音乐家在寻找和声时的创造性思维过程。HS算法通过模拟音乐家演奏音乐时的选择过程来寻找问题的最优…...

服务器---centos上安装docker并使用docker配置jenkins

要在 Docker 中安装 Jenkins 并进行管理,可以按照以下步骤操作: 1. 安装 Docker 首先,确保你的系统已经安装了 Docker。如果尚未安装,可以使用以下命令进行安装: 在 CentOS 上安装 Docker sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://…...

面试题整理1---正向代理和反向代理的含义及异同

面试题整理1---正向代理和反向代理的含义及异同 1. 正向代理 (Forward Proxy)1.1 正向代理定义&#xff1a;1.2 正向代理的工作流程&#xff1a;1.3 正向代理的应用场景&#xff1a; 2. 反向代理 (Reverse Proxy)2.1 反向代理的定义&#xff1a;2.2 反向代理的工作流程&#xf…...

记录学习《手动学习深度学习》这本书的笔记(五)

这一章是循环神经网络&#xff0c;太难了太难了&#xff0c;有很多卡壳的地方理解了好久&#xff0c;比如隐藏层和隐状态的区别、代码的含义&#xff08;为此专门另写了一篇【笔记】记录对自主实现一个神经网络的步骤的理解&#xff09;、梯度计算相关&#xff08;【笔记】记录…...

鸿蒙调试打包(非正式打包)

文章目录 前言第一步&#xff1a;生成.p12和.csr文件第二步&#xff1a;申请证书的前置步骤第三步&#xff1a;申请证书 前言 HarmonyOS 应用打包后的文件为.app 格式&#xff0c; android 打包后的文件为.apk&#xff0c;IOS 打包后的文件为.apa HarmonyOS通过数字证书&#…...

Python中的容器化服务监控:结合Prometheus和Grafana实现高效监控与可视化

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在现代的DevOps和微服务架构中,容器化技术(如Docker)已成为主流的部署方式。然而,容器环境的动态特性使得服务监控和性能分析变得更加复…...

【大数据】-- 读放大和写放大

目录 一、定义 1. 读放大(Read Amplification) 定义 原因 优化方法 2. 写放大(Write Amplification) 定义 原因 优化方法 对比与联系 二、举例 1. Hadoop(HDFS) 读放大 写放大 2. Flink 读放大 写放大 3. Hive 读放大 写放大 4. Presto 读放大 写放…...

[工具升级问题] 钉钉(linux版)升级带来的小麻烦

本文由Markdown语法编辑器编辑完成。 1. 背景: 今日钉钉又发布了新的升级版本。由于我工作时使用的是Ubuntu 20.04版本&#xff0c;收到的升级推送信息是&#xff0c;可以升级到最新的7.6.25-Release版本。根据钉钉官方给出的历次更新版说明&#xff0c;这个新的版本&#xf…...

Maven学习(Maven项目模块化。模块间“继承“机制。父(工程),子项目(模块)间聚合)

目录 一、Maven项目模块化&#xff1f; &#xff08;1&#xff09;基本介绍。 &#xff08;2&#xff09;汽车模块化生产再聚合组装。 &#xff08;3&#xff09;Maven项目模块化图解。 1、maven_parent。 2、maven_pojo。 3、maven_dao。 4、maven_service。 5、maven_web。 6…...

Opencv之图像添加水印

一、实验原理 在图片处理领域&#xff0c;添加水印是一种常见的操作。通过叠加图像的方式&#xff0c;可以将水印无缝嵌入目标图像的指定位置。其基本原理包括以下步骤&#xff1a; 1、模板输入&#xff08;掩膜生成&#xff09;&#xff1a; 将水印图片转换为灰度图&#xf…...

在线预约陪诊小程序

一、前言 随着社会老龄化加剧以及人们健康意识的提高&#xff0c;就医过程中的陪伴需求日益增长。许多患者在面对复杂的医院环境、繁琐的就医流程时&#xff0c;需要有人协助挂号、候诊、取药等&#xff0c;而家属可能因工作繁忙无法全程陪同。同时&#xff0c;异地就医的患者更…...

2024年9月CCF GESP Scratch图形化编程等级考试四级真题试卷

GESP 图形化四级试卷&#xff08;A&#xff09; &#xff08;满分&#xff1a;100 分 考试时间&#xff1a;120 分钟&#xff09; 一、单选题&#xff08;共 10 题&#xff0c;每题 2 分&#xff0c;共 30 分&#xff09; 1、2024 年 10 月 8 日&#xff0c;诺贝尔物理学奖“意…...

[免费]SpringBoot+Vue校园社团管理系统(优质版)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue校园社团管理系统(优质版)&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue校园社团管理系统(优质版) Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息技术的迅速发展&#x…...

NX系列-使用 `nmcli` 命令创建 Wi-Fi 热点并设置固定 IP 地址

使用 nmcli 命令创建 Wi-Fi 热点并设置固定 IP 地址 一、前言 在一些场景下&#xff0c;我们需要将计算机或嵌入式设备&#xff08;例如 NVIDIA Orin NX&#xff09;转换为 Wi-Fi 热点&#xff0c;以便其他设备&#xff08;如手机、笔记本等&#xff09;能够连接并使用该设备…...

Qt控件的盒子模型,了解边距边线和内容区

这篇专门讲讲一个控件在绘制时的视觉样式。我们平常在对控件设置样式时&#xff0c;需要设置控件的一些外边距&#xff0c;内边距&#xff0c;边线&#xff0c;还有文字内容&#xff0c;贴上图片等。那么对于一个控件&#xff0c;到底怎么实现这些设置的呢&#xff1f; 先看下面…...

深度学习基础--将yolov5的backbone模块用于目标识别会出现怎么效果呢??

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 yolov5网络结构比较复杂&#xff0c;上次我们简要介绍了yolov5网络模块&#xff0c;并且复现了C3模块&#xff0c;深度学习基础–yolov5网络结构简介&a…...

MySQL 根据 字段包含关键词进行分类

为了解决动态关键词匹配的需求&#xff0c;我们需要创建一个关键词表&#xff08;keywords_table&#xff09;&#xff0c;其中存储关键词和对应的类别。以下是具体的步骤&#xff1a; 1. 创建关键词表 可以用以下 SQL 创建一个简单的关键词表&#xff1a; CREATE TABLE keyw…...

ssm-day04 mybatis

mybatis是一个持久层框架&#xff0c;针对的是JDBC的优化 简化数据库操作&#xff0c;能进行单表、多表操作&#xff0c;在这个框架下&#xff0c;需要我们自己写SQL语句 Mapper接口和MapperXML文件就相当于Dao和Dao层的实现 通常将xml文件放在resources包下 &#xff0c;放在…...

soul大数据面试题及参考答案

如何看待数据仓库? 数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。 从数据存储角度看,它整合了来自多个数据源的数据。这些数据源可能包括业务系统数据库、日志文件等各种结构化和非结构化数据。例如,在电商企业中,它会整合订…...

【SpringBoot中MySQL生成唯一ID的常见方法】

SpringBoot中MySQL生成唯一ID的常见方法 在Spring Boot中&#xff0c;为MySQL生成唯一ID有多种方式&#xff0c;每种方式都有其特定的概念、优越点和使用场景。以下是详细的说明和代码示例&#xff1a; UUID 概念: UUID&#xff08;Universally Unique Identifier&#xff0…...

在 Windows 环境下将 Vue 项目打包并压缩为 .zip 文件的批处理脚本

以下是一个 Windows 批处理脚本&#xff0c;完成以下任务&#xff1a; 运行 npm run build 打包 Vue 项目。使用 7-Zip 将生成的 dist 目录压缩成 ZIP 文件。 脚本内容 echo off:: 切换命令行编码为 UTF-8 chcp 65001 >nul:: 设置环境变量 set PROJECT_DIRC:\path\to\you…...

ubuntu上更改ext4格式的硬盘为 windows的 NTFS 格式参考

1. ubuntu上安装 sudo apt-get install gparted 2. 参考如下&#xff0c;下面是转换后的样例。 3.windows上添加识别新硬盘参考 先在设备管理器中 找到下面 磁盘管理 如下&#xff1a;找到类似下面的磁盘2 查看相关信息 右键可以新建卷和格式化&#xff0c;下面是已经新建…...

Qt WORD/PDF(二)使用 QtPdfium库实现 PDF操作、打印等

关于QT Widget 其它文章请点击这里: QT Widget GitHub 源码: QWidgetLearningPro &#xff08;暂未更新&#xff09; 姊妹篇: Qt WORD/PDF&#xff08;一&#xff09;使用 QtPdfium库实现 PDF 操作 Qt WORD/PDF&#xff08;二&#xff09;使用 QtPdfium库实现 …...

信息化基础知识——数字政府(山东省大数据职称考试)

大数据分析应用-初级 第一部分 基础知识 一、大数据法律法规、政策文件、相关标准 二、计算机基础知识 三、信息化基础知识 四、密码学 五、大数据安全 六、数据库系统 七、数据仓库. 第二部分 专业知识 一、大数据技术与应用 二、大数据分析模型 三、数据科学 数字政府 大数…...

使用winscp从windows访问Ubuntu进行文件传输

Ubuntu 系统上的准备工作 • 安装 SSH 服务器&#xff1a; 确保 Ubuntu 系统上已经安装了 SSH 服务器。如果没有安装&#xff0c;可以使用以下命令安装&#xff1a; sudo apt update sudo apt install openssh-server • 启动 SSH 服务&#xff1a; 确保 SSH 服务正在运行&a…...

【返璞归真】score检验:似然比的得分检验(Likelihood Ratio Score Test)

Score检验&#xff08;Score Test&#xff09;是一种用于假设检验的方法&#xff0c;特别是在统计建模中&#xff0c;常用于估计模型参数时检验某个假设是否成立。它的全名是“似然比的得分检验”&#xff08;Likelihood Ratio Score Test&#xff09;&#xff0c;通常用于大样…...

使用skywalking,grafana实现从请求跟踪、 指标收集和日志记录的完整信息记录

Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的开源项目&#xff0c; 2017年12月SkyWalking成为Apache国内首个个人孵化项目&#xff0c; 2019年4月17日SkyWalking从Apache基金会的孵化器毕业成为顶级项目&#xff0c; 目前SkyWalking支持Java、 .Net、 Node.js、…...

蓝桥杯刷题——day1

蓝桥杯刷题——day1 题目一题干题目解析代码 题目二题干题目解析代码 题目一 题干 给定一个字符串 s &#xff0c;验证 s 是否是 回文串 &#xff0c;只考虑字母和数字字符&#xff0c;可以忽略字母的大小写。本题中&#xff0c;将空字符串定义为有效的 回文串 。 题目链接&a…...

ORACLE RAC ADG备库报错ORA-04021: timeout occurred while waiting to lock object

问题&#xff1a;核心的灾备 RAC ADG 备库&#xff0c;这两天频繁重启&#xff0c;并且报如下错误&#xff0c;通过查看MOS&#xff0c;发现是个BUG ADG备库的ALERT错误日志如下&#xff1a; Errors in file /u01/app/oracle/diag/rdbms/hxxxsz/hxxxsz1/trace/hxxxsz1_lgwr_69…...

虚拟机Ubuntu以及pwn的工具安装

之前pwn入门在kali上装了&#xff0c;师兄说用Ubuntu会比kali好得多&#xff0c;更有利于pwn的学习&#xff0c;本着少走弯路的想法我就决定装一个&#xff0c;再把工具什么的配了 一、Ubuntu的安装 参考博客及镜像来源&#xff1a;VMware虚拟机安装Ubuntu教程(超详细)_vmwar…...

MeiliSearch:一款轻量级开源搜索引擎

Meilisearch 是由 Meili &#xff08;一家总部位于法国的软件开发公司&#xff09;创建的搜索引擎&#xff0c;目前在 Github 上有 47.9k stars。 Meillisearch 具备以下特色功能&#xff08;ChatGPT-4o 翻译&#xff09;&#xff1a; 混合搜索&#xff1a;结合语义搜索和全文…...

数据库入门

基本概念 数据库&#xff1a;DataBase简称DB&#xff0c;是一个用于存储和管理数据的仓库。 就像我们每天访问的网站Bilibili&#xff0c;OA、ERP和CRM等内部管理系统&#xff0c;以及我们每天使用的腾讯新闻和Tiktok应用程序一样&#xff0c;我们看到的数据实际上存储在数据库…...

WebGIS城市停水及影响范围可视化实践

目录 前言 一、相关信息介绍 1、停水信息的来源 2、停水包含的相关信息 二、功能简介 1、基础小区的整理 2、停水计划的管理 三、WebGIS空间可视化 1、使用到的组件 2、停水计划的展示 3、影响小区的展示 4、实际效果 四、总结 前言 城市停水&#xff0c;一个看似…...

【Syncfusion系列】Diagram 杂谈 第三篇 序列化和反序列化

目录 序列化保存C# 代码示例&#xff0c; 方式1 &#xff1a;C# 代码示例&#xff0c; 方式2 &#xff1a; 反序列化加载C# 代码示例, 方式1&#xff1a;C# 代码示例, 方式2&#xff1a; **如何序列化自定义属性**序列化和反序列化都存在的一个问题解决方式 图表是否已修改&…...

#思科模拟器通过服务配置保障无线网络安全Radius

演示拓扑图&#xff1a; 搭建拓扑时要注意&#xff1a; 只能连接它的Ethernet接口&#xff0c;不然会不通 MAC地址绑定 要求 &#xff1a;通过配置MAC地址过滤禁止非内部员工连接WiFi 打开无线路由器GUI界面&#xff0c;点开下图页面&#xff0c;配置路由器无线网络MAC地址过…...

Repo管理

文章目录 前言Repo介绍清单仓库清单仓库的组成 初始化Repo同步远程仓库Repo实际应用 前言 我们知道&#xff0c;Git是用来管理某一个仓库&#xff0c;那当一个项目用到了多个仓库时&#xff0c;怎么来同步管理这些仓库呢&#xff1f;这个时候就可以引入Repo管理。 Repo介绍 …...

代码随想录算法训练营第四十八/九天 | 图 | 深度搜索 | 广度搜索

Day 48 49 总结 自己实现中遇到哪些困难今日收获&#xff0c;记录一下自己的学习时间 11:40 - 14:3012:30 - 13:30, 14:45 - 17:10 图论 深度收缩 & 广度搜索 并查集 最小生成树 拓扑排序 最短路径算法 图论基础 图 二维空间里&#xff0c;多个点之间相互连接图的…...