opencv基础篇 ——(七)边缘检测和图像锐化

        锐化和边缘检测是图像处理中常用的两种技术,它们可以用来增强图像的特征以及检测图像中的边缘

锐化: 锐化是一种增强图像中细节和边缘的技术,它使图像中的过渡区域更加明显,从而提高图像的清晰度和对比度。常见的锐化方法包括拉普拉斯算子和高斯滤波器等。

边缘检测: 边缘检测是一种寻找图像中突变区域的技术,它可以帮助我们找到图像中不同区域之间的边界。常见的边缘检测算法包括 Sobel、Canny 和 Scharr 等。

拉普拉斯算子laplacian 

        cv::laplacian 是 OpenCV 库中用于计算图像拉普拉斯算子(Laplacian operator)的函数,常用于边缘检测和图像锐化。拉普拉斯算子是一个二阶微分算子,可以捕捉图像中灰度值的快速变化,即边缘和细节变化。

函数声明:

void cv::laplacian(
    InputArray src,
    OutputArray dst,
    int ddepth,
    int ksize = 1,
    double scale = 1,
    double delta = 0,
    int borderType = BORDER_DEFAULT);

参数说明:

  • InputArray src: 输入图像,可以是单通道 8-bit、16-bit 或 32-bit 浮点型图像,或者是多通道图像(在这种情况下,每个通道分别计算拉普拉斯响应,然后组合成输出图像)。

  • OutputArray dst: 输出图像,存储计算得到的拉普拉斯响应。数据类型取决于 ddepth 参数。

  • int ddepth: 输出图像的数据深度。可以选择如下值:

    • -1:表示与输入图像 src 同样的深度。
    • CV_8UCV_16UCV_16SCV_32F 或 CV_64F:指定输出图像的具体数据类型。
  • int ksize: 拉普拉斯滤波器的大小,必须为奇数且大于等于 1。较大的 ksize 可以平滑噪声,但可能会降低边缘定位的精度;较小的 ksize 对噪声敏感,但能更好地保留边缘细节。

  • double scale: 用于调整拉普拉斯响应的尺度因子。计算出的拉普拉斯值乘以 scale 后再存储到输出图像中。默认值为 1

  • double delta: 加到拉普拉斯响应上的偏置值。通常用于避免由于计算导致的负值或值过小的问题,有助于保持结果的动态范围。默认值为 0

  • int borderType: 边界填充类型,定义了如何处理图像边缘以外的像素。可选值包括:

    • BORDER_CONSTANT: 使用指定的 borderValue 填充边缘。
    • BORDER_REPLICATE: 复制边缘像素值。
    • BORDER_REFLECT: 反射边缘像素。
    • BORDER_WRAP: 包裹边缘像素。
    • 其他边界模式,具体参见 OpenCV 文档。

    默认值为 BORDER_DEFAULT,相当于 BORDER_REFLECT_101,即边缘像素以一种类似镜面反射的方式扩展。

工作原理与应用:

cv::laplacian 函数计算输入图像 src 上的拉普拉斯算子响应。拉普拉斯算子本质上是对图像在二维空间上进行二次微分,其数学表达式为:

其中,( f(x, y) ) 表示图像在坐标 ( (x, y) )处的灰度值。通过计算图像在水平和垂直方向上的二阶导数之和,拉普拉斯算子能够检测到灰度值的过零点(zero-crossings),这些点通常对应图像中的边缘位置。

在实际计算过程中,cv::laplacian 函数使用一个离散化的模板(卷积核)来近似拉普拉斯算子。模板的大小由 ksize 参数指定,常见的如 3x35x5 等。模板内的系数构成一个类似于: 

的对角线权重分布,中心像素与周围像素的差异被放大,从而凸显边缘。

应用示例:

// 读取输入图像
cv::Mat src = cv::imread("input_image.png", cv::IMREAD_GRAYSCALE);

// 计算拉普拉斯响应,输出图像为 CV_8U 类型
cv::Mat laplacianImage;
cv::Laplacian(src, laplacianImage, CV_8U, 3);

