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

【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类型参考
      在这里插入图片描述
  • 高斯滤波
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图文详解_盘内数据冗余保护

版权声明&#xff1a; 付费作品&#xff0c;禁止转载前言提到冗余保护&#xff0c;最容易想到的就是RAID(Redundant Arrays of Independent Disks) , 独立冗余磁盘阵列。它是一种把多块独立的物理硬盘按不同方式组合形成一个硬盘组&#xff0c;以此提供比单个硬盘更高的存储性能…...

linux相对于windows环境为啥相对来说更加具有安全性

linux相对于windows环境为啥相对来说更加具有安全性 文章目录linux相对于windows环境为啥相对来说更加具有安全性前言一、linux不需要防病毒软件1.1Linux 桌面的恶意软件很少见1.2Linux 的软件安装更安全1.3Linux 保护自己免受恶意软件的侵害1.4杀毒效果存疑1.5Linux 良好的安全…...

iOS开发笔记之九十七——关于Restful API的一些总结

*****阅读完此文&#xff0c;大概需要3分钟******一、什么是 Restful API&#xff1f;Restful&#xff08;Representational State Transfer表现层状态转换&#xff09;是目前最流行的接口设计规范。Restful API 是一种设计风格&#xff08;是设计风格而不是标准&#xff09;&a…...

Linux系统Nginx下载和安装

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

交叉编译 acl

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

wait/notify方法 等待唤醒机制

线程正在运行&#xff0c;调用这个线程的wait()方法&#xff0c;这个线程就会进入一个集合进行等待(这个集合的线程不会争抢cpu)&#xff0c;此时线程的状态就是waiting 当有线程调用notify()方法的时候&#xff0c;就会从集合中挑选一个线程进入到排队队列里面 notifyAll就是…...

c++笔记之构造函数中的default作用

一、 举例: class Student {int ID;std::string sName; };Student s1; Student s2(s1); 在不定义任何构造函数的情况下,Student对象能定义成功,因为编译器会默认为我们设置几个构造函数,多的不说了,就说最简单的两个: (1) Student s1; 这个就是会调用编译器为我们…...

【代码随想录二刷】Day24-回溯-C++

代码随想录二刷Day24 今日任务 理论基础 77.组合 语言&#xff1a;C 理论基础 解决的问题 ① 组合问题&#xff1a;不考虑顺序 ② 切割问题 ③ 子集问题 ④ 排列问题&#xff1a;考虑顺序 ⑤ 棋盘问题&#xff1a;N皇后&#xff0c;解数独回溯法三部曲 ① 回溯函数模板返回…...

Kubernetes中YAML 文件简介

我们在安装 kubernetes 集群的时候使用了一些 YAML 文件来创建相关的资源&#xff0c;但是对 YAML 文件还是非常陌生。所以我们先来简单看一看 YAML 文件是如何工作的&#xff0c;并使用 YAML 文件来定义一个 kubernetes pod&#xff0c;然后再来定义一个 kubernetes deploymen…...

骨传导耳机是怎么发声的,骨传导耳机值得入手嘛

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

会声会影2023官方新功能介绍

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

vue:pdf.js使用细节/隐藏按钮/设置、获取当前页码/记录阅读进度/切换语言(国际化)

需求描述 在网页中预览pdf时&#xff0c;希望实现3点需求&#xff1a;1、隐藏一些功能按钮&#xff08;比如下载&#xff09;&#xff1b;2、打开pdf时自动定位到最后浏览的页&#xff08;记录阅读进度&#xff09;&#xff1b;3、实现国际化&#xff08;在代码中更改pdf插件使…...

RocketMQ实现延迟队列精确到秒级实现

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

线性数据结构:数组 Array

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

大数据开发-Hive

1、hive简介 hive是基于Hadoop的一个数据仓库工具&#xff0c;用于分析数据的。可以将结构化数据文件映射为一张数据库表&#xff0c;并提供类SQL查询功能 注&#xff1a;hive-SQL or HQL or类SQL 和标准SQL还是有一点点区别的 本质是SQL转换为MapReduce程序 用途&#xff1…...

《程序员新声》-Tech Lead 如何带领团队

收听本期播客 谢谢收听程序员新声&#xff0c;这是一款来自思特沃克&#xff08;Thoughtworks&#xff09;的播客节目。在这里&#xff0c;我们不仅讨论软件和技术领域的现状和未来&#xff0c;更关注程序员的成长世界。如何学习&#xff0c;如何晋升&#xff0c;如何带领团队…...

每日算法面试题

🧝‍♂️算法题 实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。 示例 1:输入:x = 2.00000, n = 10 输出:1024.00000示例 2:输入:x = 2.10000, n = 3 输出:9.26100示例 3:输入:x...

高质量前端之自动化测试

前端自动化测试&#xff1a;Testing Library 篇 引言 前端测试 静态测试 eslint、TypeScript 单元测试 jest、mocha 集成测试 enzyme、react-testing-library、mock 爬虫 前后端解耦 为什么要引入自动化测试 测试可以让开发者站在用户的角度考虑问题&#xff0c;通过测试的手…...

2023不伤人脉的全新商城分销,一劳永逸的消费分红

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

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

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

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

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...