《Opencv3编程入门》学习笔记—第三章
《Opencv3编程入门》学习笔记
记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。
第三章 HighGUI图形用户界面初步
一、图像的载入、显示和输出到文件
(一)OpenCV的命名空间
简单的OpenCV程序标配:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
(二)Mat类简析
Mat srcImage = imread("dota.jpg");
表示从指定路径下把名为dota.jpg的图像载入到Mat类型的srcImage 变量中。
(三)图像的载入与显示概述
- 图像载入:imread()
- 图像显示:imshow()
(四)图像的载入:imread()函数
Mat imread(const string& filename,int flags=1)
1、参数1:const string&类型的filename, 读取的图片文件名,可以使用相对路径或者绝对路径,但必须带完整的文件扩展名(图片格式后缀)
2、参数2:int类型的flags,为载入标识,它指定一个加载图像的颜色类型。默认为彩色图像。
- flags>0 返回一个3通道的彩色图像;
- flags=0 返回灰度图像;
- flags<0 返回包含Alpha通道的加载图像
示例:
Mat image0 = imread("1.jpg",2 | 4); //载入无损的源图像
Mat image1 = imread("1.jpg",0); //载入灰度图像
Mat image2 = imread("1.jpg",199); //载入3通道的彩色图像
(五)图像的载入:imshow()函数
void imshow(const string& winname,InputArray mat);
1、参数1:const string&类型的winname,填需要显示的窗口标识名称。
2、参数2:InputArray类型的mat,填需要显示的图像。
(六)关于InputArray 类型
typedef const_InputArray& InputArray;
遇到InputArray/OutputArray类型时,把它简单地当作Mat类型即可。
(七)创建窗口:namedWindow()函数
作用:通过指定的名字,创建一个可以作为图像和进度条的容器窗口。
void namedWindow(const string& winname,int flags=WINDOW_AUTOSIZE);
1、参数1:const string&类型的winname,填写被用作窗口的标识符的窗口名称。
2、参数2:int类型的flags,窗口的标识,可以填如下几种值。
- WINDOW_NORMAL:用户可以改变窗口的大小
- WINDOW_AUTOSIZE:窗口大小会自动调整以适应所显示的图像,并且用户不能手动改变窗口大小。(默认)
- WINDOW_OPENGL:窗口创建的时候会支持OpenGL
关闭窗口(一般不使用):destroyWindow()或destroyAllWindow()
(八)输出图像到文件:imwrite()函数
作用:用于将图像保存到指定的文件。
bool imwrite(const string& filename,InputArray img,const vector<int>& params=vector<int>());
1、参数1:const string&类型的filename,填需要写入的文件名。注意加上后缀,eg:1.jpg。
2、参数2:InputArray类型的img,一般填一个Mat类型的图像数据。
3、参数3:const vector&类型的params,表示为特定格式保存的参数编码。默认为vector()。一般不填写。
示例程序:在OpenCV中生成一幅png图片,并写入到当前工程目录下。
#include<opencv2/opencv.hpp>
#include<vector>
using namespace cv;
using namespace std;void createAlphaMat(Mat &mat){for (int i = 0; i < mat.rows; i++){for (int j = 0; j < mat.cols; j++){Vec4b&rgba = mat.at<Vec4b>(i, j);rgba[0] = UCHAR_MAX;rgba[1] = saturate_cast<uchar>((float(mat.cols - j)) / ((float)mat.cols)*UCHAR_MAX);rgba[2] = saturate_cast<uchar>((float(mat.cols - i)) / ((float)mat.rows)*UCHAR_MAX);rgba[3] = saturate_cast<uchar>(0.5*(rgba[1] + rgba[2]));}}
}int main() {//创建带Alpha通道的MatMat mat(480, 640, CV_8UC4);createAlphaMat(mat);vector<int>compression_params;//opencv3compression_params.push_back(IMWRITE_PNG_COMPRESSION);compression_params.push_back(9);try {imwrite("透明Alpha值图.png", mat, compression_params);imshow("生成的PNG图", mat);fprintf(stdout, "PNG图片文件的alpha数据保存完毕~\n可以在工程目录下查看由imwrite函数生成的图片\n");waitKey(0);}catch (runtime_error&ex) {fprintf(stderr, "图像转换成PNG格式发生错误:%s\n", ex.what());return 1;}return 0;
}
运行效果
文件保存在项目文件夹下
(九)综合示例程序:图像的载入、显示与输出
代码
//-----------------------------------【头文件、命名空间包含部分】----------------------------------------------
// 描述:包含程序所使用的头文件和命名空间
//------------------------------------------------------------------------------------------------
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;int main( )
{
//-----------------------------------【一、图像的载入和显示】--------------------------------------
// 描述:以下三行代码用于完成图像的载入和显示
//--------------------------------------------------------------------------------------------------Mat girl=imread("D://lili/desktop/jpg/opencv/girl.jpg"); //载入图像到Mat
namedWindow("【1】动漫图"); //创建一个名为 "【1】动漫图"的窗口
imshow("【1】动漫图",girl);//显示名为 "【1】动漫图"的窗口 //-----------------------------------【二、初级图像混合】--------------------------------------
// 描述:二、初级图像混合
//-----------------------------------------------------------------------------------------------
//载入图片
Mat image= imread("D://lili/desktop/jpg/opencv/dota.jpg",199);
Mat logo= imread("D://lili/desktop/jpg/opencv/dotalogo.jpg");//载入后先显示
namedWindow("【2】原画图");
imshow("【2】原画图",image);namedWindow("【3】logo图");
imshow("【3】logo图",logo);//定义一个Mat类型,用于存放,图像的ROI
Mat imageROI;
//方法一
imageROI=image(Rect(800,350,logo.cols,logo.rows));
//方法二
//imageROI=image(Range(350,350+logo.rows),Range(800,800+logo.cols));//将logo加到原图上
addWeighted(imageROI,0.5,logo,0.3,0.,imageROI);//显示结果
namedWindow("【4】原画+logo图");
imshow("【4】原画+logo图",image);//-----------------------------------【三、图像的输出】--------------------------------------
// 描述:将一个Mat图像输出到图像文件
//-----------------------------------------------------------------------------------------------
//输出一张jpg图片到工程目录下
imwrite("dota.jpg",image);waitKey();return 0;
}
运行效果
保存的图像在工程目录下
【拓展1】ROI区域定义
简单理解:imageROI就是image中roi那个区域的指针
Rect函数
//rect(左上x,左上y,长度,高度)
Rect rect(130, 20, 300-130, 230-20);
定义ROI区域
- 使用cv:Rect.顾名思义,cv::Rect表示一个矩形区域。指定矩形的左上角坐标(构造函数的前两个参数)和矩形的长宽(构造函数的后两个参数)就可以定义一个矩形区域。
//定义一个Mat类型并给其设定ROI区域
Mat imageROI;
//方法一
imageROI=image(Rect(500,250,logo.cols,logo.rows));
- 定义ROI的方式是指定感兴趣行或列的范围(Range)。Range是指从起始索引到终止索引(不包括终止索引)的一连段连续序列。
//方法二
imageROI=image(Range(250,250+logoImage.rows),Range(200,200+logoImage.cols));
【拓展2】addWeighted函数
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);
1、参数1:InputArray类型的src1,表示需要加权的第一个数组,常常填一个Mat。
2、参数2:alpha,表示第一个数组的权重
3、参数3:src2,表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数。
4、参数4:beta,表示第二个数组的权重值。
5、参数5:dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数。
6、参数6:gamma,一个加到权重总和上的标量值。看下面的式子自然会理解。
7、参数7:dtype,输出阵列的可选深度,有默认值-1。;当两个输入数组具有相同的深度时,这个参数设置为-1(默认值),即等同于src1.depth()。
二、滑动条的创建和使用
滑动条依附于窗口而存在
因为opencv没有实现按钮的功能。可以使用仅含0-1的滑动条来实现按钮的按下、弹起效果。
(一)创建滑动条:createTrackbar()函数
int createTrackbar(const string& trackbarname,const string& winname,int* value,int count,TrackbarCallback onChange = 0,void* userdata = 0);
1、参数1:轨迹条名字
2、参数2:窗口名字
3、参数3:滑块初始位置
4、参数4:表示滑块达到最大位置的值
5、参数5:默认值为0,指向回调函数
void XXX(int,void*);
- 参数1:轨迹条的位置
- 参数2:用户数据(看第六个参数)
6、参数6:默认值为0,用户传给回调函数的数据值
示例:演示了如何用轨迹条来控制两幅图像的Alpha混合
#include <opencv2\opencv.hpp>
#include "opencv2/highgui/highgui.hpp"
using namespace cv;#define WINDOW_NAME "【线性混合示例】" //为窗口标题定义的宏//---------------------------------全局变量声明----------------------------
const int g_nMaxAlphaValue = 100; //Alpha值的最大值
int g_nAlphaValueSlider; //滑动条对应的变量
double g_dAlphaValue;
double g_dBetaValue;//声明存储图像的变量
Mat g_dstImage;
Mat g_srcImage1;
Mat g_srcImage2;//-------------------on_Trackbar()函数:响应滑动条的回调函数---------------
void on_Trackbar(int,void*)
{//求出当前alpha值相对于最大值的比例g_dAlphaValue = (double) g_nAlphaValueSlider/g_nMaxAlphaValue;//beta值为1减去alpha值g_dBetaValue = (1.0 - g_dAlphaValue);//根据alpha和beta值进行线性混合addWeighted(g_srcImage1,g_dAlphaValue,g_srcImage2,g_dBetaValue,0.0,g_dstImage);//显示效果图imshow(WINDOW_NAME,g_dstImage);
}
//---------------------------------main函数----------------------------------
int main(int argc,char** argv){//加载图像g_srcImage1 = imread("D://lili/Desktop/jpg/pptjpg/frame/test.jpg");g_srcImage2 = imread("D://lili/Desktop/jpg/pptjpg/frame/kou.jpg");//设置滑动条初始值g_nAlphaValueSlider = 70;//创建窗口namedWindow(WINDOW_NAME,1);//在创建的窗口中创建一个滑动条控件char TrackbarName[50];sprintf(TrackbarName,"透明值 %d",g_nMaxAlphaValue);createTrackbar(TrackbarName,WINDOW_NAME,&g_nAlphaValueSlider,g_nMaxAlphaValue,on_Trackbar);//结果在回调函数中显示。这个函数调用是来显示最初的图片的样子on_Trackbar(g_nAlphaValueSlider,0);waitKey(0);return 0;
}
运行效果
【拓展1】sprintf函数与printf函数的区别
sprintf的作用是将一个格式化的字符串输出到一个目的字符串中,而printf是将一个格式化的字符串输出到屏幕。
(二)获取当前轨迹条的位置:getTrackbarPos()函数
int getTrackbarPos(const string& trackbarname,const string& winname);
1、参数1:const string&类型的trackbarname,表示轨迹条的名字
2、参数2:const string&类型的winname,表示轨迹条的父窗口的名称
三、鼠标操作
void setMousecallback(const string& winname, MouseCallback onMouse, void* userdata=0)
1、参数1:winname:窗口的名字。
2、参数2:onMouse:鼠标响应函数,回调函数。指定窗口里每次鼠标时间发生的时候,被调用的函数指针。 这个函数的原型应该为
void on_Mouse(int event, int x, int y, int flags, void* param);
- event是EVENT_+变量之一
- x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系)
- flags是CV_EVENT_FLAG的组合
- param是用户定义的传递到setMouseCallback函数调用的参数。如Event_MOUSEMOVE为鼠标移动消息。
3、参数3:userdate:传给回调函数的参数
示例:如何在opencv中使用鼠标进行交互
#include <opencv2/opencv.hpp>
using namespace cv;#define WINDOW_NAME "【程序窗口】"//全局函数声明部分
void on_MouseHandle(int event, int x, int y, int flags, void* param);
void DrawRectangle(cv::Mat& img, cv::Rect box); //在临时变量的图片上绘制矩形//全局变量声明部分
Rect g_rectanle;
bool g_bDrawingBox = false; //是否进行绘制
RNG g_rng(12345); //DrawRectangle用的
//main函数
int main(int argc, char** argv)
{//准备参数g_rectanle = Rect(-1,-1,0,0); //初始化Mat srcImage(600,800,CV_8UC3), tempImage;srcImage.copyTo(tempImage); //复制源图到临时变量srcImage = Scalar::all(0); //给每个通道都赋值0,即默认黑色。//设置鼠标操作回调函数namedWindow(WINDOW_NAME);setMouseCallback(WINDOW_NAME, on_MouseHandle,(void*)&srcImage);//程序主循环,当进行绘制的标示符 为真时,进行绘制while (1){srcImage.copyTo(tempImage); //复制源图到临时变量//第一次显示初始化窗口,后面才显示画的线if (g_bDrawingBox){DrawRectangle(tempImage,g_rectanle); //当绘制的标示符为真,则进行绘制}imshow(WINDOW_NAME, tempImage);imwrite("123.jpg", tempImage);if (waitKey(10) == 27){break;}}return 0;
}//鼠标的回调函数,根据不同的鼠标事件进行不同的操作。可以直接使用。
void on_MouseHandle(int event, int x, int y, int flags, void* param)
{Mat& image = *(cv::Mat*)param;//鼠标移动 消息switch (event){case EVENT_MOUSEMOVE:{if (g_bDrawingBox) //如果是否进行绘制的表示为真,则记录下长和宽到RECT变量中{g_rectanle.width = x - g_rectanle.x;g_rectanle.height = y - g_rectanle.y;}}break;//左键按下case EVENT_LBUTTONDOWN:{g_bDrawingBox = true;g_rectanle = Rect(x, y, 0, 0); //记录起始点}break; // 起初此处遗漏掉了break;造成只能绘制出随机颜色的点,不能绘制矩形//左键抬起消息case EVENT_LBUTTONUP:{g_bDrawingBox = false;//置标示符为false//对宽和高小于0的处理if (g_rectanle.width < 0){g_rectanle.x += g_rectanle.width;g_rectanle.width *= -1;}if (g_rectanle.height < 0){g_rectanle.y += g_rectanle.height;g_rectanle.height *= -1;}//调用函数进行绘制DrawRectangle(image, g_rectanle);}break;default:break;}
}//自定义的矩形绘制函数。可以直接使用。
void DrawRectangle(cv::Mat& img, cv::Rect box)
{rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0,255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));
}
运行效果:
相关文章:

《Opencv3编程入门》学习笔记—第三章
《Opencv3编程入门》学习笔记 记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 第三章 HighGUI图形用户界面初步 一、图像的载入、显示和输出到文件 (一)OpenCV的命名空间 简单的OpenCV程序标配: #include <o…...

如何从Ubuntu Linux中删除Firefox Snap?
Ubuntu Linux是一款广受欢迎的开源操作系统,拥有强大的功能和广泛的应用程序选择。默认情况下,Ubuntu提供了一种称为Snap的软件打包格式,用于安装和管理应用程序。Firefox是一款流行的开源网络浏览器,而Firefox Snap是Firefox的Sn…...

数学建模的初阶-快速上手
目录 第一步:明确问题 第二步:选择建模方法 第三步:收集数据 第四步:构建数学模型 第五步:模型验证与评估 数学建模软件推荐 统计模型 (1) 线性回归模型 (2) 逻辑回归模型 (3) 时间序列模型 优化模型 (1) …...

复习向 C/C++ 编程语言简介和概括(C++复习向p1)
文章目录 C 编程语言C 和 C 关系标准的 C 组成ANSI 标准比较重要的标准化时间 C 编程语言 是一种静态类型的、编译式的、通用式的、大小写敏感、不规则的编程语言支持过程化编程,面向对象,泛型编程 C 和 C 关系 C 是 C 的一个超集,任何合法…...