// 将拉普拉斯响应进行阈值处理以获得边缘图像
cv::threshold(laplacianImage, laplacianImage, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);

// 显示结果
cv::imshow("Original Image", src);
cv::imshow("Laplacian Edges", laplacianImage);
cv::waitKey();

边缘检测算法Canny 

  cv::Canny 是 OpenCV 库中用于实现 Canny 边缘检测算法的函数。Canny 边缘检测是一种广泛应用的边缘检测方法,因其能够提供高质量、单像素宽且无断点的边缘,同时具备较好的抗噪性能而闻名。

函数声明:

void cv::Canny(
    InputArray image,
    OutputArray edges,
    double threshold1,
    double threshold2,
    int apertureSize = 3,
    bool L2gradient = false);

参数说明:

  • InputArray image: 输入图像,通常为单通道 8-bit 或浮点型灰度图像。为了得到最佳结果,建议先对彩色图像进行灰度化处理。

  • OutputArray edges: 输出边缘图像,与输入图像 image 同样大小,存储类型为 8-bit 单通道图像,其中边缘像素值为非零值(通常为 255),非边缘像素值为零。

  • double threshold1: 较低阈值。任何边缘强度高于此阈值的像素被认为是潜在边缘。

  • double threshold2: 较高阈值。只有那些连接到至少一个高于较高阈值的边缘像素的潜在边缘才会最终被保留为真正的边缘。

  • int apertureSize: Sobel 导数计算时使用的卷积核大小,一般取值为 3 或 5。较大的值可以提供更精确的边缘方向估计,但计算成本更高。

  • bool L2gradient: 是否使用 L2 范数(欧几里得范数)来计算图像梯度。默认值为 false,表示使用 L1 范数(绝对值和)。

工作原理与应用:

Canny 边缘检测算法通常包含以下四个步骤:

  1. 高斯滤波: 首先对输入图像进行高斯平滑,以减少噪声对边缘检测的影响。这一步通常使用高斯核进行卷积操作。

  2. 梯度计算: 计算平滑后的图像在水平和垂直方向上的一阶导数(梯度)。OpenCV 使用 Sobel 算子或者 Scharr 算子(如果指定了 L2gradient=true)来完成这一任务。计算得到的梯度包括幅值(表示边缘强度)和方向。

  3. 非极大值抑制: 在梯度方向上对每个像素进行局部比较,如果该像素的梯度幅值不是其梯度方向上邻域内的最大值(即非极大值),则将其梯度幅值置零,以消除边缘检测过程中产生的虚假响应。

  4. 双阈值检测: 应用两个阈值(threshold1 和 threshold2)来确定最终的边缘。所有梯度幅值高于较高阈值的像素被认为是边缘像素;对于幅值介于高低阈值之间的像素,如果它们与已确定的边缘像素(即幅值超过较高阈值的像素)相连,则也被认为是边缘像素。低于较低阈值的像素被舍弃。

应用示例:

// 读取输入图像并转换为灰度
cv::Mat src = cv::imread("input_image.png", cv::IMREAD_GRAYSCALE);

// 设置 Canny 边缘检测参数
double lowThreshold = 100.0;
double highThreshold = 200.0;

// 执行 Canny 边缘检测
cv::Mat edges;
cv::Canny(src, edges, lowThreshold, highThreshold, 3);

// 显示结果
cv::imshow("Original Image", src);
cv::imshow("Canny Edges", edges);
cv::waitKey();

索贝尔算子 Sobel

        Sobel 算子是一种常用的边缘检测算子,通过计算图像在特定方向上的一阶或二阶导数来检测图像中的边缘。

函数声明:

void cv::Sobel(
    InputArray src,
    OutputArray dst,
    int ddepth,
    int dx,
    int dy,
    int ksize = 3,
    double scale = 1,
    double delta = 0,
    int borderType = BORDER_DEFAULT);

