Opencv C++ 基本数据结构 Mat

2023-11-17

Opencv C++ 基本数据结构 Mat

Mat

Mat代表矩阵,该类声明在头文件opencv2/core/core.hpp中
其构造函数为:

Mat(int rows, int cols, int type)

rows代表行数,cols代表列数
type可以设置为 CV_8UC(n)CV_8SC(n)CV_16SC(n)、、CV_16UC(n)CV_32FC(n)、*、CV_32SC(n)CV_64FC(n)
其中8U、8S、16S、16U、32S、32F、64F前的数字代表Mat中每一个数值的位数
U代表uchar类型、S代表int类型、F代表浮点型(32F为float、64F为double)其他类似。


构造单通道Mat对象

如代码所示:

# include <opencv2\core\core.hpp>
using namespace cv;
int main() {
	//构造两行三列的float型矩阵
	Mat m = Mat(2, 3, CV_32FC(1));
	//利用Size对象构造两行3列矩阵,Size(列,行)
	Mat m1 = Mat(Size(3, 2), CV_32FC(1));
	//使用Mat类中的成员函数create完成Mat对象构造
	Mat m2;
	m2.create(Size(2, 3), CV_32FC1);
	//构造零矩阵和1矩阵
	Mat o = Mat::ones(2, 3, CV_32FC1);
	Mat z = Mat::zeros(Size(3,2), CV_32FC1);
	//初始化小型矩阵
	Mat m = (Mat_<int>(2, 3) << 1, 2, 3, 4, 5, 6;
	return 0;
}

获取单通道Mat的基本信息

注:单通道与ndarray中的二维对应,多通道与ndarray的三维对应

以三行两列的矩阵为例

m = [ 11 12 33 43 51 16 ] m=\left[ \begin{matrix} 11 & 12 \\ 33 & 43 \\ 51& 16 \end{matrix} \right] m=113351124316

1、获取行数和列数
# include <opencv2\core\core.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main() {
	//快速构造矩阵
	Mat m = (Mat_<int>(3, 2) << 11, 12, 33, 43, 51, 16);
	//矩阵的行数
	cout << "行数:" << m.rows << endl;
	//矩阵的列数
	cout << "行数:" << m.cols << endl;
	return 0;
}

输出:
这里写图片描述


2、使用成员函数size()获取矩阵的尺寸

成员函数**size()**返回的是Size对象

//获取尺寸
	Size size = m.size();
	cout << "尺寸:" << size << endl;

这里写图片描述


3、使用成员函数channels()获取矩阵的通道数
cout << "通道数:" << m.channels() << endl;

输出:
在这里插入图片描述


4、使用成员函数total获得面积(行数乘列数)
	cout << "面积:" << m.total() << endl;

输出
在这里插入图片描述


5、成员变量dims(维数)
cout << "维数:" << m.dims << endl;

输出:
在这里插入图片描述


访问单通道对象中的值

1、使用成员函数at

例如访问单通道数据类型为CV_32F的对象m,访问其第r行c列的值:
格式为:m.at<类型>(行,列)

m.at<float>(r,c)

遍历上文中矩阵m中的值并输出:

# include <opencv2\core\core.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main() {
	//快速构造矩阵
	Mat m = (Mat_<int>(3, 2) << 11, 12, 33, 43, 51, 16);
	//for循环打印m中的每一个值
	for (int r = 0; r < m.rows; r++)
	{
		for (int c = 0; c < m.cols; c++)
		{
			cout << m.at<int>(r, c) << ",";
		}
		cout << endl;
	}
	//return 0;
}

还可以结合opencv中的Point类和at成员函数来实现:
m.at(r, c)可用m.at(Point(r,c))代替


2、利用成员函数ptr

矩阵每一行的值值是连续存储在内存中的,行与行在内存中也可能存在间隔
通过ptr成员函数可以获得执行每一行地址的指针
格式为:m.ptr<类型>(第几行)
遍历上文中矩阵m中的值并输出:

for (int r = 0; r < m.rows; r++)
	{
		const int* ptr = m.ptr<int>(r);
		//打印第r行所有值
		for (int c = 0; c < m.cols; c++)
		{
			cout << ptr[c] << ",";
			//cout << *(ptr+c) << ",";
		}
		cout << endl;
	}

3、使用成员函数isContinuous 和 ptr

