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

OpenCV学习笔记

一、OpenCV基础

(一)图像的读取、显示、创建

https://mp.weixin.qq.com/s?__biz=MzA4MTA1NjM5NQ==&mid=2247485202&idx=1&sn=05d0b4cd25675a99357910a5f2694508&chksm=9f9b80f6a8ec09e03ab2bb518ea6aad83db007c9cdd602c7459ed75c737e380ac9c34bc0d614&scene=178&cur_album_id=2073041855356764164#rd

(二)图像的属性以及像素相关的操作

https://mp.weixin.qq.com/s?__biz=MzA4MTA1NjM5NQ==&mid=2247485234&idx=1&sn=64c4a7235bd02a49d844089a84e6a01d&chksm=9f9b80d6a8ec09c029a387bbdeea3f8f7ecbc31e9032da047b6e77cf0394f272ada897c10f3b&scene=178&cur_album_id=2073041855356764164#rd

data:表示 Mat 对象中的指针(uchar 类型的指针),指向内存中存放矩阵数据的一块内存 (uchar* data)。
step: 字面意思是“步长”,实际上它描述了矩阵的形状。 step[] 为一个数组,矩阵有几维,step[] 数组就有几个元素。以一个三维矩阵为例,step[0] 表示一个平面的字节总数,step[1] 表示一行元素的字节总数,step[2] 表示每一个元素的字节总数。
上面两个数据可以配合使用来获得Mat中任意位置的数据
在这里插入图片描述

(三)threshold函数的使用

https://blog.csdn.net/u012566751/article/details/77046445

图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。OpenCV中提供了函数cv::threshold();

(四)形态学之提取连通域

https://mp.weixin.qq.com/s?__biz=Mzg3NjY3NjI0Mw==&mid=2247484975&idx=1&sn=5ea64c7c4dd3c017eac0551f12c45137&chksm=cf2fd3d3f8585ac5b6e59f313a42d8981b8d09721f88eea7ee4a71ecfae7baeacf69fb0e1ec2&mpshare=1&scene=1&srcid=1030Tal3VDLygpiUNPLo45zv&sharer_shareinfo=84ef8c16db4fd26fa08ad0259bcc4dce&sharer_shareinfo_first=84ef8c16db4fd26fa08ad0259bcc4dce#rd

1.连通域概念:指图像中具有相同像素值且位置相邻的像素组成的区域。
2.相关函数:

int connectedComponents(InputArray image, OutputArray labels, int connectivity = 8, int ltype = CV_32S);image:输入图像,待标记8位单通道图像。
labels:输出图像,目标标记图像。
connectivity:连通域大小,四连通域还是八连通域。
输出类型:CV32S 和 CV_16U ,默认是 CV_32S 。
返回连通域个数。

例子:

#include <opencv2/opencv.hpp>
#include <iostream>int main()
{cv::Mat input = cv::imread("src/rice.jpg");cv::Mat img_bw, connectimg;cv::cvtColor(input, img_bw, cv::COLOR_BGR2GRAY);cv::threshold(img_bw, img_bw, 100, 255, cv::THRESH_BINARY_INV);// 做一些膨胀和腐蚀使得图像连通域明显cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));cv::erode(img_bw, img_bw, element, cv::Point(-1, -1), 2);cv::dilate(img_bw, img_bw, element, cv::Point(-1, -1), 2);int num = cv::connectedComponents(img_bw, connectimg, 8, CV_16U);std::cout << "连通域个数:" << num << std::endl;cv::namedWindow("原图", cv::WINDOW_NORMAL);cv::imshow("原图", img_bw);//以不同颜色标记出不同的连通域cv::Mat result = cv::Mat::zeros(img_bw.size(), CV_8UC3); //定义标记结果图像//定义五种颜色std::vector<cv::Vec3b> color;color.push_back(cv::Vec3b(0, 0, 255));color.push_back(cv::Vec3b(0, 255, 0));color.push_back(cv::Vec3b(255, 0, 0));color.push_back(cv::Vec3b(0, 255, 255));color.push_back(cv::Vec3b(255, 255, 0));for (int i = 0; i < result.cols; i ++){for (int j = 0; j < result.rows; j ++){int label = connectimg.at<uint16_t>(i, j);if (label == 0){continue; //背景的黑色不改变}result.at<cv::Vec3b>(i, j) = color[label % 5];}}cv::namedWindow("标记连通域后", cv::WINDOW_NORMAL);cv::imshow("标记连通域后", result);cv::waitKey(0);return 0;
}