参数说明:

  • InputArray src: 输入图像,通常为单通道 8-bit 或浮点型灰度图像。为了得到最佳结果,建议先对彩色图像进行灰度化处理。

  • OutputArray dst: 输出图像,存储计算得到的 Sobel 算子响应。数据类型取决于 ddepth 参数。

  • int ddepth: 输出图像的数据深度。可以选择如下值:

    • -1:表示与输入图像 src 同样的深度。
    • CV_8UCV_16UCV_16SCV_32F 或 CV_64F:指定输出图像的具体数据类型。
  • int dx 和 int dy: 分别表示在 x 轴和 y 轴方向上的微分阶数。通常 dx 和 dy 取值为 1(表示一阶导数),用于计算图像在水平和垂直方向上的边缘。若两者均为 0,则 cv::Sobel 函数相当于进行图像平滑处理。也可以取值为 2(表示二阶导数),用于计算图像的拉普拉斯响应(边缘强度)。

  • int ksize: Sobel 核函数的大小,必须为奇数且大于等于 1。常见的取值有 357 等。较大的 ksize 可以平滑噪声,但可能会降低边缘定位的精度;较小的 ksize 对噪声敏感,但能更好地保留边缘细节。

  • double scale: 用于调整 Sobel 响应的尺度因子。计算出的 Sobel 值乘以 scale 后再存储到输出图像中。默认值为 1

  • double delta: 加到 Sobel 响应上的偏置值。通常用于避免由于计算导致的负值或值过小的问题,有助于保持结果的动态范围。默认值为 0

  • int borderType: 边界填充类型,定义了如何处理图像边缘以外的像素。可选值包括:

    • BORDER_CONSTANT: 使用指定的 borderValue 填充边缘。
    • BORDER_REPLICATE: 复制边缘像素值。
    • BORDER_REFLECT: 反射边缘像素。
    • BORDER_WRAP: 包裹边缘像素。
    • 其他边界模式,具体参见 OpenCV 文档。

    默认值为 BORDER_DEFAULT,相当于 BORDER_REFLECT_101,即边缘像素以一种类似镜面反射的方式扩展。

工作原理与应用:

cv::Sobel 函数计算输入图像 src 上的 Sobel 算子响应。Sobel 算子本质上是一种离散化的微分算子,用于估计图像在特定方向上的导数。对于一阶导数,Sobel 算子的核函数在 x 轴和 y 轴方向上分别为:

-1   0   1
-2   0   2
-1   0   1

-1  -2  -1
 0   0   0
 1   2   1

计算得到的响应可以反映图像在相应方向上灰度值的变化情况,即边缘信息。当 dx 和 dy 为 1 时,cv::Sobel 函数返回图像在 x 轴和 y 轴方向上的梯度;当两者均为 2 时,返回图像的拉普拉斯响应,即边缘强度。

在实际应用中,cv::Sobel 函数通常用于计算图像在 x 轴和 y 轴方向上的梯度幅值和方向,进而用于边缘检测、图像分析和计算机视觉任务。计算得到的 Sobel 响应可以进一步通过阈值处理、非极大值抑制等步骤提取出图像的边缘。

应用示例:

// 读取输入图像并转换为灰度
cv::Mat src = cv::imread("input_image.png", cv::IMREAD_GRAYSCALE);

// 计算 Sobel 响应在 x 轴和 y 轴方向上的响应
cv::Mat sobelX, sobelY;
cv::Sobel(src, sobelX, CV_32F, 1, 0, 3);
cv::Sobel(src, sobelY, CV_32F, 0, 1, 3);

// 计算梯度幅值和方向
cv::Mat gradientMag, gradientAngle;
cv::cartToPolar(sobelX, sobelY, gradientMag, gradientAngle, true);

// 应用阈值处理提取边缘
double edgeThresh = 50.0;
cv::Mat edges;
cv::threshold(gradientMag, edges, edgeThresh, 255, cv::THRESH_BINARY);