矩阵在存储时如果每一行在内存中没有间隔则isContinuous返回true
遍历上文中矩阵m中的值并输出:

if (m.isContinuous())
	{
		//获取指向第一行的指针
		int* ptr = m.ptr<int>(0);
		for (int i = 0; i < m.total(); i++)
		{
			cout << ptr[i] << ",";
			if (i % m.cols)
			{
				cout << endl;
			}
		}
	}

4、使用成员变量step和data

对于单通道矩阵来说,step[0]代表每一行所占的字节数,如果有间隔则间隔也作为字节数被计算在内;step[1]代表每一个数值所占的字节数,data是一个指针类型为uchar,它指向第一个数值。
因此无论矩阵行与行之间在内存中是否有间隔,都可以使用以下代码来访问第r行c列:

*((int *)(m.data+m.step[0]*r+c*m.step[1]))

向量类Vec(构建多通道Mat的基础)

可以把这里的向量理解为列向量,构造一个 _cn行x1列的数据类型为_Tp的列向量格式:Vec<Typename _Tp, int _cn>
例如构造一个长度为3类型为int,且初始化为11,87,37的列向量:

Vec<int, 3> vi(11, 87, 37);

这样构建的向量默认为列向量,可以通过输出行数和列数查看

	cout << vi.rows << endl;
	cout << vi.cols << endl;

在这里插入图片描述
可以使用 “[]” 或"()"操作符f访问向量中的值

//访问向量中的值
	cout << "访问第0个元素" << vi(0) << endl;
	cout << "访问第1个元素" << vi[1] << endl;

在这里插入图片描述
opencv 为向量类取了别名:

typedef Vec\<uchar ,3> Vec3b
typedef Vec\<int ,2> Vec2i
typedef Vec\<float,4> Vec4f
typedef Vec\<double ,3> Vec3d

单通道矩阵每个元素都是一个数值,多通道矩阵每个元素可以看作一个向量。


构造多通道Mat对象

构造一个由n个rows*cols二维浮点型矩阵组成的三维矩阵的格式如下:

Mat(int rows,int cols,CV_32FC(n))

例如构造一个2行2列的float类型的三通道矩阵

Mat mm = (Mat_<Vec3f>(2, 2) << Vec3f(1, 11, 21), Vec3f(2, 12, 32),
		Vec3f(3, 13, 23), Vec3f(4, 24, 34));

访问多通道对象中的值

1、使用成员函数at

可以将多通道Mat看作一个特殊的二维数组,数组的每个元素不是数值而是一个向量
以上文 创建的mm多通道对象为例遍历输出多通道矩阵mm的每个元素

	for (int r = 0; r < mm.rows; r++)
	{
		for (int c = 0; c < mm.cols; c++)
		{
			cout << mm.at<Vec3f>(r, c);
		}
		cout << endl;
	}

输出:
在这里插入图片描述


2、利用成员函数ptr

多通道Mat的元素在内存中也是按行存储,每一个行存储在连续内存区域中,如果行与行之间由间隔,间隔相等。成员函数ptr返回指向指定行的第一个元素的指针。
使用ptr访问mm对象的每个元素。

for (int r = 0; r < mm.rows; r++)
	{
		Vec3f* ptr = mm.ptr<Vec3f>(r);
		for (int c = 0; c < mm.cols; c++)
		{
			cout << ptr[c] << ",";
			if (c % mm.cols)
			{
				cout << endl;
			}
		}
	}

输出与使用at相同


3、使用成员函数isContinuous 和 ptr

与单通道Mat对象一样,可通过isContinuous判断整个Mat对象中的元素是否存储在连续内存中,返回true即表示连续存储;如果是连续存储,就可以少一个循环用ptr遍历

	if (mm.isContinuous())
	{
		//获取指向第一行的指针
		Vec3f* ptr = mm.ptr<Vec3f>(0);
		for (int i = 0; i < mm.total(); i++)
		{
			cout << ptr[i] << ",";
			if (i % mm.cols)
			{
				cout << endl;
			}
		}
	}

4、使用成员变量step和data