原始图片和更改颜色后的连通域:
在这里插入图片描述

(五)距离变换distanceTransform应用——查找物体质心&&细化字符轮廓

https://www.cnblogs.com/mtcnn/p/9411967.html

distanceTransform方法的功能:
用于计算图像中每一个非零点距离离自己最近的零点的距离,distanceTransform的第二个Mat矩阵参数dst保存了每一个点与最近的零点的距离信息,图像上越亮的点,代表了离零点的距离越远

1、查找物体质心

C++

#include "core/core.hpp"
#include "imgproc/imgproc.hpp"
#include "highgui/highgui.hpp"using namespace cv;int main(int argc,char *argv[])
{float maxValue=0;  //定义距离变换矩阵中的最大值Point Pt(0,0);Mat image=imread(argv[1]);Mat imageGray;cvtColor(image,imageGray,CV_RGB2GRAY);imageGray=~imageGray;  //取反GaussianBlur(imageGray,imageGray,Size(5,5),2); //滤波threshold(imageGray,imageGray,20,200,CV_THRESH_BINARY); //阈值化	Mat imageThin(imageGray.size(),CV_32FC1); //定义保存距离变换结果的Mat矩阵distanceTransform(imageGray,imageThin,CV_DIST_L2,3);  //距离变换Mat distShow;distShow=Mat::zeros(imageGray.size(),CV_8UC1); //定义细化后的字符轮廓for(int i=0;i<imageThin.rows;i++){for(int j=0;j<imageThin.cols;j++){distShow.at<uchar>(i,j)=imageThin.at<float>(i,j);if(imageThin.at<float>(i,j)>maxValue){maxValue=imageThin.at<float>(i,j);  //获取距离变换的极大值Pt=Point(j,i);  //坐标}}}normalize(distShow,distShow,0,255,CV_MINMAX); //为了显示清晰,做了0~255归一化circle(image,Pt,maxValue,Scalar(0,0,255),3);	circle(image,Pt,3,Scalar(0,255,0),3);imshow("Source Image",image);imshow("Thin Image",distShow);waitKey();return 0;
}

1).原始图片:
在这里插入图片描述
2).经过距离变换后距离Mat矩阵dst:
为了显示清晰,做了0~255的归一化。可以看到,中心处最亮,说明了中心点距离零点的距离最远,而最远处就可以作为物体的质心。
在这里插入图片描述
3).标记质心(绿色点):
在这里插入图片描述

2、细化轮廓

C++:

#include "core/core.hpp"
#include "imgproc/imgproc.hpp"
#include "highgui/highgui.hpp"using namespace cv;int main(int argc,char *argv[])
{float maxValue=0;  //定义距离变换矩阵中的最大值Mat image=imread(argv[1]);Mat imageGray;cvtColor(image,imageGray,CV_RGB2GRAY);imageGray=~imageGray;  //取反GaussianBlur(imageGray,imageGray,Size(5,5),2); //滤波threshold(imageGray,imageGray,20,200,CV_THRESH_BINARY); //阈值imshow("s",imageGray);Mat imageThin(imageGray.size(),CV_32FC1); //定义保存距离变换结果的Mat矩阵distanceTransform(imageGray,imageThin,CV_DIST_L2,3);  //距离变换Mat distShow;distShow=Mat::zeros(imageGray.size(),CV_8UC1); //定义细化后的字符轮廓for(int i=0;i<imageThin.rows;i++){for(int j=0;j<imageThin.cols;j++){if(imageThin.at<float>(i,j)>maxValue){maxValue=imageThin.at<float>(i,j);  //获取距离变换的极大值}}}for(int i=0;i<imageThin.rows;i++){for(int j=0;j<imageThin.cols;j++){if(imageThin.at<float>(i,j)>maxValue/1.9){distShow.at<uchar>(i,j)=255;   //符合距离大于最大值一定比例条件的点设为255}}}imshow("Source Image",image);imshow("Thin Image",distShow);waitKey();return 0;
}

1.原始图像:
在这里插入图片描述
2.细化效果:
在这里插入图片描述

