【C++的OpenCV】第五课-OpenCV图像常用操作(二):OpenCV的基本绘图、平滑滤波(模糊)处理
让我们继续
- 一、OpenCV基本绘图
- 1.1 OpenCV关于绘图的操作
- 1.1.1 cv::Point()
- 1.1.2 cv::Scalar()
- 1.1.3 cv::line()画线
- 1.1.4 cv::rectangle()画矩形
- 1.1.5 cv::circle()画圆
- 二、图像的平滑滤波处理
- 2.1 概念
- 2.2 OpenCV关于图像模糊的操作
- 2.2.1 常用滤波器的分类
- 2.2.2 各种滤波方法具体的代码实现
- 2.3 参考源码
前文链接:
【C++的OpenCV】第四课-OpenCV图像常用操作(一):Mat对象深化学习、灰度、ROI
一、OpenCV基本绘图
1.1 OpenCV关于绘图的操作
1.1.1 cv::Point()
// Point类型的源码来源:
typedef Point2i cv::Point //规定cv::Point2i类型为cv::Pointtypedef Point_<int> cv::Point2i // 规定将cv::Point_<int> 类型为 cv::Point12i,最常用,以此为例// 同理还存在:typedef Point_<float> cv::Point2f 和 //typedef Point_<double> cv::Point2d// 实际上参考的类型为cv::Point_<int>,故在源码中我们要找到类模板 class cv::Point_< _Tp >
typedef _Tp value_type // 又将类模板中的类型_Tp 定为 value_type.
// 这里,我们讨论value_type为int的情况,即cv::Point类型,如果不理解,多看上边几行转化逻辑!
关于cv::Point()的常用的构造函数:
源码位置:Point()类型的源码解释
- Point_() :默认的构造函数
template<typename _Tp>
cv::Point_< _Tp >::Point_( )
- Point_() : 基于点xy轴坐标的构造函数
template<typename _Tp>
cv::Point_< _Tp >::Point_( _Tp _x, _Tp _y ) //参数解释:
1、_Tp _x : template<typename _Tp>_Tp cv::Point_< _Tp >::x
点point的x轴坐标2、_Tp _y :template<typename _Tp>_Tp cv::Point_< _Tp >::y
点Point的y轴坐标//以坐标创建一个点对象的示例://使用起来其实很简单,关键是看懂源码对大家大有帮助,//工具的使用和理解中,我认为理解工具更重要,所以为大家进行了源码解析。
//示例1:
Point pt;
pt.x = 3;
pt.y = 4;//示例2:
Point pt = Point(3,4);
- Point_() :拷贝构造函数
cv::Point_< _Tp >::Point_ ( const Point_< _Tp > & pt ) // 参数解释:
1、pt :为另外一个点对象,且对象保证了传递对象过程中的安全性(const修饰),将另一个点的数据拷贝到新的点上。
- Point_() :根据Size对象来构造点
template<typename _Tp>
cv::Point_< _Tp >::Point_ ( const Size_< _Tp > & sz ) // 参数解释:
1、 sz:一个Size对象,同样保证传递安装性。
Template class for specifying the size of an image or rectangle.// 关于Size:该类包括两个名为width和height的成员。// 该结构可以转换为旧的OpenCV结构CvSize和CvSize2D32f。
// 可以使用与Point_相同的一组算术和比较操作。
1.1.2 cv::Scalar()
// Scalar 类的由来和功能
// 由来:
typedef Scalar_<double> cv::Scalar // Scalar类实际上就是Scalar_<double>类
// 其类模板为:
template<typename _Tp>
class cv::Scalar_< _Tp > // 当_Tp为double类型时,为Scalar()类
//从Vec派生的4元素向量的模板类。
//从Vec<_Tp,4>导出,Scalar_和Scalar可以用作典型的4元素向量。
//此外,它们还可以转换为CvScalar或从CvScala转换。Scalar类型在OpenCV中广泛用于传递像素值。
关于cv::Scalar()的常用的构造函数:
源码位置:Scalar()类的构造函数
- Scalar_()的构造函数
1、默认构造函数:
template<typename _Tp>
cv::Scalar_< _Tp >::Scalar_ () 2、四向量值构造函数:
template<typename _Tp>
cv::Scalar_< _Tp >::Scalar_ ( _Tp v0,_Tp v1,_Tp v2 = 0,_Tp v3 = 0 ) //这个构造函数和拷贝构造函数使用频率较高
//广泛使用它来表示BGR颜色值(3个参数)。如果不使用最后一个参数,则无需定义最后一个参数。
//我们被要求一个颜色参数:
Scalar( a, b, c )
//我们将定义一个BGR颜色,如:Blue = a,Green = b和Red = c3、拷贝构造函数:
template<typename _Tp>
cv::Scalar_< _Tp >::Scalar_ ( const Scalar_< _Tp > & s ) 4、单值构造函数:
template<typename _Tp>
cv::Scalar_< _Tp >::Scalar_ ( _Tp v0 ) 5、Vec容器类构造函数:
template<typename _Tp>
template<typename _Tp2 , int cn>
cv::Scalar_< _Tp >::Scalar_ ( const Vec< _Tp2, cn > & v ) // _Tp2为通道数据类型,cn为通道数。// 要论Scalar还有什么用途,只要理解其本质“传递像素值”即可灵活使用。
1.1.3 cv::line()画线
- 函数原型:
void cv::line ( InputOutputArray img,Point pt1,Point pt2,const Scalar & color,int thickness = 1,int lineType = LINE_8,int shift = 0 )
- 参数解释:
1、img :画在哪里,即背景板,是一个Mat对象(或是InputOutputArray类型同类型即可)
2、pt1、pt2:划线的两个点(划线原理是在两个点之间划线
3、color :Scalar类型的颜色描述,例如:Scalar( 255, 0, 0 )
4、thickness:线条的粗细,这个自己根据画出来的情况调节即可
5、lineType:线的类型,下边展示类型的宏作为选择参考。
6、shift:点坐标中的小数位数。0位没有小数位即整数。
- 函数功能:
绘制连接两点的线段。
函数线绘制图像中pt1和pt2点之间的线段。
线条由图像边界剪裁。对于具有整数坐标的非抗锯齿线,
使用8连通或4连通Bresenham算法。粗线以圆角结尾绘制。
使用高斯滤波绘制抗锯齿线。
- 关于线的类型的宏:
- 实例:
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#define w 400using namespace cv;void DrawLine( Mat img, Point , Point );// 划线函数前置声明int main( int argc, char* argv[] ){char windowName[] = "Drawing Window";//显示图像的窗口的名称Mat img = Mat::zeros( w, w, CV_8UC3 );//长宽各400像素的8位3通道无符号的空白图像矩阵MyLine( img, Point( 0, w/2 ), Point( w/4, w/2 ) ); // 画一条位于图像y方向中间的水平线,且长度为100像素imshow( windowName, img ); // 将图片显示在窗口中waitKey( 0 );return(0);
}void DrawLine( Mat img, Point s, Point e )
{int lineThickness = 3;int lineType = LINE_8;line( img,s,e,Scalar( 0, 0, 0 ),lineThickness,lineType );//调用划线函数,线的色彩为白色
}
1.1.4 cv::rectangle()画矩形
- 函数原型:
void cv::rectangle ( InputOutputArray img,Point pt1,Point pt2,const Scalar & color,int thickness = 1,int lineType = LINE_8,int shift = 0
)
- 参数解释:
1、pt1、pt2:矩形对角线的点
2、其他参数同划线函数。
- 函数功能:
向右上方绘制简单、粗或填充的矩形。
函数cv::rectangle()绘制矩形轮廓或填充矩形,其两个对角为pt1和pt2。
- 实例:
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>using namespace cv;int main( void ){char rook_window[] = "Drawing 2: Rook";Mat rook_image = Mat::zeros( w, w, CV_8UC3 );rectangle( rook_image,Point( 0, 7*400/8 ),Point( 400, 400),Scalar( 0, 255, 255 ),FILLED,LINE_8 );imshow( rook_window, rook_image );moveWindow( rook_window, 400, 200 );waitKey( 0 );return(0);//这里就不一行一行解释代码了,上边画线看懂了,这个自然很轻松,主要是复习而已,大家多看看哈!
}
1.1.5 cv::circle()画圆
- 函数原型:
void cv::circle ( InputOutputArray img,Point center,int radius,const Scalar & color,int thickness = 1,int lineType = LINE_8,int shift = 0 )
- 参数解释:
1、center : 圆中心点坐标
2、radius:圆的半径
3、剩下的参数不必多言,如果大家认真看了划线的讲解,大家就都懂了
- 函数功能:
画个圆圈圈!
- 实例
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#define w 400
using namespace cv;void DrawFilledCircle( Mat img, Point center ) // 小编实在懒得写前置声明了,这个图省事,当然标准格式还是参照划线的代码吧
{circle( img,center,w/32,Scalar( 0, 0, 255 ),FILLED,LINE_8 );
}int main( void ){char window[] = "Drawing Window";Mat image = Mat::zeros( w, w, CV_8UC3 );MyFilledCircle( atom_image, Point( w/2, w/2) );// 画布中心(200,200)的位置画圆imshow( window, image );waitKey( 0 );return(0);
}
二、图像的平滑滤波处理
2.1 概念
平滑滤波,也称之为模糊,是一种简单的图像处理的操作。
至于模糊的目的,一般情况下最多的情况用于降噪,其次用于边界检测的相关处理也是比较广泛的,当然其他用途还是得看具体的业务。
2.2 OpenCV关于图像模糊的操作
对于模糊处理,通常会使用到滤波器来处理图像。
2.2.1 常用滤波器的分类
- 归一化框(方框/块)滤波:
这个过滤器是最简单的!每个输出像素是其内核相邻区域的均值(均为相等权重)
其内核如下:
- 高斯滤波器
可能是最有用的过滤器(虽然不是最快的)。高斯滤波是通过将输入数组中的每个点与高斯核进行卷积来完成的,然后将它们相加以产生输出数组。位于中间的像素将具有最大的权重。其邻居的权重随着它们与中心像素之间的空间距离的增加而减小。
其内核如下:
- 中值滤波器
中值滤波器遍历信号的每个元素(在这种情况下为图像),并用其相邻像素的中位数(位于估计像素周围的正方形邻域)替换每个像素。 - 双边滤波器
与高斯滤波器类似的方式,双边滤波器也考虑相邻像素,其权重分配给它们。这些权重具有两个分量,其中第一个是高斯滤波器使用的相同加权。第二个组件考虑了相邻像素与被评估的像素之间的强度差异。
2.2.2 各种滤波方法具体的代码实现
- 归一化滤波
- OpenCV提供函数cv :: blur()来使用此过滤器进行平滑处理。
void cv::blur(InputArray src,OutputArray dst,Size ksize,Point anchor = Point(-1,-1),int borderType = BORDER_DEFAULT ) /*
参数解释:
1、src:源图像(Mat对象),它可以有任意数量的通道,这些通道是独立处理的,但深度应该是CV_8U、CV_16U、CV_36S、CV_32F或CV_64F。
2、dst:目标图像(Mat对象),输出的图像和源图像同类型和同尺寸。
3、ksize:滤波器使用的内核的大小(Size(x,y)宽度为w像素和高度h像素)。
4、anchor:锚点,默认值(Point(-1,-1))在所选择大小的内核的中心。
5、borderType:用于图像扩张外部像素的边框模式,请参见边框类型(BORDERTYPE)。不支持BORDER_WRAP。
*/
-
- 关于BORDERTYPE的参考值:BORDERTYPE类型参考
- 关于BORDERTYPE的参考值:BORDERTYPE类型参考
- 高斯滤波
void cv::GaussianBlur ( InputArray src,OutputArray dst,Size ksize,double sigmaX,double sigmaY = 0,int borderType = BORDER_DEFAULT ) /*
参数解释:
1、sigmaX:X方向的高斯核标准偏差。
2、sigmaY: Y方向的高斯核标准偏差(默认为0)。
其余参数同之前。
*/关于这个方法中提及的XY方向上距离高斯核的偏差,大家可以简单理解为,模糊的情况。
- 中值滤波
void cv::medianBlur ( InputArray src,OutputArray dst,int ksize
) // 参数解释:
// ksize:内核的线性尺寸;它必须是奇数且大于1,例如:3、5、7。。。
- 双边滤波
void cv::bilateralFilter ( InputArray src,OutputArray dst,int d,double sigmaColor,double sigmaSpace,int borderType = BORDER_DEFAULT )/*
参数解释:
1、d:过滤过程中使用的每个像素邻域的直径。如果它是非正的,则从sigmaSpace计算。
2、sigmaColor:颜色空间中的西格玛值。该参数的值越大,意味着像素邻域(请参见sigmaSpace)中的颜色越远,将混合在一起,从而产生更大的半等色区域。
3、sigmaSpace:在坐标空间中过滤西格玛值。该参数的值越大,意味着只要颜色足够接近,更远的像素就会相互影响(请参见sigmaColor)。当d>0时,它指定邻域大小,而不考虑sigmaSpace。否则,d与sigmaSpace成比例。
*/
双边滤波器可以很好地减少不需要的噪声,同时保持边缘相当清晰。然而,与大多数过滤器相比,它非常慢。
sigma值:为了简单起见,可以将2西格玛值设置为相同。如果它们很小(<10),滤镜将不会有太大的效果,而如果它们很大(>150),它们将有非常强的效果,使图像看起来“卡通”。
过滤器大小:大型过滤器(d>5)非常慢,因此建议对实时应用程序使用d=5,对需要重噪声过滤的脱机应用程序使用d=9。
2.3 参考源码
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
using namespace std;
using namespace cv;
int DELAY_CAPTION = 1500;
int DELAY_BLUR = 100;
int MAX_KERNEL_LENGTH = 31;
Mat src; Mat dst;
char window_name[] = "Smoothing Demo";
int display_caption( const char* caption );
int display_dst( int delay );
int main( void )
{namedWindow( window_name, WINDOW_AUTOSIZE );src = imread( "../data/lena.jpg", IMREAD_COLOR );if( display_caption( "Original Image" ) != 0 ) { return 0; }dst = src.clone();if( display_dst( DELAY_CAPTION ) != 0 ) { return 0; }if( display_caption( "Homogeneous Blur" ) != 0 ) { return 0; }for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ){ blur( src, dst, Size( i, i ), Point(-1,-1) );if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }if( display_caption( "Gaussian Blur" ) != 0 ) { return 0; }for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ){ GaussianBlur( src, dst, Size( i, i ), 0, 0 );if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }if( display_caption( "Median Blur" ) != 0 ) { return 0; }for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ){ medianBlur ( src, dst, i );if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }if( display_caption( "Bilateral Blur" ) != 0 ) { return 0; }for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ){ bilateralFilter ( src, dst, i, i*2, i/2 );if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }display_caption( "End: Press a key!" );waitKey(0);return 0;
}
int display_caption( const char* caption )
{dst = Mat::zeros( src.size(), src.type() );putText( dst, caption,Point( src.cols/4, src.rows/2),FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255) );imshow( window_name, dst );int c = waitKey( DELAY_CAPTION );if( c >= 0 ) { return -1; }return 0;
}
int display_dst( int delay )
{imshow( window_name, dst );int c = waitKey ( delay );if( c >= 0 ) { return -1; }return 0;
}
大家可以在自己电脑的相关位置找到这个源码:…/opencv/opencv/tree/master/samples/cpp/tutorial_code/ImgProc/Smoothing.cpp
孜孜不倦,持续更新。期待关注!
相关文章:

【C++的OpenCV】第五课-OpenCV图像常用操作(二):OpenCV的基本绘图、平滑滤波(模糊)处理
让我们继续一、OpenCV基本绘图1.1 OpenCV关于绘图的操作1.1.1 cv::Point()1.1.2 cv::Scalar()1.1.3 cv::line()画线1.1.4 cv::rectangle()画矩形1.1.5 cv::circle()画圆二、图像的平滑滤波处理2.1 概念2.2 OpenCV关于图像模糊的操作2.2.1 常用滤波器的分类2.2.2 各种滤波方法具…...

[SSD固态硬盘技术 19] 谁是数据的守护神? 盘内RAID1/RAID5图文详解_盘内数据冗余保护
版权声明: 付费作品,禁止转载前言提到冗余保护,最容易想到的就是RAID(Redundant Arrays of Independent Disks) , 独立冗余磁盘阵列。它是一种把多块独立的物理硬盘按不同方式组合形成一个硬盘组,以此提供比单个硬盘更高的存储性能…...
linux相对于windows环境为啥相对来说更加具有安全性
linux相对于windows环境为啥相对来说更加具有安全性 文章目录linux相对于windows环境为啥相对来说更加具有安全性前言一、linux不需要防病毒软件1.1Linux 桌面的恶意软件很少见1.2Linux 的软件安装更安全1.3Linux 保护自己免受恶意软件的侵害1.4杀毒效果存疑1.5Linux 良好的安全…...
iOS开发笔记之九十七——关于Restful API的一些总结
*****阅读完此文,大概需要3分钟******一、什么是 Restful API?Restful(Representational State Transfer表现层状态转换)是目前最流行的接口设计规范。Restful API 是一种设计风格(是设计风格而不是标准)&a…...