与单通道Mat类似,step[0]代表每一行所占的字节数,如果有间隔则间隔计算在内,step[1]代表每一个个元素所占的字节数,step[1] = elemSize1()*channels()
elemSize1()代表一个元素中一个数值所占的字节数;data代表首个数值的地址
下面使用step和data遍历输出mm中的元素:

	for (int r = 0; r < mm.rows; r++)
	{
		for (int c = 0; c < mm.cols; c++)
		{
			cout <<*(Vec3f*) (mm.data + r*mm.step[0]+c*mm.step[1]);
		}
		cout << endl;
	}

输出与1,2,3相同


5、分离通道

以上述讨论的mm多通道对象为例,将所有向量第一个数值组成的二维矩阵作为第一通道,将所有向量第二个数值组成的单通道矩阵作为第二通道以此类推;
所以mm分离后的三个通道为
第一通道:2x2的矩阵,元素为 1、2、3、4
第二通道:2x2的矩阵,元素为 11、12、13、24
第三通道:2x2的矩阵,元素为 21、32、23、34
使用split可以将mm分离为多个单通道:

vector<Mat>planes;
split(mm, planes);

5、合并通道

使用merge函数可以将多个单通道矩阵合并为一个三维矩阵
该函数声明为:

void merge (const Mat *mv, size_t count, OutputArray dst)
//其重载函数
void merge (InputArrayofArrays mv, OutputArray dst)

例如将三个2*2int型单通道合并:

	Mat plane0 = (Mat_<int>(2, 2) << 1, 2, 3, 4);
	Mat plane1 = (Mat_<int>(2, 2) << 5, 6, 7, 8);
	Mat plane2 = (Mat_<int>(2, 2) << 9, 10, 11, 12);
	//初始化Mat数组也
	Mat plane[]{ plane0, plane1, plane2 };
	//声明一个mat对象用来保存合并后的多通道对象
	Mat mat;
	merge(plane, 3, mat);
	//将三个单通道矩阵放在vector容器中
	vector<Mat>pl;
	pl.push_back(plane0);
	pl.push_back(plane1);
	pl.push_back(plane2);
	Mat mat1;
	merge(pl, mat);

获得Mat中某一个区域的值

1、使用row(i)或col(j)得到矩阵的第i行j列
Mat mr = m.row(1);
Mat mc = m.col(1);
2、使用rowRange或colRange得到矩阵的连续行或连续列

首先知道Opencv中的Range类,该类用于构造连续整数序列,左闭右开。
Range(2,5)产生2、3、4序列。以5*5矩阵为例
m a t r i x = [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ] matrix = \left[ \begin{matrix} 1 & 2 & 3 & 4 & 5\\ 6 & 7 & 8 & 9 & 10 \\ 11 & 12 & 13 & 14 & 15 \\ 16 & 17 & 18 & 19 & 20 \\ 21 & 22 & 23 & 24 & 25 \end{matrix} \right] matrix=16111621271217223813182349141924510152025

//构造一个5*5int型矩阵
	Mat matrix = (Mat_<int>(5, 5) << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25);
	//访问第2、3两行
	Mat r_range = matrix.rowRange(Range(2, 4));//可以写为matrix.rowRange(2,4)
	for (int r = 0; r < r_range.rows; r++)
	{
		for (int c = 0; c < r_range.cols; c++)
		{
			cout << r_range.at<int>(r, c) << ",";
		}
		cout << endl;
	}

输出:
在这里插入图片描述
colRange与之类似

Mat c_range = matrix.colRange(Range(2, 4));
	for (int r = 0; r < c_range.rows; r++)
	{
		for (int c = 0; c < c_range.cols; c++)
		{
			cout << c_range.at<int>(r, c) << ",";
		}
		cout << endl;
	}

输出:
在这里插入图片描述
注意:成员函数row、 col 、 rowRange 、colRange 返回的矩阵是指向原矩阵的,例如改变c_range第1行1列的值,原矩阵也会改变:

c_range.at<int>(1, 1) = 1000;//改为1000
	cout <<  "输出c_range" <<endl;
	for (int r = 0; r < c_range.rows; r++)
	{
		for (int c = 0; c < c_range.cols; c++)
		{
			cout << c_range.at<int>(r, c) << ",";
		}
		cout << endl;
	}
	cout << "输出原矩阵" << endl;
	for (int r = 0; r < matrix.rows; r++)
	{
		for (int c = 0; c < matrix.cols; c++)
		{
			cout << matrix.at<int>(r, c) << ",";
		}
		cout << endl;
	}