二、 形态学操作之腐蚀与膨胀

https://blog.csdn.net/qq_42856191/article/details/123663533

(一)腐蚀(erosion)

1.1 什么是腐蚀
简单来说,腐蚀就是把图像中的物体变小了!(用背景去侵蚀前景)

腐蚀的工作过程如下图所示,A是一个集合,B是一个结构单元,我们使用B去对集合A进行腐蚀,腐蚀过程如C所示,在腐蚀过程中,结构单元必须全部位于集合A中才能进行腐蚀操作,最终得到的结果即为D所示。
在这里插入图片描述
Python:

import cv2
import numpy as npori = cv2.imread(r"C:\Users\Lenovo\Desktop\original.jpg")   # 读取图像kernel1 = np.ones((3, 3), np.uint8)     # 3个不同尺度的腐蚀单元
kernel2 = np.ones((5, 5), np.uint8)
kernel3 = np.ones((7, 7), np.uint8)erosion1 = cv2.erode(ori, kernel1)		# 腐蚀函数
erosion2 = cv2.erode(ori, kernel2)
erosion3 = cv2.erode(ori, kernel3)cv2.imshow("original", ori)
cv2.imshow("erosion1", erosion1)
cv2.imshow("erosion2", erosion2)
cv2.imshow("erosion3", erosion3)cv2.imwrite(r'C:\Users\Lenovo\Desktop\erosion1.jpg', erosion1)
cv2.imwrite(r'C:\Users\Lenovo\Desktop\erosion2.jpg', erosion2)
cv2.imwrite(r'C:\Users\Lenovo\Desktop\erosion3.jpg', erosion3)cv2.waitKey()

下面展示的是程序得到的结果图,由图可知,腐蚀能对图像中的毛刺进行去除,但这也与腐蚀单元的大小有关,3 × 3 3×33×3大小的核去除效果不如5 × 5 5×55×5与7 × 7 7×77×7,此外7 × 7 7×77×7的核使得图像变得更加细小。
在这里插入图片描述

(二)膨胀(dilation)

2.1 什么是膨胀
简单来说,膨胀就是把图像中的物体变大了!(对前景进行膨胀)

膨胀的工作过程如下图所示,A是一个集合,B是一个结构单元,我们使用B去对集合A进行膨胀,膨胀过程如C所示,在膨胀过程中,结构单元只要有一个位于集合A中就能进行膨胀操作,最终得到的结果即为D所示。
在这里插入图片描述
Python:

import cv2
import numpy as npori = cv2.imread(r"C:\Users\Lenovo\Desktop\original.jpg")   # 读取图像kernel1 = np.ones((3, 3), np.uint8)     # 3个不同尺度的腐蚀单元
kernel2 = np.ones((5, 5), np.uint8)
kernel3 = np.ones((9, 9), np.uint8)dilation1 = cv2.dilate(ori, kernel1)    # 膨胀函数
dilation2 = cv2.dilate(ori, kernel2)
dilation3 = cv2.dilate(ori, kernel3)cv2.imshow("original", ori)
cv2.imshow("dilation1", dilation1)
cv2.imshow("dilation2", dilation2)
cv2.imshow("dilation3", dilation3)cv2.imwrite(r'C:\Users\Lenovo\Desktop\dilation1.jpg', dilation1)
cv2.imwrite(r'C:\Users\Lenovo\Desktop\dilation2.jpg', dilation2)
cv2.imwrite(r'C:\Users\Lenovo\Desktop\dilation3.jpg', dilation3)cv2.waitKey()

下面展示的是程序得到的结果图,由图可知,膨胀能对图像中的物体进行扩张,但这也与膨胀单元的大小有关,越大的膨胀核使得图像扩张区域更大。
在这里插入图片描述

三、形态学操作之开运算与闭运算

https://blog.csdn.net/qq_42856191/article/details/123670455

(一)开运算

1.1 什么是开运算:先腐蚀后膨胀的操作称为开运算。
1.2作用:消除细小物体、在窄区域分离物体、平滑大物体边界等。
在这里插入图片描述

(二)闭运算

2.1 什么是闭运算:先膨胀后腐蚀的操作称为闭运算。
2.2作用:填充物体空洞、消除噪声、连接邻近物体、平滑边界等。
在这里插入图片描述

