当前位置: 首页 > 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;而是从对产品的关注…...

【代码随想录训练营】【Day21】第六章|二叉树|530.二叉搜索树的最小绝对差|501.二叉搜索树中的众数|236. 二叉树的最近公共祖先

二叉搜索树的最小绝对差 题目详细&#xff1a;LeetCode.530 这道题使我第一次了解到二叉树的双指针遍历法&#xff0c;详细可以先查看卡哥的讲解视频&#xff1a;《代码随想录 — 二叉搜索树中的众数》 利用二叉搜索树的特点&#xff1a; 中序遍历二叉搜索树得到一个有序序…...

leaflet 导出图片,打印图片(A4横版或竖版)

第093个 点击查看专栏目录 本示例的目的是介绍如何在vue+leaflet中打印图片导出图片。一个简单的leaflet插件示例,添加了一个图标来打印或导出地图。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共85行)安装插…...

Java面向对象:继承特性的学习

本文介绍了面向对象的继承特性: 什么是继承 继承的概念 Java中继承的语法 在继承下父类成员的访问 super和this关键字 父类和子类构造方法 在继承下类中出现初始化代码的执行顺序 父类成员的访问权限对子类的可见性 Java的继承关系 final关键字 认识继承和组合关系 继承特性的学…...

问答系统(QA)调研

引言 智能问答系统广泛用于回答人们以自然语言形式提出的问题&#xff0c;经典应用场景包括&#xff1a;智能语音交互、在线客服、知识获取、情感类聊天等。根据QA任务&#xff0c;可以将QA大致分为5大类&#xff0c;分别为&#xff1a; 文本问答&#xff08;text-based QA&am…...

商务租车的三大优势吸引企业以租代购

随着社会机经济的高速发展&#xff0c;租车模式的日益盛行&#xff0c;租车不仅仅是受个体户的青睐&#xff0c;而作为环保经济的出行方式也让越来越多的企业开始选择以租代买&#xff0c;据调查统计&#xff0c;最早开始商务租车的群体是外企。而近几年&#xff0c;国内的很多…...

蓝桥杯的比赛流程和必考点

蓝桥杯的比赛流程和必考点 距省赛仅1个多月&#xff01;蓝桥杯的比赛流程和必考点&#xff0c;你还不清楚&#xff1f; “巷子里的猫很自由&#xff0c;却没有归宿&#xff1b;围墙里的狗有归宿&#xff0c;终身都得低头。人生这道选择题&#xff0c;怎么选都会有遗憾。” 但不…...

【数据结构】红黑树

红黑树一、红黑树的概念二、红黑树的接口2.1 插入三、验证四、源码一、红黑树的概念 红黑树也是一个二叉搜索树&#xff0c;他是通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;最长路径长度不超过最短路径长度的 2 倍保持近似平衡。他在每个节点添加了一…...

从C++的角度理解C#的Event

由于技术背景是C起家的&#xff0c;所以对于C的概念很清楚&#xff0c;遇到C#的EVENT时候&#xff0c;总感觉这个概念比较抽象&#xff0c;不容易理解&#xff0c;但是当使用函数指针和回调函数来理解EVENT的时候&#xff0c;这个概念就清晰了。 首先对于EVENT来讲&#xff0c…...

商城进货记录交易-课后程序(JAVA基础案例教程-黑马程序员编著-第七章-课后作业)

【实验7-2】商城进货记录交易 【任务介绍】 1.任务描述 每个商城都需要进货&#xff0c;而这些进货记录整理起来很不方便&#xff0c;本案例要求编写一个商城进货记录交易的程序&#xff0c;使用字节流将商场的进货信息记录在本地的csv文件中。程序具体要求如下&#xff1a; …...

【正点原子FPGA连载】第十七章双核AMP实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十七章双核AMP…...