输出:
在这里插入图片描述
使用成员函数clone和copyTo可以解决这个问题


3、使用rowRange或colRange得到矩阵的连续行或连续列

使用这两个成员函数会将矩阵克隆一份,以上述r_range为例

	Mat r_range = matrix.rowRange(Range(2, 4)).clone();
	r_range.at<int>(0, 0) = 1000;//修改值为1000
	cout << "输出r_range" << endl;
	for (int r = 0; r < r_range.rows; r++)
	{
		for (int c = 0; c < r_range.cols; c++)
		{
			cout << r_range.at<int>(r, c) << ",";
		}
		cout << endl;
	}
	cout << "输出原矩阵" << endl;
	for (int r = 0; r < matrix.rows; r++)
	{
		for (int c = 0; c < matrix.cols; c++)
		{
			cout << matrix.at<int>(r, c) << ",";
		}
		cout << endl;
	}

输出:
在这里插入图片描述
copyTo的用法为:

matrix.rowRange(2,4).copyTo(r_range);

4、使用Rect类

如果我们需要矩阵中一块矩形区域,我们可以使用rowRange和colRange来定位,但是Opencv提供了Rect类来简化操作。知道矩形的左上角坐标,和矩形的宽高就可以确定一个矩形,所以其构造函数为:

Rect(int _x,int _y, int _width, int _height);

也可以将 _width 和 _height保存在一个Size中

Rect(int _x,int _y, Size size);

如果知道左上角和右下角的坐标也可以确定一个矩形,所以构造函数为:

Rect(Point2i &pt1,Point2i &pt2);

以之前叙述的5*5矩阵matrix为例,要获得使矩形框中的值为8,9,13,14
可以按如下方式构建矩形框

	Mat roi1 = matrix(Rect(Point(2, 1), Point(4, 3)));//左上角和右下角坐标,"左开右闭"
	Mat roi2 = matrix(Rect(2, 1, 2, 2)) ;//x,y,宽,高
	Mat roi3 = matrix(Rect(Point(2, 1), Size(2,2)));//左上角坐标,尺寸

使用for循环输出:
在这里插入图片描述
这样得到的矩形区域仍然是指向原矩阵的所以,仍然可以使用clone和copyTo