DRF之过滤,排序,分页
一、权限组件源码解读 1.继承了APIView 才有的---》执行流程---》dispatch中----》三大认证 APIView的dispatch def initial(self, request, *args, **kwargs):self.perform_authentication(request)self.check_permissions(request)self.check_throttles(request) 2 读…...

我的Redis学习,共写了14篇博客文章
早在19和20年全面学习SpringBoot相关技术知识时也曾经有学习到Redis,主要是看了几家的视频教程,但是未曾有具体的实践,后来再学习到Docker和Spring Session框架的Redis存储时,又稍微的实践了一丢丢,所有的实践也就仅此…...

mPython软件使用指南
①软件界面 一、软件界面的介绍 1.模式切换 硬件编程 Python3.6 Jupyter python3.6模式细节补充(一般不使用该模式,此处可跳过) Python3.6模式的界面 左侧指令分类栏 Python3.6模式的图形化指令分类分为: Python语法基础相关指令&…...

龙芯2K1000实战开发-系统配置详解
目录 概要 整体架构流程 技术名词解释 技术细节 编辑 总结...

【一起撸个DL框架】5 实现:自适应线性单元
CSDN个人主页:清风莫追欢迎关注本专栏:《一起撸个DL框架》GitHub获取源码:https://github.com/flying-forever/OurDLblibli视频合集:https://space.bilibili.com/3493285974772098/channel/series 文章目录 5 实现:自适…...