// 显示结果
cv::imshow("Original Image", src);
cv::imshow("Sobel Edges", edges);
cv::waitKey();

Scharr算子

        Scharr 算子是一种专门设计用于图像边缘检测的微分算子,它是 Sobel 算子的一种改进版本,特别是在处理较小的内核尺寸(如 3x3)时,Scharr 算子能提供更高的精度。

函数声明:

void cv::Scharr(
    InputArray src,
    OutputArray dst,
    int ddepth,
    int dx,
    int dy,
    double scale = 1,
    double delta = 0,
    int borderType = BORDER_DEFAULT);

参数说明:

  • InputArray src: 输入图像,通常为单通道 8-bit 或浮点型灰度图像。为了得到最佳结果,建议先对彩色图像进行灰度化处理。

  • OutputArray dst: 输出图像,存储计算得到的 Scharr 算子响应。数据类型取决于 ddepth 参数。

  • int ddepth: 输出图像的数据深度。可以选择如下值:

    • -1:表示与输入图像 src 同样的深度。
    • CV_8UCV_16UCV_16SCV_32F 或 CV_64F:指定输出图像的具体数据类型。
  • int dx 和 int dy: 分别表示在 x 轴和 y 轴方向上的微分阶数。通常 dx 和 dy 取值为 1(表示一阶导数),用于计算图像在水平和垂直方向上的边缘。若两者均为 0,则 cv::Scharr 函数相当于进行图像平滑处理。

  • double scale: 用于调整 Scharr 响应的尺度因子。计算出的 Scharr 值乘以 scale 后再存储到输出图像中。默认值为 1

  • double delta: 加到 Scharr 响应上的偏置值。通常用于避免由于计算导致的负值或值过小的问题,有助于保持结果的动态范围。默认值为 0

  • int borderType: 边界填充类型,定义了如何处理图像边缘以外的像素。可选值包括:

    • BORDER_CONSTANT: 使用指定的 borderValue 填充边缘。
    • BORDER_REPLICATE: 复制边缘像素值。
    • BORDER_REFLECT: 反射边缘像素。
    • BORDER_WRAP: 包裹边缘像素。
    • 其他边界模式,具体参见 OpenCV 文档。

    默认值为 BORDER_DEFAULT,相当于 BORDER_REFLECT_101,即边缘像素以一种类似镜面反射的方式扩展。

工作原理与应用:

cv::Scharr 函数计算输入图像 src 上的 Scharr 算子响应。Scharr 算子是一种精确的一阶微分算子,其核函数在设计时考虑了像素间的距离权重,使得在小内核尺寸(如 3x3)下也能更精确地逼近图像的一阶导数。对于一阶导数,Scharr 算子的核函数在 x 轴和 y 轴方向上分别为:

 3   10   3
 0    0   0
-3  -10  -3

-3   0    3
-10   0   10
-3    0   3

相比于传统的 Sobel 算子,Scharr 算子的权重分配更接近于理论上的精确一阶导数计算,尤其是在接近图像边缘的像素处,这使得它在相同内核尺寸下能提供更精确的边缘检测结果。

在实际应用中,cv::Scharr 函数通常用于计算图像在 x 轴或 y 轴方向上的梯度幅值和方向,进而用于边缘检测、图像分析和计算机视觉任务。计算得到的 Scharr 响应可以进一步通过阈值处理、非极大值抑制等步骤提取出图像的边缘。

应用示例:

// 读取输入图像并转换为灰度
cv::Mat src = cv::imread("input_image.png", cv::IMREAD_GRAYSCALE);

// 计算 Scharr 响应在 x 轴和 y 轴方向上的响应
cv::Mat scharrX, scharrY;
cv::Scharr(src, scharrX, CV_32F, 1, 0);
cv::Scharr(src, scharrY, CV_32F, 0, 1);

// 计算梯度幅值和方向
cv::Mat gradientMag, gradientAngle;
cv::cartToPolar(scharrX, scharrY, gradientMag, gradientAngle, true);