Mat roi1 = matrix(Rect(Point(2, 1), Point(4, 3))).clone;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Opencv C++ 基本数据结构 Mat 的相关文章

  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • 如何使用 Python 裁剪图像中的矩形

    谁能给我关于如何裁剪两个矩形框并保存它的建议 我已经尝试过这段代码 但效果不佳 import cv2 import numpy as np Run the code with the image name keep pressing spa
  • 如何确定与视频中物体的距离?

    我有一个从行驶中的车辆前面录制的视频文件 我将使用 OpenCV 进行对象检测和识别 但我停留在一方面 如何确定距已识别物体的距离 我可以知道我当前的速度和现实世界的 GPS 位置 但仅此而已 我无法对我正在跟踪的对象做出任何假设 我计划用
  • Opencv Mat内存管理

    内存管理对于图像类至关重要 在opencv中 图像类是cv Mat 它有一个微妙的内存管理方案 假设我已经有了自己的图像类SelfImage class SelfImage public int width int height unsig
  • OpenCV Mat 和 Leptonica Pix 之间的转换

    我需要在 C 中在 OpenCV Mat 图像和 Leptonica Pix 图像格式之间进行转换 这用于 8 位灰度图像的二值化 我发现发现了 ikaliga的回答 https stackoverflow com a 25929320 2
  • 将 4 通道图像转换为 3 通道图像

    我正在使用 OpenCV 2 4 6 我正在尝试将 4 通道 RGB IplImage 转换为 4 通道 HSV 图像 下面是我的代码 给出错误 OpenCV 错误 未知函数断言失败 我认为 cvCvtColor 支持 3 通道图像 有没有
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt
  • 在 Visual Studio C++ 2008 中包含 dll

    有没有办法将 dll 包含在项目中 这样我就不必在编译后将这些 dll 与可执行文件放在同一文件夹中 这样我就可以用它们编译我的项目 这是否有可能 如果是 有人可以指导我 我的项目是一个 opencv 项目 有很多 dll 我必须包含在文件
  • 图像梯度角计算

    我实际上是按照论文的说明进行操作的 输入应该是二进制 边缘 图像 输出应该是一个新图像 并根据论文中的说明进行了修改 我对指令的理解是 获取边缘图像的梯度图像并对其进行修改 并使用修改后的梯度创建一个新图像 因此 在 MATLAB Open
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho
  • 如何使用 AdaBoost 进行特征选择?

    我想使用 AdaBoost 从大量 100k 中选择一组好的特征 AdaBoost 的工作原理是迭代功能集并根据功能的执行情况添加功能 它选择对现有特征集错误分类的样本表现良好的特征 我目前正在 Open CV 中使用CvBoost 我得到
  • 如何加速 svm.predict?

    我正在编写一个滑动窗口来提取特征并将其输入到 CvSVM 的预测函数中 然而 我偶然发现 svm predict 函数相对较慢 基本上 窗口以固定的步幅长度在图像比例上滑动穿过图像 遍历图像加上提取每个图像特征的速度 窗口大约需要 1000
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • HoughLinesP后如何合并线?

    My task is to find coordinates of lines startX startY endX endY and rectangles 4 lines Here is input file 我使用下一个代码 img c
  • OpenCV Python 和 SIFT 功能

    我知道有很多关于Python and OpenCV但我没有找到有关这个特殊主题的帮助 我想提取SIFT关键点来自 python OpenCV 中的图像 我最近安装了 OpenCV 2 3 可以访问 SURF 和 MSER 但不能访问 SIF
  • 将图像加载到现有 Mat 中

    有没有办法将图像加载到现有的 Mat 中 如果没有 有没有办法控制 OpenCV 在调用 cv imread 时分配内存的位置 我只是为您的类创建一个构造函数 该构造函数接受 imread 的输入参数并将图像直接加载 并分配 到您的类中 所
  • 如何在python 3.8中安装opencv-python

    我在 pycharm 中安装 opencv python 时遇到问题 打开 pycharm 后 我单击 设置 然后单击 项目解释器 单击 并搜索正确的模块 我开始安装 但失败了 Could not find a version that s
  • Haar级联正例图像大小调整

    我正在迈出第一步 为自定义对象识别创建 haar 级联 我花了时间获取大量数据并编写了一些预处理脚本以将视频转换为帧 我的下一步是裁剪感兴趣的对象 以创建一些积极的训练示例 我有几个问题 我确实在网上寻找答案 我有点困惑 我读到我应该致力于
  • 在 virtualenvwrapper 中激活环境

    我安装了virtualenv and virtualenvwrapper用这个命令我创建了一个环境 mkvirtualenv cv 它有效 创建后我就处于新环境中 现在我重新启动了我的电脑 我想activate又是那个环境 但是怎么样 我使