开箱即用的工具函数库xijs更新指南(v1.2.6)
xijs 是一款开箱即用的 js 业务工具库, 聚集于解决业务中遇到的常用函数逻辑问题, 帮助开发者更高效的开展业务开发. 接下来就和大家一起分享一下 v1.2.6 版本的更新内容以及后续的更新方向. 贡献者列表: 1. 计算变量内存calculateMemory 该模块主要由 zhengsixsix 贡献, 我们可…...

【Netty】ChannelPipeline源码分析(五)
文章目录 前言一、ChannelPipeline 接口1.1 创建 ChannelPipeline1.2 ChannelPipeline 事件传输机制1.2.1 处理出站事件1.2.2 处理入站事件 二、ChannelPipeline 中的 ChannelHandler三、ChannelHandlerContext 接口3.1 ChannelHandlerContext 与其他组件的关系3.2 跳过某些 Ch…...

并行计算技术解密:MPI和OpenMP的学习和应用指南
欢迎来到并行计算技术的奇妙世界!本指南将带您深入了解MPI(Message Passing Interface)和OpenMP(Open Multi-Processing)两种重要的并行计算技术,并为您提供学习和应用的指南。无论您是一个科研工作者、开发…...

什么是自动化测试框架?我们该如何搭建自动化测试框架?
无论是在自动化测试实践,还是日常交流中,经常听到一个词:框架。之前学习自动化测试的过程中,一直对“框架”这个词知其然不知其所以然。 最近看了很多自动化相关的资料,加上自己的一些实践,算是对“框架”…...