Linux系统Nginx下载和安装
文章目录golang学习面试网站Linux启动nginx参考Linux启动nginx版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_36755535/article/details/110…...

交叉编译 acl
交叉编译 acl 概述 访问控制列表(Access Control Lists,ACL)是应用在路由器接口的指令列表。在 Linux 系统中,ACL 用于设定用户针对文件的权限,而不是在交换路由器中用来控制数据访问的功能(类似于防火墙…...

wait/notify方法 等待唤醒机制
线程正在运行,调用这个线程的wait()方法,这个线程就会进入一个集合进行等待(这个集合的线程不会争抢cpu),此时线程的状态就是waiting 当有线程调用notify()方法的时候,就会从集合中挑选一个线程进入到排队队列里面 notifyAll就是…...
c++笔记之构造函数中的default作用
一、 举例: class Student {int ID;std::string sName; };Student s1; Student s2(s1); 在不定义任何构造函数的情况下,Student对象能定义成功,因为编译器会默认为我们设置几个构造函数,多的不说了,就说最简单的两个: (1) Student s1; 这个就是会调用编译器为我们…...

【代码随想录二刷】Day24-回溯-C++
代码随想录二刷Day24 今日任务 理论基础 77.组合 语言:C 理论基础 解决的问题 ① 组合问题:不考虑顺序 ② 切割问题 ③ 子集问题 ④ 排列问题:考虑顺序 ⑤ 棋盘问题:N皇后,解数独回溯法三部曲 ① 回溯函数模板返回…...
Kubernetes中YAML 文件简介
我们在安装 kubernetes 集群的时候使用了一些 YAML 文件来创建相关的资源,但是对 YAML 文件还是非常陌生。所以我们先来简单看一看 YAML 文件是如何工作的,并使用 YAML 文件来定义一个 kubernetes pod,然后再来定义一个 kubernetes deploymen…...

骨传导耳机是怎么发声的,骨传导耳机值得入手嘛
现在市面上除了我们平时比较常见的有线耳机、头戴耳机、真无线耳机,近两年还涌现出了一种有着黑科技之称的特别耳机——骨传导耳机,并且因其在运动场景下的优势过于明显而得到了众多运动爱好者的大力追捧。那么今天我们就来聊聊这款所谓的黑科技骨传导耳…...

会声会影2023官方新功能介绍
深入简单直观的视频编辑!使用 Corel VideoStudio会声会影2023,将您最美好的时刻和生活体验变成令人惊叹的电影,这是一款有趣且直观的视频编辑器,包含高级工具和高级效果。从自定义标题和过渡,到 Mask Creator、Color G…...

vue:pdf.js使用细节/隐藏按钮/设置、获取当前页码/记录阅读进度/切换语言(国际化)
需求描述 在网页中预览pdf时,希望实现3点需求:1、隐藏一些功能按钮(比如下载);2、打开pdf时自动定位到最后浏览的页(记录阅读进度);3、实现国际化(在代码中更改pdf插件使…...

RocketMQ实现延迟队列精确到秒级实现
前言篇:为了节约成本,决定通过自研来改造rocketmq,添加任意时间延迟的延时队列,开源版本的rocketmq只有支持18个等级的延迟时间,其实对于大部分的功能是够用了的,但是以前的项目,全部都是使用了…...

线性数据结构:数组 Array
一、前言数组是数据结构还是数据类型?数组只是个名称,它可以描述一组操作,也可以命名这组操作。数组的数据操作,是通过 idx->val 的方式来处理。它不是具体要求内存上要存储着连续的数据才叫数组,而是说,…...

大数据开发-Hive
1、hive简介 hive是基于Hadoop的一个数据仓库工具,用于分析数据的。可以将结构化数据文件映射为一张数据库表,并提供类SQL查询功能 注:hive-SQL or HQL or类SQL 和标准SQL还是有一点点区别的 本质是SQL转换为MapReduce程序 用途࿱…...
《程序员新声》-Tech Lead 如何带领团队
收听本期播客 谢谢收听程序员新声,这是一款来自思特沃克(Thoughtworks)的播客节目。在这里,我们不仅讨论软件和技术领域的现状和未来,更关注程序员的成长世界。如何学习,如何晋升,如何带领团队…...
每日算法面试题
🧝♂️算法题 实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。 示例 1:输入:x = 2.00000, n = 10 输出:1024.00000示例 2:输入:x = 2.10000, n = 3 输出:9.26100示例 3:输入:x...
高质量前端之自动化测试
前端自动化测试:Testing Library 篇 引言 前端测试 静态测试 eslint、TypeScript 单元测试 jest、mocha 集成测试 enzyme、react-testing-library、mock 爬虫 前后端解耦 为什么要引入自动化测试 测试可以让开发者站在用户的角度考虑问题,通过测试的手…...

2023不伤人脉的全新商城分销,一劳永逸的消费分红
2023不伤人脉的全新商城分销,一劳永逸的消费分红 2023-02-24 11:52梦龙 2023不伤人脉的全新商城分销,一劳永逸的消费分红 如今是流量为王的时代,但是如何将流量转化为忠实客户是个难题。不再是单向的买卖关系,而是从对产品的关注…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...