随机推荐

  • 内网穿透FRP详细教程

    简介 frp 是一个专注于内网穿透的高性能的反向代理应用 支持 TCP UDP HTTP HTTPS 等多种协议 可以将内网服务以安全 便捷的方式通过具有公网 IP 节点的中转暴露到公网 通过在具有公网 IP 的节点上部署 frp 服务端
  • 【笔记】构造函数的私有、公有、特权、静态成员

    根据书 javascript DOM高级程序设计 一书整理的笔记 var Myconstuctor function name 特权成员 与私有方法不同 特权方法能够被公开访问 而且还能够访问私有成员 特权方法是指在构造函数的作用域中使用t
  • 玩转wsl2之环境搭建

    Windows是市场占有率最高的桌面操作系统 很多开发人员还是习惯于在Windows系统中进行开发工作 但服务器领域多采用Linux操作系统 因此开发人员在开发过程中 经常会遇到windows系统开发的软件难以部署到Linux系统的问题 W
  • HTML表格嵌套、合并表格

    一 表格元素 lt table gt table常用属性 border 边框像素 width height 表格宽度 高度 bordercolor 表格边框颜色 bgcolor 表格背景颜色 二 tr th td元素 th和td元素是在tr
  • linux学习笔记-安装配置使用clamav杀毒软件

    1 安装clamav 2 更新病毒库 freshclam 如果更新不了 或者更新特别慢 可以手动下载病毒库文件 放到 var lib clamav 文件下 在更新病毒库 病毒库文件链接 三个文件 bytecode cvd http data
  • Python面试题,通过代码获取nginx.log中状态码的出现次数

    先用pyton分析nginx的一行日志 通过split函数把日志变成一个用空格分开的列表 得到了状态码是在索引为8的列表元素 开始操作 打开nginx日志文件 定义一个空字典 用来存放状态码出现的次数 结合while循环遍历每行日志
  • Python面试,这16个问题你一定要熟知

    一 Python 是如何进行内存管理的 答 从三个方面来说 一对象的引用计数机制 二垃圾回收机制 三内存池机制 对象的引用计数机制 Python 内部使用引用计数 来保持追踪内存中的对象 所有对象都有引用计数 引用计数增加的情况 一个对象分
  • C++查看变量类型办法(typeinfo)

    一 类型含意 bool b char c signed char a unsigned char h signed short int s unsigned short int t signed int i unsigned int j s
  • 一文讲懂C#、ASP.NET、ASP.NET MVC、ASP.NET web form、asp.net core mvc的区别

    微软的命名很糟糕 技术上有两个框架 ASP NET和ASP NET Core 它们分别基于 NET Framework和 NET Core构建 当Microsoft首次尝试创建一个遵循MVC模式的 现代 Web应用程序平台时 它将这个新平台
  • 主合取/析取范式

    前置知识 简单合取 析取式 合取 析取范式 极小项 当存在n个命题变项做合取时 如果这个简单合取式出现了全部的命题变项或它的否定形式 且恰好只出现一次 则这个式子属于极小项 以n 3 命题变项为p q r为例 他们的极小项如表 主析取范式
  • Ubuntu16升级为18

    https blog csdn net sean 8180 article details 81075659
  • 从mimikatz抓取密码学习攻防

    前不久在使用mimikatz抓取hash的时候遇到了报错 本着追根溯源的原则去查看了mimikatz抓取密码的原理 在学习的过程中发现了mimikatz的每种报错都有不同的原因 本文就从mimikatz的防御角度出发来分析如何防御mimik
  • 【ubuntu】报错su:认证失败

    问题 ubuntu使用su命令时提示认证失败 解决方法 报这个错误的原因是root用户默认锁定的 只要使用passwd命令重新设置下root密码即可 详细步骤 1 命令行输入sudo passwd 2 根据提示修改密码 3 输入su 4 输
  • Altium Designer编辑PCB时,器件跑出可视界面外的解决方法

    很多人在使用AD等进行PCB设计的时候 由于制作封装问题或者是其他操作问题 会遇到在PCB界面下某一个或者几个封装超出软件显示范围 不论如何移动和放大缩小 都无法显示出来 也就没法选中和编辑 下面就讲讲如何解决这个问题 一个封装超出界外 不
  • Feign 使用 @SpringQueryMap 来解决多参数传递问题

    本文目录 1 Feign传递一个bean对象参数 2 Feign传递一个bean对象参数 多个基本类型参数 3 Feign传递多个基本类型参数 4 Feign传递多个bean对象参数 在实际项目开发过程中 我们使用 Feign 实现了服务与
  • css_流光按钮(转载)

    CSS部分 初始化 取消页面的内外边距 padding 0 margin 0 body 弹性布局 让页面元素垂直 水平居中 display flex justify content center align items center 让页面
  • Mock框架应用(三)-Mock Post请求

    不带参数的post请求 description 不含参数的post请求 request uri post method post response text 不含参数的post请求 带参数的post请求 配置Json 并启动moco服务 d
  • python列表index找不到索引_Python list.index在找不到索引时抛出异常

    Why does list index throw an exception instead of using an arbitrary value for example 1 What s the idea behind this To
  • R语言数据清洗与规整-回归模型为例

    数据清洗和规整是进行数据分析的前提条件 数据的清洗和规整通常会花费比进行数据分析更多的时间 正所谓 清洗一小时 分析五秒钟 数据清洗和规整要依据实际数据的特征进行 其包括缺失值和冗余值的处理 数据重归类 字符类型转换等 这里将使用 狗熊会
  • Opencv C++ 基本数据结构 Mat

    Opencv C 基本数据结构 Mat Mat 构造单通道Mat对象 获取单通道Mat的基本信息 以三行两列的矩阵为例 1 获取行数和列数 2 使用成员函数size 获取矩阵的尺寸 3 使用成员函数channels 获取矩阵的通道数 4 使