Debezium报错处理系列之六十七:TopicAuthorizationException: Not authorized to access topics
Debezium报错处理系列之六十七:TopicAuthorizationException: Not authorized to access topics 一、完整报错二、错误原因三、解决方法Debezium报错处理系列一:The db history topic is missing. Debezium报错处理系列二:Make sure that the same history topic isn‘t sha…...

javaWebssh中小学课件资源系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计
一、源码特点 java ssh中小学课件资源系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用 B/S模式开发。开发环境为TOMCAT…...

MySQL高级查询操作
文章目录 前言聚集函数分组查询:GROUP BY过滤:HAVING嵌套子查询比较运算中使用子查询带有IN的子查询SOME(子查询)ALL(子查询)EXISTS子查询 前言 查询语句书写顺序: 1、select 2、from 3、where 4、group by 5、having 6、order by 7、limit …...

Day53【动态规划】1143.最长公共子序列、1035.不相交的线、53.最大子序和
1143.最长公共子序列 力扣题目链接/文章讲解 视频讲解 本题最大的难点还是定义 dp 数组 本题和718.最长重复子数组区别在于这里不要求是连续的了,但要有相对顺序 直接动态规划五部曲! 1、确定 dp 数组下标及值含义 dp[i][j]:取 text1…...

Three.js--》实现3d地球模型展示
目录 项目搭建 实现网页简单布局 初始化three.js基础代码 创建环境背景 加载地球模型 实现光柱效果 添加月球模型 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多…...

