OpenCV Mat实例详解 六

         本文将接着OpenCV Mat实例详解继续介绍OpenCV Mat类的操作符及公有成员函数。

 Mat &  operator =

        Mat & operator= (const Mat &m)

        将一个Mat对象赋值个另一个Mat对象。

        Mat & operator= (const MatExpr &expr)

         将一个Mat表达式值赋值给Mat对象

         Mat &  operator= (const Scalar &s)

        将一个标量赋值给Mat对象。

        Mat & operator= (Mat &&m)

       是一个移动赋值操作符,它允许你将一个 Mat 对象的资源“移动”到另一个 Mat 对象,而不是进行传统的拷贝。这样做可以节省大量时间和内存,因为资源只是在指针级别上被转移,而不是实际的数据。

        新建一个控制台应用程序,来演示上面赋值操作符的应用方法,在程序中加入如下代码:

// OpenCVMatTest6.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	//**********Example for operator = 
    Mat src = imread("1.png");
	if (src.empty())
	{
		cout << "Cann't open the image!" << endl;
		return -1;
	}
	Mat dst = src;
	imshow("Dst", dst);

	Mat m1 = (Mat_<uchar>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
	Mat m2 = (Mat_<uchar>(3, 3) << 10, 11, 12, 13, 14, 15, 16, 17, 18);

	MatExpr me = m1.mul(m2, 1);
	Mat dst1 = me;
	cout << "dst1:" << endl;
	cout << dst1 << endl;

	Mat dst2(5, 5, CV_8UC3);
	dst2 = Scalar(255, 0, 0);
	cout << "dst2:" << endl;
	cout << dst2 << endl;

	Mat dst3 = move(src);
	imshow("Dst3", dst3);

	waitKey(0);
	return 1;
}

试运行,结果如下: 

void pop_back (size_t nelems=1)

从Mat对象矩阵的底部移除元素,该方法从矩阵底部删除一行或多行。

nelems 移除元素的行数。

void push_back (const _Tp &elem)

将元素添加到Mat对象数据矩阵的底部。这些方法将一个或多个元素添加到矩阵的底部。它们模拟STL向量类的相应方法。当 elem 为 Mat 时,其类型和列数必须与容器矩阵中的相同。

elem 添加的元素

将上面示例程序中无关的代码注释掉,插入新代码来演示上面两个函数的用法,插入的代码如下:

//**********Example for pop_back(),push_back()
Mat m1 = (Mat_<uchar>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
m1.pop_back(1);
cout << "m1 rows after pop back:" << endl;
cout << m1.rows << endl;

Mat m2 = (Mat_<uchar>(1, 3) << 11, 11, 11);
m1.push_back(m2);
cout << "m1 rows after push back:" << endl;
cout << m1.rows << endl;
cout << "m1 after push back:" << endl;
cout << m1 << endl;

试运行,结果如下:

数据指针ptr

uchar * ptr (int i0=0)

const uchar *  ptr (int i0=0) const

返回指向指定矩阵行的指针。这些方法返回 uchar* 或指向指定矩阵行的类型化指针。上面两个函数的区别在与接受的参数不同

i0 从0开始的行索引。

重载函数:

        为方便起见OpenCV Mat提供l了很多重载成员函数。它与上述函数的不同之处仅在于它接受的参数。

uchar *  ptr (int row, int col)

const uchar *  ptr (int row, int col) const

uchar *  ptr (int i0, int i1, int i2)

const uchar * ptr  (int i0, int i1, int i2) const

uchar *  ptr (const int *idx)

const uchar *   ptr (const int *idx) const

template<int n>  _Tp * ptr (const Vec< int, n > &idx)

template<int n>   const _Tp *  ptr (const Vec< int, n > &idx) const

template<typename _Tp > _Tp * ptr (int i0=0)

template<typename _Tp >  const _Tp * ptr (int i0=0) const

template<typename _Tp > _Tp *  ptr (int row, int col)

template<typename _Tp > const _Tp * ptr (int row, int col) const

template<typename _Tp > _Tp *  ptr (int i0, int i1, int i2)

template<typename _Tp > const _Tp * ptr (int i0, int i1, int i2) const

template<typename _Tp > _Tp * ptr (const int *idx)

template<typename _Tp > const _Tp * ptr (const int *idx) const

template<typename _Tp , int n> _Tp * ptr (const Vec< int, n > &idx)

template<typename _Tp , int n> const _Tp * ptr (const Vec< int, n > &idx) const

将上面示例程序中无关的代码注释掉,插入新代码来演示上面函数的用法,插入的代码如下:

//*********Example for ptr

//uchar* ptr(int i0 =0), cost uchar* ptr(int i0 =0) const
Mat m1(3, 3, CV_8UC1);
for (size_t i = 0; i <3; i++)
{
	int j = 0;
	while (j<3)
	{
		uchar* puchar= m1.ptr(i);
		puchar[j] = j;
		j++;
	}
}
cout << "m1:" << endl;
for (size_t i = 0; i < 3; i++)
{
	int j = 0;
	while (j < 3)
	{
		uchar* puchar = m1.ptr(i);
		cout << (int)puchar[j] << "  ";
		j++;
	}
	cout << endl;
}

//uchar* ptr(int row, int col), const uchar* ptr(int row, int col) const
Mat m2(3, 3, CV_8UC1);

for (size_t i = 0; i < 3; i++)
{
	int j = 0;
	while (j < 3)
	{
		uchar* puchar = m2.ptr(i, j);
		*puchar = j + 1;
		j++;
	}
}
cout << "m2:" << endl;
for (size_t i = 0; i < 3; i++)
{
	int j = 0;
	while (j < 3)
	{
		uchar* puchar = m2.ptr(i, j);
		cout << (int)*puchar << "  ";
		j++;
	}
	cout << endl;
}

//ucahr* ptr(int i0, int i1, int in2), const ucahr* ptr(int i0, int i1, int in2) const
Mat m3(5, 5, CV_8UC3);
for (size_t i = 0; i < 5; i++)
{
	for (size_t j = 0; j < 5; j++)
	{
		int k = 0;
		while (k < 3)
		{
			uchar* puchar = m3.ptr((i, j), k);
			*puchar = k;
			k++;
		}
	}
}
cout << "m3:" << endl;
for (size_t i = 0; i < 5; i++)
{
	for (size_t j = 0; j < 5; j++)
	{
		int k = 0;
		while (k < 3)
		{
			uchar* puchar = m3.ptr((i, j), k);
			cout <<(int)*puchar << "  ";
			k++;
		}
	}
	cout << endl;
}

//uchar* ptr(onst int* idx), const uchar* ptr(onst int* idx) const
Mat m4(5, 5, CV_8UC1);
int idx[] = {0,1,2,3,4};

for (size_t i = 0; i < 5; i++)
{
	uchar* puchar = m4.ptr(idx);
	int j = 0;
	while(j < 5)
	{
		puchar[j] = j;
		j++;
	}
	puchar++;
}
cout << "m4:" << endl;
for (size_t i = 0; i < 5; i++)
{
	uchar* puchar = m4.ptr(idx);
	int j = 0;
	while (j < 5)
	{
		cout << (int)puchar[j] << " ";
		j++;
	}
	cout << endl;
	puchar++;
}

//​template<int n> _Tp* ptr (const Vec< int, n > &idx), template<int n> ​_Tp* ptr (const Vec< int, n > &idx),​ const _Tp* ptr (const Vec< int, n > &idx) const​
Mat m5(5, 5, CV_8UC1);
Vec<int, 5> vec1 = {0,1,2,3,4};

for (size_t i = 0; i < 5; i++)
{
	uchar* puchar = m5.ptr(vec1);
	int j = 0;
	while (j < 5)
	{
		puchar[j] = 255 -j;
		j++;
	}
	puchar++;
}
cout << "m5:" << endl;
for (size_t i = 0; i < 5; i++)
{
	uchar* puchar = m5.ptr(vec1);
	int j = 0;
	while (j < 5)
	{
		cout <<(int) puchar[j] << "  ";
		j++;
	}
	puchar++;
	cout << endl;
}

//​template<typename _Tp > _Tp* ptr (int i0 = 0),​ template<typename _Tp >  const _Tp* ptr (int i0 = 0) const
Mat M6(5, 5, CV_8UC1);
for (size_t i = 0; i < 5; i++)
{
	uchar* puchar = M6.ptr(i);
	int j = 0;
	while (j < 5)
	{
		puchar[j] = 127 - j;
		j++;
	}
	puchar++;
}
cout << "m6:" << endl;
for (size_t i = 0; i < 5; i++)
{
	uchar* puchar = M6.ptr(i);
	int j = 0;
	while (j < 5)
	{
		cout << (int)puchar[j] <<"  ";
		j++;
	}
	cout << endl;
	puchar++;
}

//​template<typename _Tp > _Tp* ptr (int row, int col), ​template<typename _Tp > const _Tp* ptr (int row, int col) const
Mat m7(3, 3, CV_8UC3);
for (size_t i = 0; i < 3; i++)
{
	int j = 0;
	while (j < 3)
	{
		uchar*  puchar = m7.ptr(i,j);
		puchar[0] = 255;
		puchar[1] = 0;
		puchar[2] = 0;
		j++;
	}
}
cout << "m7:" << endl;
for (size_t i = 0; i < 3; i++)
{
	int j = 0;
	while (j < 3)
	{
		uchar* puchar = m7.ptr(i,j);
		cout <<(int) puchar[0] << "  " << (int)puchar[1] << "  " << (int)puchar[2] << endl;
		j++;
	}
}

//​template<typename _Tp > _Tp* ptr (int i0, int i1, int i2),  template<typename _Tp >  const _Tp* ptr (int i0, int i1, int i2) const
Mat m8(5, 5, CV_8UC3);
for (size_t i = 0; i < 5; i++)
{
	for (size_t j = 0; j < 5; j++)
	{
		int k = 0;
		while (k < 3)
		{
			uchar* puchar = m8.ptr((i, j), k);
			*puchar = k;
			k++;
		}
	}
}
cout << "m8:" << endl;
for (size_t i = 0; i < 5; i++)
{
	for (size_t j = 0; j < 5; j++)
	{
		int k = 0;
		while (k < 3)
		{
			uchar* puchar = m8.ptr((i, j), k);
			cout <<(int)*puchar;
			k++;
		}
	}
	cout << endl;
}

//​template<typename _Tp > _Tp* ptr (const int* idx), ​template<typename _Tp > const _Tp* ptr (const int* idx) const
//Mat m9(5, 5, CV_8UC1);
Mat m9 = Mat_<uchar>(5, 5);
int idx1[] = { 0,1,2,3,4 };

for (size_t i = 0; i < 5; i++)
{
	uchar* puchar = m9.ptr(idx1);
	int j = 0;
	while (j < 5)
	{
		puchar[j] = j;
		j++;
	}
	puchar++;
}
cout << "m9:" << endl;
for (size_t i = 0; i < 5; i++)
{
	uchar* puchar = m9.ptr(idx1);
	int j = 0;
	while (j < 5)
	{
		cout << (int)puchar[j] << " ";
		j++;
	}
	cout << endl;
	puchar++;
}

//​template<typename _Tp, int n> _Tp* ptr (const Vec< int, n > &idx), ​template<typename _Tp, int n> const _Tp* ptr (const Vec< int, n > &idx) const​
//Mat m10(5, 5, CV_8UC1);
Mat m10 = Mat_<uchar>(5, 5);
Vec<int, 5> vec2 = { 0,1,2,3,4 };

for (size_t i = 0; i < 5; i++)
{
	uchar* puchar = m10.ptr(vec2);
	int j = 0;
	while (j < 5)
	{
		puchar[j] = 255 - j;
		j++;
	}
	puchar++;
}
cout << "m10:" << endl;
for (size_t i = 0; i < 5; i++)
{
	uchar* puchar = m10.ptr(vec2);
	int j = 0;
	while (j < 5)
	{
		cout << (int)puchar[j] << "  ";
		j++;
	}
	puchar++;
	cout << endl;
}

试运行,结果如下:

       

template<typename _Tp >  std::reverse_iterator< MatIterator_< _Tp > > rbegin ()

template<typename _Tp > std::reverse_iterator< MatConstIterator_< _Tp > > const

template<typename _Tp >  std::reverse_iterator< MatIterator_< _Tp > >  rend ()

template<typename _Tp > std::reverse_iterator< MatConstIterator_< _Tp > >  rend () const

rebegin()与begin()相同,但是反向遍历。

rend()与end()相同,但是反向遍历。 

将上面示例程序中无关的代码注释掉,插入新代码来演示上面函数的用法,插入的代码如下:

//for template<typename _Tp >  ​reverse_iterator< MatIterator_​<_Tp>> rbegin(),rend();
Mat m(3, 3, CV_8UC1);
typedef MatIterator_<uchar> T1;
typedef MatConstIterator_<uchar> T2;

reverse_iterator<T1> it1 = m.rbegin<uchar>();
reverse_iterator<T1> it2 = m.rend<uchar>();

reverse_iterator<T2> it3 = m.rbegin<uchar>();
reverse_iterator<T2> it4 = m.rend<uchar>();

int i = 1;
while (it1 < it2)
{
	*it1 = i;
	i++;
	it1++;
}
cout << "m:  " << endl;
cout << m << endl;
while (it3 <it4)
{
	cout << (int)*it3 << "  ";
	it3++;
}
cout << endl;

试运行,结果如下:

 void  release ()

递减参考计数器并取消分配矩阵。

该方法递减与矩阵数据相关联的参考计数器。当引用计数器达到 0 时,矩阵数据被释放,数据和引用计数器指针被设置为 NULL。如果矩阵头指向外部数据集(参见 Mat::Mat ),则引用计数器为 NULL,并且该方法在这种情况下不起作用。

在上面程序中插入以下代码:

试运行,结果如下:

可见输出矩阵为一个空矩阵。

 void reserve (size_t sz)

为一定数量的行保留空间。

该方法为 sz 行保留空间。如果矩阵已经有足够的空间来存储 sz 行,则不会发生任何情况。如果重新分配矩阵,则保留前 Mat::rows 行。该方法模拟STL向量类的相应方法。

sz 行数

void reserveBuffer (size_t sz)

为一定数量的字节保留空间。

该方法保留 sz 字节的空间。如果矩阵已经有足够的空间来存储 sz 字节,则不会发生任何情况。如果必须重新分配矩阵,其先前的内容可能会丢失。

sz 字节数

上面两个程序的调用十分简单,这里就不做实例演示了。

Mat reshape (int cn, int rows=0) const

更改 2D 矩阵的形状和/或通道数,而不复制数据。

Mat reshape (int cn, int newndims, const int *newsz) const

Mat reshape (int cn, const std::vector< int > &newshape) const

后两个函数是重载函数,其作用相似,接受的参数不同。

参数:

cn 新的通道数

rows 新的rows

newndims 新的维度

newsz 所有维度均具有新矩阵大小的数组。如果某些尺寸为零,则假定这些尺寸中的原始尺寸。

newshape  所有维度具有新矩阵大小的向量。如果某些尺寸为零,则假定这些尺寸中的原始尺寸。

注释掉上面程序的无关代码,插入新代码来演示改程序的用法。插入的代码如下:

//for resahpe()
Mat src = imread("1.png");
if (src.empty())
{
	cout << "Cann't open the image!" << endl;
	return -1;
}
imshow("src", src);
Mat dst1 = src.reshape(src.channels(), src.rows/2);
imshow("Dst1", dst1);

Mat src1 = (Mat_<uchar>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
const int newsz[] = {3, 4};

Mat dst2 = src1.reshape(1,2, newsz);
cout << "dst2 cols:"<< dst2.cols << endl;
cout <<"dst2 rows: "<< dst2.rows << endl;
cout << "dst2 channels: "<< dst2.channels() << endl;
cout << "dst2 size: " << dst2.size() << endl;
cout << "dst2 type: " << dst2.type() << endl;


Mat src2(Size(2, 2), CV_8UC3, Scalar(1, 2, 3));
vector<int> new_shape{ 4, 3 };
Mat dst3 = src2.reshape(1, new_shape);

cout << "dst3 cols:" << dst3.cols << endl;
cout << "dst3 rows: " << dst3.rows << endl;
cout << "dst3 channels: " << dst3.channels() << endl;
cout << "dst3 size: " << dst3.size() << endl;
cout << "dst23 type: " << dst3.type() << endl;

试运行,结果如下:

void resize (size_t sz)

改变矩阵的rows

void resize (size_t sz, const Scalar &s)

改变矩阵的rows及矩阵值

参数 :

sz 新的矩阵rows

s 矩阵的新值。

注释掉上面程序中无关的代码,添加新代码,来演示该函数的用法,添加的新代码如下:

//Example for resize()
Mat src(500, 500, CV_8UC3, Scalar(255, 0, 0));
imshow("src", src);

src.resize(300);
imshow("src resied first", src);

src.resize(400, Scalar(0, 0, (uchar)255));
imshow("src resied second", src);

试运行,结果如下:

Mat row (int y) const

为指定的矩阵行创建矩阵头,不copy数据

Mat  rowRange (int startrow, int endrow) const

为指定的row跨度创建矩阵头,不copy数据

Mat rowRange (const Range &r) const

为指定的row跨度创建矩阵头,不copy数据

这几个函数与前面讲过的col (int x) const,colRange (int startcol, int endcol) const,colRange (const Range &r) const原理类似前者是针对row,后面针对的是row,这里就不再做演示。

Mat & setTo (InputArray value, InputArray mask=noArray())

将全部或部分数组元素设置为指定值。

This is an advanced variant of the Mat::operator=(const Scalar& s) operator.

参数:

Value 分配的标量转换为实际的数组类型。

mask  与 *this 大小相同的操作掩码。它的非零元素表示哪些矩阵元素需要复制。掩码必须为 CV_8U 类型,并且可以有 1 个或多个通道。

注释掉上面程序中无关的代码,插入新代码,来演示·该·函数的用法,插入代码如下:

//Example for setTo (InputArray value, InputArray mask=noArray())
Mat m1(5, 5, CV_8UC1, Scalar(110));
Mat mask(5, 5, CV_8UC1, Scalar(255));
for (size_t i = 0; i < 5; i++)
{
	int j = 1;
	while (j <3)
	{
		mask.at<uchar>(j, i) = 0;
		j++;
	}
	
}
Scalar newVal(115);
m1.setTo(newVal, mask);

m1.setTo(newVal, mask);
cout << m1 << endl;

试运行,结果如下:

size_t  step1 (int i=0) const

返回一个标准化步长。

该方法返回除以 Mat::elemSize1() 的矩阵步长。快速访问任意矩阵元素非常有用。

注释掉上面程序中无关代码,插入新代码,来演示该函数的用法,插入代码如下:

//Example for step1()
	Mat m1(5, 5, CV_8UC3, Scalar(0,0,255));
	cout << "m1 elmentsize: " << m1.elemSize() << endl;
	cout << "m1 elmentsize1: " << m1.elemSize1() << endl;
	cout << "m1 step: " << m1.step << endl;
	cout << "m1 step1: " << m1.step1() << endl;

试运行,结果如下:

MatExpr      t () const

转置矩阵,即返回该Mat对象数据矩阵的转置矩阵。

注释掉上面演示程序的无关代码,插入新代码,来演示该函数的用法,插入代码如下:

//Example for t()
Mat m1 = (Mat_<uchar>(3,3) <<1,2,3,4,5,6,7,8,9);
cout << "m1:" << endl;
cout << m1 << endl;
Mat m2 = m1.t();
cout << "m2:" << endl;
cout << m2 << endl;

试运行,结果如下:

size_t  total () const 

返回Mat对象数据矩阵element的总数。

size_t  total(int startDim, int endDim=INT_MAX) const

该方法返回某个子数组切片内的元素数量

int   type() const

返回element type

注释掉上面演示程序中无关的代码,插入新代码,演示上面几个函数的用法,插入代码如下:

//Example for total(),type()
Mat m1(10, 10, CV_8UC3,Scalar(0,0,255));
cout <<"m1 total: "<< m1.total() << endl;
cout << "m1  total2: " << m1.total((int)3, (int)9) << endl;
cout << "m1 type: " << m1.type() << endl;

试运行,结果如下:

         到此,OpenCV Mat类的成员函数已介绍完毕。 

        博文示例是基于OpenCV4.8(opencv目录位于d盘根目录下)及VS2022。示例源码已上传到CSDN,其链接为:https://download.csdn.net/download/billliu66/88874033

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

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

相关文章

docker打包当前dinky项目

以下是我的打包过程&#xff0c;大家可以借鉴。我也是第一次慢慢摸索&#xff0c;打包一个公共项目&#xff0c;自己上传。 如果嫌麻烦&#xff0c;可以直接使用我的镜像&#xff0c;直接跳到拉取镜像&#xff01; <可以在任何地方的服务器进行拉取> docker打包当前din…

【JMST】:二苄基甲苯作为LOHC加氢以及脱氢性能研究

二苄基甲苯作为液态有机氢载体加氢及其及其脱氢性能的参数研究 摘要&#xff1a;在低压系统下研究了二苄基甲苯&#xff08;H0-DBT&#xff09;的氢化特性。氢化实验在各种金属催化剂上进行&#xff0c;发现 Raney-Ni 催化剂的活性最高。实验均使用 10 克 DBT 和 1 克 Raney-Ni…

使用向量数据库pinecone构建应用04:混合搜索 Hybrid Search

Building Applications with Vector Databases 下面是这门课的学习笔记&#xff1a;https://www.deeplearning.ai/short-courses/building-applications-vector-databases/ Learn to create six exciting applications of vector databases and implement them using Pinecon…

halcon中的一维测量

一维测量 像点到点的距离&#xff0c;边缘对的距离等沿着一维方向的测量都属于1D测量范畴。Halocn的一维测量首先构建矩形或者扇形的ROI测量对象&#xff0c;然后在ROI内画出等距离的、长度与ROI宽度一致的、垂直于ROI的轮廓线&#xff08;profile line&#xff09;的等距线。…

CSP-J 2023 复赛第4题:旅游巴士

【题目来源】https://www.luogu.com.cn/problem/P9751https://www.acwing.com/problem/content/description/5313/【题目描述】 小 Z 打算在国庆假期期间搭乘旅游巴士去一处他向往已久的景点旅游。 旅游景点的地图共有 n 处地点&#xff0c;在这些地点之间连有 m 条道路。 其中…

AR汽车行业解决方案系列之2-远程汽修

在汽车行业中&#xff0c;AR技术的应用正悄然改变着整个产业链的运作方式&#xff0c;应用涵盖培训、汽修、汽车售后、PDI交付、质检以及汽车装配等&#xff0c;AR技术为多个环节都带来了前所未有的便利与效率提升。 安宝特AR将以系列推文的形式为读者逐一介绍在汽车行业中安宝…

第三方认证中心跳转

一、业务需求 由第三方认证中心将 token 放在 header (请求头) 中跳转系统&#xff0c;前端获取到第三方系统携带 header 中的 token。 二、 业务流程 模拟第三方应用 CUSTOM-USERTOKEN 是第三方的 tokenproxy_pass 是我们的前端地址 server {listen 12345;server_name loca…

MacOSX删除HBuilderX

1. 删除应用程序 如下图。MacOSX&#xff0c;打开访达&#xff0c;左侧点击应用程序&#xff0c;进入应用程序窗口&#xff0c;找到HBuilderX&#xff0c;右键菜单&#xff0c;点击移到废纸篓 2. 删除数据目录 打开操作系统终端&#xff0c;输入如下命令&#xff1a; open $H…

Jenkins详解

目录 一、Jenkins CI/CD 1、 Jenkins CI/CD 流程图 2、介绍 Jenkins 1、Jenkins概念 2、Jenkins目的 3、特性 4、产品发布流程 3、安装Jenkins 1、安装JDK 2、安装tomcat 3.安装maven 4安装jenkins 5.启动tomcat&#xff0c;并页面访问 5.添加节点 一、Jenkins CI/…

Vue3 学习笔记(Day4)

「写在前面」 本文为尚硅谷禹神 Vue3 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. Vue3 学习笔记&#xff08;Day1&#xff09; 2. Vue3 学习笔记&#xff08;Day2&…

网络原理 HTTP _ HTTPS

回顾 我们前面介绍了HTTP协议的请求和响应的基本结构 请求报文是由首行请求头空行正文来组成的 响应报文是由首行形影头空行响应正文组成的 我们也介绍了一定的请求头之中的键值对的属性 Host,Content-type,Content-length,User-agent,Referer,Cookie HTTP协议中的状态码 我们先…

SCI一区 | Matlab实现ST-CNN-MATT基于S变换时频图和卷积网络融合多头自注意力机制的多特征分类预测

SCI一区 | Matlab实现ST-CNN-MATT基于S变换时频图和卷积网络融合多头自注意力机制的故障多特征分类预测 目录 SCI一区 | Matlab实现ST-CNN-MATT基于S变换时频图和卷积网络融合多头自注意力机制的故障多特征分类预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍…

海外媒体推广通过5个发稿平台开拓国际市场-华媒舍

随着全球化的进程&#xff0c;国际市场对于企业的吸引力日益增加。进入国际市场并获得成功并非易事。海外媒体推广发稿平台成为了一种重要的营销手段&#xff0c;能够帮助企业在国际市场中建立品牌形象、传递信息和吸引目标受众。本文介绍了五个海外媒体推广发稿平台&#xff0…

数据结构-二分搜索树(Binary Search Tree)

一,简单了解二分搜索树 树结构: 问题:为什么要创造这种数据结构 1,树结构本身是一种天然的组织结构,就好像我们的文件夹一样,一层一层的. 2,树结构可以更高效的处理问题 二,二分搜索树的基础 1、二叉树 2,二叉树的重要特性 满二叉树 总结: 1. 叶子结点出现在二叉树的最…

数字热潮:iGaming 能否推动加密货币的普及?

过去十年&#xff0c;iGaming&#xff08;互联网游戏&#xff09;世界有了显著增长&#xff0c;每月有超过一百万的新用户加入。那么&#xff0c;这一主流的秘密是什么&#xff1f;让我们在本文中探讨一下。 领先一步&#xff1a;市场 数字时代正在重新定义娱乐&#xff0c;iG…

LeetCode 2476.二叉搜索树最近节点查询:中序遍历 + 二分查找

【LetMeFly】2476.二叉搜索树最近节点查询&#xff1a;中序遍历 二分查找 力扣题目链接&#xff1a;https://leetcode.cn/problems/closest-nodes-queries-in-a-binary-search-tree/ 给你一个 二叉搜索树 的根节点 root &#xff0c;和一个由正整数组成、长度为 n 的数组 qu…

Java零基础 - 算术运算符

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

基于Java+SSM+Jsp宿舍管理系统(源码+演示视频+包运行成功+Maven版)

您好&#xff0c;我是码农小波&#xff08;wei158888&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 ❤️ 1. 毕业设计专栏&#xff0c;毕业季咱们不慌&#xff0c;上千款毕业设计等你来选。 目录 1、项目背景 2、项目演示 3、使用技术 4、系统设计 …

Linux--shell编程中分区表常用操作 全面且详细

文章中关于分区表常用操作目录&#xff1a; 一、概念 二、​​​​​​​创建分区表语法 ​​​​​​​三、创建一个表带多个分区 四、​​​​​​​加载数据到分区表中 五、加载数据到一个多分区的表中去 ​​​​​​​六、查看分区 七、​​​​​​​添加一个分区…

Vue局部注册组件实现组件化登录注册

Vue局部注册组件实现组件化登录注册 一、效果二、代码1、index.js2、App.vue3、首页4、登录&#xff08;注册同理&#xff09; 一、效果 注意我这里使用了element组件 二、代码 1、index.js import Vue from vue import VueRouter from vue-router import Login from ../vie…