// 应用阈值处理提取边缘
double edgeThresh = 50.0;
cv::Mat edges;
cv::threshold(gradientMag, edges, edgeThresh, 255, cv::THRESH_BINARY);

// 显示结果
cv::imshow("Original Image", src);
cv::imshow("Scharr Edges", edges);
cv::waitKey();

spatialGradient 算子

        cv::spatialGradient 是 OpenCV 库中用于计算图像的局部空间梯度(即 x 和 y 方向的一阶导数)的函数。该函数返回一个包含两个元素的 std::vector<cv::Mat>,分别表示图像在 x 轴和 y 轴方向上的梯度响应。

std::vector<cv::Mat> cv::spatialGradient(
    InputArray src,
    OutputArray dx,
    OutputArray dy,
    int ksize = 3,
    int borderType = BORDER_DEFAULT);

参数说明:

  • InputArray src: 输入图像,通常为单通道 8-bit 或浮点型灰度图像。为了得到最佳结果,建议先对彩色图像进行灰度化处理。

  • OutputArray dx 和 OutputArray dy: 可选的输出参数,分别用于存储图像在 x 轴和 y 轴方向上的梯度响应。如果不提供这两个参数,函数将返回一个包含两个元素的 std::vector<cv::Mat> 结果。

  • int ksize: 梯度计算所使用的卷积核大小,必须为奇数且大于等于 1。常见的取值有 357 等。较大的 ksize 可以平滑噪声,但可能会降低边缘定位的精度;较小的 ksize 对噪声敏感,但能更好地保留边缘细节。

  • int borderType: 边界填充类型,定义了如何处理图像边缘以外的像素。可选值包括:

    • BORDER_CONSTANT: 使用指定的 borderValue 填充边缘。
    • BORDER_REPLICATE: 复制边缘像素值。
    • BORDER_REFLECT: 反射边缘像素。
    • BORDER_WRAP: 包裹边缘像素。
    • 其他边界模式,具体参见 OpenCV 文档。

    默认值为 BORDER_DEFAULT,相当于 BORDER_REFLECT_101,即边缘像素以一种类似镜面反射的方式扩展。

工作原理与应用:

cv::spatialGradient 函数计算输入图像 src 上的局部空间梯度,即在 x 轴和 y 轴方向上的一阶导数。函数内部可能使用 Sobel 算子、Scharr 算子或其他适当的微分算子来计算梯度。计算得到的梯度响应反映了图像在相应方向上灰度值的变化情况,即边缘信息。

在实际应用中,cv::spatialGradient 函数通常用于计算图像在 x 轴和 y 轴方向上的梯度幅值和方向,进而用于边缘检测、图像分析和计算机视觉任务。计算得到的梯度响应可以进一步通过阈值处理、非极大值抑制等步骤提取出图像的边缘。

应用示例:

// 读取输入图像并转换为灰度
cv::Mat src = cv::imread("input_image.png", cv::IMREAD_GRAYSCALE);

// 计算图像的 x 和 y 方向梯度
cv::Mat dx, dy;
cv::spatialGradient(src, dx, dy, 3);

cv::Mat fdx, fdy;
dx.convertTo(fdx, CV_32F);
dy.convertTo(fdy, CV_32F);

// 计算梯度幅值和方向
cv::Mat gradientMag, gradientAngle;
cv::cartToPolar(fdx, fdy, gradientMag, gradientAngle, true);

// 应用阈值处理提取边缘
double edgeThresh = 50.0;
cv::Mat edges;
cv::threshold(gradientMag, edges, edgeThresh, 255, cv::THRESH_BINARY);

// 显示结果
cv::imshow("Original Image", src);
cv::imshow("Spatial Gradient Edges", edges);
cv::waitKey();

效果展示

laplacian、canny算子效果

sobel、scharr算子效果

spatialGradient 算子

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/575038.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

matlab保存示波器数据

再重新运行一下示波器 然后就可以在工作区看见&#xff08;这里没有运行所以没有&#xff09; 将保存到文件夹中方便后续绘图