<SQL>《SQL命令(含例句)精心整理版(6)》
《SQL命令(含例句)精心整理版(6)》 18 DB2查询语句18.1 查询数据库大小18.2 查看表占表空间大小18.3 查看正在执行的语句18.4 db2expln 查看执行计划18.5 db2advis 查看优化建议 19 空值19.1 NULL19.2 TRIM 18 DB2查询语句 18.1 …...

信息系统建设和服务能力评估证书CS
信息系统建设和服务能力评估体系CS简介 简介:本标准(团标T/CITIF 001-2019)是信息系统建设和服务能力评估体系系列标准的第一个,提出了对信息系统建设和服务提供者的综合能力要求。 发证单位:中国电子信息行业联合会。…...

vue3引入路由
1.首先在项目中安装路由 npm install vue-router -S 2.src文件夹下新建》views文件夹》新建home文件夹》新建Home.vue文件 在src文件夹下》新建router文件夹》新建index.js import { createRouter,createWebHashHistory } from vue-router const route s[ { path:/, compo…...

前后端联调跨域问题
文章目录 什么是同源策略如何判断是否同源?跨域资源共享(CORS)如何解决跨域问题 什么是同源策略 同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。 如何判断是否同源? 如果…...

day11 - 手写数字笔迹细化
手写数字笔迹细化 对于手写数字识别实验中,经常会遇到因为笔迹较粗导致误识别的情况,所以我们通常会先将笔迹进行细化,笔迹变细以后,数字的特征会更明显,后续进行识别的准确率就会更高。 例如数字7 和 1 ,…...

C++ QT QDBus基操
以下是使用QDBus进行跨进程通信的具体用法: 1. 创建DBus服务 在服务端进程中,需要创建一个DBus服务,并注册DBus对象。示例代码如下: #include <QDBusConnection> #include <QDBusMessage> #include <QDBusInterf…...

STM32的SPI外设
文章目录 1. STM32 的 SPI 外设简介2. STM32 的 SPI 架构剖析2.1 通讯引脚2.2 时钟控制逻辑2.3 数据控制逻辑2.4 整体控制逻辑 3. 通讯过程4. SPI 初始化结构体详解 1. STM32 的 SPI 外设简介 STM32 的 SPI 外设可用作通讯的主机及从机,支持最高的 SCK 时钟频率为 …...

VMWare ESXI6.7创建虚拟机
VMware ESXi:专门构建的裸机 管理程序 首先开启ESXI主机 登录ESXI 打开浏览器输入物理机ip,输入账号密码进行登录 创建虚拟机 选择创建类型 创建RedHat7.6 选择存储类型和数据存储 仅一个存储,直接点下一页即可 配置虚拟机硬件和虚拟机附…...

TensorFlow 1.x学习(系列二 :4):自实现线性回归
目录 线性回归基本介绍常用的op自实现线性回归预测tensorflow 变量作用域模型的保存和加载 线性回归基本介绍 线性回归: w 1 ∗ x 1 w 2 ∗ x 2 w 3 ∗ x 3 . . . w n ∗ x n b i a s w_1 * x_1 w_2 * x_2 w_3 * x_3 ... w_n * x_n bias w1∗x1w2∗…...

Openwrt折腾记6-网络摄像头
前言: 前几天买了个电视机上的摄像头,但是估计是电视配置或软件不好,视频通话太卡顿。今天把它装的极路由4的usb上了。由于当初挑的是电视免驱的,所以我猜想是通用的芯片。 调查驱动 LINUX uvc支持型号的列表里 http://www.ide…...

C++判断大端小端
C判断大端小端 1. 基础知识 大端小端其实表示的是数据在存储器中的存放顺序。 大端模式:数据的高字节存放在内存的低地址中,而低字节则存放在高地址中。地址由小到大增加,数据则从高位向低位存放,这种存放方式符合人类的正常思维…...

K8S RBAC之Kubeconfig设置用户权限,不同的用户访问不同的namespace
1.CA签发客户端证书 检查证书是否存在 # ll /etc/kubernetes/pki/ 总用量 48K -rw-r----- 1 kube root 2.1K 3月 2 16:44 apiserver.crt -rw------- 1 kube root 1.7K 3月 2 16:44 apiserver.key -rw-r----- 1 kube root 1.2K 3月 2 16:44 apiserver-kubelet-client.cr…...