四、图像分割 – 距离变换与分水岭算法(硬币检测、扑克牌检测、车道检测)

https://blog.csdn.net/great_yzl/article/details/119831771

以上述引用中的硬币检测为例子的分割过程:
1.将RGB图片转换为灰度图
2.去噪
开运算:先侵蚀后膨胀。会将两个物体之间可能存在的粘连噪点过滤,并将前景物体扩大。
3.确定背景区域
对图片进行膨胀操作,将前景扩大,背景也会随之减小。那么此时对象>原对象,此时背景 < 原背景,那么此时的背景自然可以确定为原背景的一部分。(离对象中心很远的是背景)
4.确定前景区域
原理:距离变换,在二值图中把对象缩小,得到的就是原图的一部分,可以确定为前景。
这种距离变换可以将前景中的不同实例分离,距离变换后得到前景物体不同灰度值的像素,通过threshold函数选定一个阈值来缩小前景物体中每个的大小,从而达到将不同实例分离的效果。(不分离的话,可以不用距离变换,只用腐蚀就够了)
下图分别为img原始图片、opening膨胀后的图片、sure_fg距离变换后经过threshold阈值操作获得的确定前景实例
在这里插入图片描述

相关文章:

OpenCV学习笔记

一、OpenCV基础 &#xff08;一&#xff09;图像的读取、显示、创建 https://mp.weixin.qq.com/s?__bizMzA4MTA1NjM5NQ&mid2247485202&idx1&sn05d0b4cd25675a99357910a5f2694508&chksm9f9b80f6a8ec09e03ab2bb518ea6aad83db007c9cdd602c7459ed75c737e380ac9c3…...

idea 一键部署jar包

上传成功...

16、SpringCloud -- 常见的接口防刷限流方式

目录 接口防刷限流方式1:隐藏秒杀地址需求:思路:代码:前端:后端:测试:总结:方式2:图形验证码1、生成图形验证码需求:思路:代码:前端:后端:测试:2、校验验证码需求:思路:代码:...

Typora(morkdown编辑器)的安装包和安装教程

Typora&#xff08;morkdown编辑器&#xff09;的安装包和安装教程 下载安装1、覆盖文件2、输入序列号①打开 typora &#xff0c;点击“输入序列号”&#xff1a;②邮箱一栏中任意填写&#xff08;但须保证邮箱地址格式正确&#xff09;&#xff0c;输入序列号&#xff0c;点击…...

服务器不稳定对网站有什么影响

世界上最远的距离&#xff0c;不是树枝无法相依&#xff0c;而是相互了望的星星&#xff0c;却没有交汇的轨迹。 现代技术的进步&#xff0c;导致了人与人之间距 离的消除&#xff0c;直播行业的快速发展的影响和渗透进如今的日常生活&#xff0c;为人们在遥远的距离相见与互诉…...

py实现surf特征提取

import cv2def main():# 加载图像image1 cv2.imread(image1.jpg, cv2.IMREAD_GRAYSCALE)image2 cv2.imread(image2.jpg, cv2.IMREAD_GRAYSCALE)# 创建SURF对象surf cv2.xfeatures2d.SURF_create()# 检测特征点和描述符keypoints1, descriptors1 surf.detectAndCompute(imag…...

MS39233三个半桥驱动器可兼容TMC6300

MS39233 是一款低压三个半桥驱动器。可兼容 TMC6300&#xff08;功能基本一致&#xff0c;管脚不兼容&#xff09;。它可应用于低电压及电池供电的运动控制场合。并且内置电荷泵来提供内部功率 NMOS 所需的栅驱动电压。 MS39233 可以提供最高 2.8A 的峰值电流&#xff0c;其功率…...

09、SpringCloud -- 利用redis的原子性控制高并发请求访问到service层、本地标识

目录 利用redis的原子性控制请求问题:需求:思路什么是原子性的操作?代码思路:代码:工具类依赖SeckillGoodControllerSeckillOrderInfoController测试:本地标识的分析和实现问题:需求:思路:代码:测试:利用redis的原子性控制请求 利用redis的原子性控制人数请求访问到…...

竞赛选题 深度学习图像修复算法 - opencv python 机器视觉