第十五届蓝桥杯省赛第二场C/C++B组D题【前缀总分】题解(AC)

暴力解法 O ( 26 n 5 ) O(26n^5) O(26n5) 枚举将第 i i i 个字符串的第 j j j 个字符改为 c c c 的所有方案&#xff0c;时间复杂度 O ( 26 n 2 ) O(26n^2) O(26n2)&#xff0c;修改并计算总分&#xff0c; O ( n 3 ) O(n^3) O(n3)。 暴力优化 O ( 26 n 3 log ⁡ n ) O…

解析企业绩效通系统架构:构建高效管理与激励平台

在当今竞争激烈的商业环境中&#xff0c;企业需要不断提升管理效率和员工激励力度&#xff0c;以保持竞争优势并实现可持续发展。绩效通系统作为一种集成了绩效管理、激励机制和员工发展规划的管理工具&#xff0c;正逐渐成为现代企业管理的核心组成部分。本文将深入探讨企业绩…

mybatis-plus(二)集成与demo

一、集成 1、pom&#xff1a; 2、配置文件 3、启动类与业务逻辑&#xff1a; 无变化。引入mybatis-plus后&#xff0c;原mybatis逻辑可以正常使用。 二、demo 1、代码框架 &#xff08;1&#xff09;pom&#xff1a; <?xml version"1.0" encoding"UT…

Python实现本地视频/音频播放器

Python实现本地视频/音频播放器 在Python中&#xff0c;有几个库可以用于视频播放&#xff0c;但是没有一个库是完美的&#xff0c;因为它们可能依赖于外部软件或有一些限制。 先看介绍用Python实现本地视频播放器&#xff0c;再介绍用Python实现本地音乐播放器。 Python实现…

CSS Position定位(详解网页中的定位属性)

目录 一、Position介绍 1.概念 2.特点 3.作用 4.应用 二、Position用法 1.position属性 2.static定位 3.fixed定位 4.relative定位 5.absolute定位 6.sticky定位 7.重叠的元素 三、CSS定位属性 四、总结 一、Position介绍 1.概念 文档流&#xff08;Document Fl…

【从后端日志文件中过滤出sql语句】

从后端日志文件中过滤出sql语句 why?思路日志文件的格式 结果 why? 为什么会有这种需求&#xff1f;&#xff0c;mysql数据不小心被删了完全可以从备份数据恢复&#xff0c;或者从binlog中恢复&#xff0c;但是如果前面这两种方法没办法处理&#xff08;没有备份数据库文件、…

ray.tune调参学习笔记1:超参数优化器tuner设置

最近研究中学习使用python的ray.tune进行神经网络调参。在这里记录学习过程中的收获&#xff0c;希望能够帮助到有同样需求的人。学习过程主要参考ray官网文档&#xff0c;但由于笔者使用的ray为2.2.0版本&#xff0c;而官方文档为更高级版本&#xff0c;笔者代码和官方文档代码…

数字藏品:重塑艺术与科技的新媒介

数字藏品&#xff0c;这个新兴的词汇&#xff0c;正在逐渐渗透到我们的日常生活中。它不仅是一种新的艺术表达方式&#xff0c;更是一种科技与艺术相结合的全新媒介。那么&#xff0c;数字藏品究竟是什么呢&#xff1f; 首先&#xff0c;我们需要明确一点&#xff0c;数字藏品并…

qt QTreeWidget 学习

树形控件的节点可以有多层、多个子节点&#xff0c; 如果将子节点全部展开&#xff0c;那么每一行都是一个数据条目。QTreeWidgetItem 比较特殊&#xff0c;一个条目内部可以有多列数据信息&#xff0c;相当于表格控件一整行的表格单元集成为一个条目。 默认情况下&#xff0c;…

ELK技术介绍:背景、功能及应用场景全面解析

一、ELK概述 ELK是由Elasticsearch、Logstash和Kibana三个开源软件组成的日志管理解决方案&#xff0c;这一组合在近年来得到了广泛的关注和应用。ELK的出现&#xff0c;源于大数据和云计算技术的快速发展&#xff0c;以及对高效日志管理的迫切需求。 随着企业信息化程度…

Nginx 配置 SSL(HTTPS)详解

Nginx作为一款高性能的HTTP和反向代理服务器&#xff0c;自然支持SSL/TLS加密通信。本文将详细介绍如何在Nginx中配置SSL&#xff0c;实现HTTPS的访问。 随着互联网安全性的日益重要&#xff0c;HTTPS协议逐渐成为网站加密通信的标配。Nginx作为一款高性能的HTTP和反向代理服务…

6、ES单机设置用户名密码、集群设置用户名密码、es-head登录、如何去掉密码

目录 一、ES单节点密码配置1、修改配置文件2、 重启es服务3&#xff0c;执行修改密码命令4、访问服务 二、ES集群密码配置1、确定主节点2、生成elastic-stack-ca.p123、生成elastic-certificates.p124、修改配置文件并重启集群5、进行密码配置6、验证 三、es-head登录增加密码的…

ABAP json解析使用引用代替预定义数据结构

背景&#xff1a;在解析JSON数据时&#xff0c;通常会事先为定义相应的ABAP数据结构。但是&#xff0c;当遇到一些结构纵深较为复杂的情况时&#xff0c;会比较麻烦。 处理&#xff1a;使用引用类型来定义结构中的纵深部分来达到“省事”的目的&#xff0c;缺点在于访问时需要使…

Docker——开源的应用容器的引擎

目录 一、前言 1.虚拟化产品有哪些 1.1寄居架构 1.2源生架构 2.虚拟化产品对比/介绍 2.1虚拟化产品 2.1.1仿真虚拟化 2.1.2半虚拟化 2.1.3全虚拟化 2.2重点 2.2.1KVM——Linux内核来完成的功能和性能 2.2.2ESXI——用的比较多 二、Docker概述 1.Docker定义 2.Do…

赋能智慧校园!A3D数字孪生可视化,轻量又高效!

放假之后&#xff0c;学生们会逐步返学&#xff0c;大量人员出入校园&#xff0c;安全更是不容忽视&#xff0c;如何在短时间内对大批人员及设施进行智能监管&#xff1f;数字化转型是关键手段&#xff0c;我们可以融合线上线下数据&#xff0c;搭建3D立体的智慧校园&#xff0…

智能合约——提案demo

目录 这是一个超超超级简单的智能合约提案项目&#xff0c;你确定不点进来看一下吗&#xff1f; 引言&#xff1a; 1、搭建开发环境&#xff1a; 2、编写智能合约&#xff1a; 3、部署智能合约&#xff1a; ​编辑​编辑4、编写前端交互代码&#xff08;使用web3.js&…

MyBatis源码之MyBatis中SQL语句执行过程

MyBatis源码之MyBatis中SQL语句执行过程 SQL执行入口 我们在使用MyBatis编程时有两种方式&#xff1a; 方式一代码如下&#xff1a; SqlSession sqlSession sqlSessionFactory.openSession(); List<Student> studentList sqlSession.selectList("com.sjdwz.da…

C语言——自定义数据类型(结构体内存对齐)

C语言中不只有内置类型诸如 int 、float、char 等类型&#xff0c;还有自定义数据类型&#xff0c;本文主要探讨结构体&#xff08;struct&#xff09;、联合体&#xff08;union&#xff09;、枚举&#xff08;enum&#xff09;三种自定义数据类型。 在我之前的文章《C语言—…

WPF2 样式布局

样式布局 WPF中的各类控件元素, 都可以自由的设置其样式。 诸如: 字体(FontFamily) 字体大小(FontSize) 背景颜色(Background) 字体颜色(Foreground) 边距(Margin) 水平位置(HorizontalAlignment) 垂直位置(VerticalAlignment) 等等。 而样式则是组织和重用以上的重要工具。…
最新文章