文章目录 0 前言2 什么是图像内容填充修复3 原理分析3.1 第一步&#xff1a;将图像理解为一个概率分布的样本3.2 补全图像 3.3 快速生成假图像3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构3.5 使用G(z)生成伪图像 4 在Tensorflow上构建DCGANs最后 0 前言 &#…...

基于深度学习网络的美食检测系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 % 图像大小 image_size [224 224 3]; num_classes size(VD,2)-1;% 目标类别数量…...

人工智能基础_机器学习006_有监督机器学习_正规方程的公式推导_最小二乘法_凸函数的判定---人工智能工作笔记0046

我们来看一下公式的推导这部分比较难一些, 首先要记住公式,这个公式,不用自己理解,知道怎么用就行, 比如这个(mA)T 这个转置的关系要知道 然后我们看这个符号就是求X的导数,X导数的转置除以X的导数,就得到单位矩阵, 可以看到下面也是,各种X的导数,然后计算,得到对应的矩阵结…...

【MongoDB】Windows 安装MongoDB 6.0

一、下载安装包 安装包下载地址https://www.mongodb.com/try/download/community这里我选择的是 二、解压并安装 1、解压 这里我将压缩包解压到了D盘&#xff0c;并重命名成了mongodb&#xff0c;解压后的目录如下&#xff1a; 2、创建配置文件 在D:\mongodb下新建conf目录…...

DM8 Dokcer镜像更新后远程无法jdbc连接问题

背景&#xff1a;原来官网下的dm8docker镜像有效期只有两个星期&#xff0c;问他们商务申请了新的dm8镜像&#xff0c;准备简单升级一下镜像再引入原来的database 先说结论&#xff1a;jdbc驱动要更新 官网dm8驱动链接地址 原来的tag镜像 dm8_single:v8.1.2.128_ent_x86_64…...

AI:39-基于深度学习的车牌识别检测

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…...

软考 系统架构设计师系列知识点之系统架构评估(1)

所属章节&#xff1a; 第8章. 系统质量属性与架构评估 第2节. 系统架构评估 1. 概述 系统架构评估是在对架构分析、评估的基础上&#xff0c;对架构策略的选取进行决策。它利用数学或逻辑分析技术&#xff0c;针对系统的一致性、正确性、质量属性、规划结果等不同方面&#x…...

Spark UI中Shuffle dataSize 和shuffle bytes written 指标区别

背景 本文基于Spark 3.1.1 目前在做一些知识回顾的时候&#xff0c;发现了一些很有意思的事情&#xff0c;就是Spark UI中ShuffleExchangeExec 的dataSize和shuffle bytes written指标是不一样的&#xff0c; 那么在AQE阶段的时候&#xff0c;是以哪个指标来作为每个Task分区大…...

Java——Map.getOrDefault方法详解

Java——Map.getOrDefault方法详解 Map.getOrDefault(Object key, V defaultValue)是Java中Map接口的一个方法&#xff0c;用于获取指定键对应的值&#xff0c;如果键不存在&#xff0c;则返回一个默认值。 该方法的签名如下&#xff1a; V getOrDefault(Object key, V defau…...

银河集团香港优才计划95分获批案例展示!看看是如何申请的?

银河集团香港优才计划95分获批案例展示&#xff01;看看是如何申请的&#xff1f; 今天来分享一则银河集团香港优才计划获批案例&#xff01;客户本科学历非名校、从事业务支援及人力资源行业&#xff0c;优才打分95分&#xff0c;这个条件可能在很多人的印象里&#xff0c;会觉…...

Python class中以`_`开头的类特殊方法

在学基础的时候没学到过&#xff08;可能见过但是又忘了&#xff09;&#xff0c;在学习深度学习项目的时候遇见了很多&#xff1b; 以论文Multi-label learning from single positive label为例&#xff1b; 这些方法都是程序自行调用的&#xff0c;不需要&#xff08;也不可以…...

2023云栖大会开幕:全球数万开发者参会,展现AI时代的云计算创新

10月31日&#xff0c;2023云栖大会在杭州开幕&#xff0c;大会吸引全球数万开发者参会。阿里巴巴集团董事会主席蔡崇信在致辞中表示&#xff0c;今年云栖大会主题回归“计算&#xff0c;为了无法计算的价值”&#xff0c;这也是2015年云栖大会的主题&#xff0c;当时云计算支撑…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...