C++ opencv 学习

文章目录

  • 1、创建窗口
  • 2、读取图片
  • 3、视频采集
  • 4、Mat的使用
  • 5、异或操作
  • 6、通道分离,通道合并
  • 7、色彩空间转换
  • 8、最大值、最小值
  • 9、绘制图像
  • 10、多边形绘制
  • 11、随机数
  • 12、鼠标实时绘制矩形
  • 13、归一化
  • 14、resize操作
  • 15、旋转翻转
  • 16、视频操作
  • 17、模糊操作
  • 18、高斯模糊操作

1、创建窗口

c++写法:

void test2()
{Mat img = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");cout<<img.depth()<<" "<<img.channels()<<endl;namedWindow("new",cv::WINDOW_AUTOSIZE);imshow("new",img);waitKey(0);destroyAllWindows();
}

python写法:

def test():cv2.namedWindow('new', cv2.WINDOW_NORMAL)cv2.imshow('new', 0)key = cv2.waitKey(0)if key & 0xFF  == ord('q'):cv2.destroyAllWindows()

2、读取图片

c++写法,操作图像,将图像转换为hsv然后调整亮度值,转换会BGR格式显示

void test2()
{Mat img = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");cout<<img.depth()<<" "<<img.channels()<<endl;namedWindow("new",cv::WINDOW_AUTOSIZE);imshow("new",img);waitKey(0);Mat gray,hsv;cvtColor(img,gray,cv::COLOR_BGR2GRAY);imshow("new",gray);waitKey(0);cvtColor(img,hsv,cv::COLOR_BGR2HSV);imshow("new",hsv);waitKey(0);Mat channels[3];// 将HSV图像分离为三个单独的通道,这将把HSV图像的三个通道分别存储在channels数组的不同元素中split(hsv,channels);int bright = 50;channels[2] += bright;// 将亮度通道的像素值限制在0到255之间,大于255截断为255threshold(channels[2],channels[2],255,255,cv::THRESH_TRUNC);// 将修改后的通道合并为单个图像cv::merge(channels, 3, hsv);Mat outputImage;cv::cvtColor(hsv, outputImage, cv::COLOR_HSV2BGR);imshow("new",outputImage);waitKey(0);destroyAllWindows();
}
@param filename Name of file to be loaded.
@param flags Flag that can take values of cv::ImreadModesCV_EXPORTS_W Mat imread( const String& filename, int flags = IMREAD_COLOR );flags标识符介绍:
IMREAD_GRAYSCALE = 0, 灰度图
IMREAD_COLOR = 1,原本是什么颜色就显示什么颜色
def test2():cv2.namedWindow('new', cv2.WINDOW_AUTOSIZE)img = cv2.imread(img_name, 1)cv2.imshow('new', img)cv2.waitKey(0)cv2.destroyAllWindows()cv2.imwrite('1.png',img)

3、视频采集

def test3():# cv2.namedWindow('new', cv2.WINDOW_AUTOSIZE)# 获取视频设置 cap = cv2.VideoCapture(0)while True:ret, frame = cap.read()cv2.imshow('video', frame)key = cv2.waitKey(10)if (key & 0xFF) == ord('q'):breakcap.release()cv2.destroyAllWindows()

录制视频

def test4():fourcc = cv2.VideoWriter_fourcc(*'MJPG')vw = cv2.VideoWriter('./out.mp4', fourcc, 25, (1920, 1080))cap = cv2.VideoCapture(0)# 判断摄像头是否打开状态while cap.isOpened():ret, frame = cap.read()if ret == True:cv2.imshow('video', frame)# 写数据到多媒体文件vw.write(frame)key = cv2.waitKey(10)if (key & 0xFF) == ord('q'):breakelse:breakcap.release()cv2.release()cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

import cv2# 色彩空间
# hsv:色相、饱和度、明亮度
# yuv:4:2:0 4:2:2 4:4:4def callback():passdef test7():cv2.namedWindow('color',cv2.WINDOW_NORMAL)img = cv2.imread('./1.png')colorspaces = [cv2.COLOR_BGR2RGBA,cv2.COLOR_BGR2BRGA,cv2.COLOR_BGR2GRAY,cv2.COLOR_BGR2HSV_FULLL,cv2.COLOR_BGR2YUV]cv2.createTrackbar('curcolor','color',0,len(colorspaces),callback)while True:index = cv2.getTrackbarPos('curcolor','color')cvt_img = cv2.cvtColor(img,colorspaces[index])cv2.imshow('color',img)key = cv2.waitKey(10)if key & 0xFF == ord('q'):breakcv2.destroyAllWindows()if __name__ == '__main__':test7()

4、Mat的使用

深拷贝和浅拷贝

void test3()
{Mat img,m1,m2;img = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");// 克隆,深拷贝m1 = img.clone();img.copyTo(m2);// 创建空白图像Mat m3 = Mat::zeros(Size(8,8),CV_8UC1);// 创建全部为1的通道,如果创建的是3通道,则只有每个元素的第一个通道为1Mat m4 = Mat::ones(Size(8,8),CV_8UC3);cout<<m3.cols<<m3.rows<<m3.channels()<<endl;// 3通道时候:每个元素的第一个通道为1m4 = 127;// 给3个通道都复值m4 = Scalar(127,127,127);
}

像素值操作:
1、根据下标操作
2、根据指针操作

void test4()
{// 像素遍历操作namedWindow("new",WINDOW_NORMAL);Mat img,gray;img = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");for(int i=0;i<img.rows;i++){for(int j=0;j<img.cols;j++){Vec3b bgr = img.at<Vec3b>(i,j);img.at<Vec3b>(i,j)[0] = 255 - bgr[0];img.at<Vec3b>(i,j)[1] = 255 - bgr[1];img.at<Vec3b>(i,j)[2] = 255 - bgr[2];}}imshow("new",img);waitKey(0);cvtColor(img,gray,cv::COLOR_BGR2GRAY);for(int i=0;i<gray.rows;i++){for(int j=0;j<gray.cols;j++){int pt = img.at<uchar>(i,j);img.at<uchar>(i,j) = 255 - pt;}}imshow("new",gray);waitKey(0);// 基于指针访问 速度更快for(int i=0;i<img.rows;i++){uchar *current_row = img.ptr<uchar>(i);for(int j=0;j<img.cols;j++){if(img.channels() == 1){int pt = *current_row;*current_row++ = 255 - pt;}else if(img.channels() == 3){*current_row++ = 255 - *current_row;*current_row++ = 255 - *current_row;*current_row++ = 255 - *current_row;}}}destroyAllWindows();
}

像素值的加减乘除

void test5()
{// 像素操作namedWindow("new",WINDOW_NORMAL);Mat img,gray;img = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");Mat m = Mat::zeros(img.size(),img.type());m = Scalar(2,2,2);Mat dst;// 乘法运算,超过255的时候会截断multiply(img,m,dst);// 加法操作add(img,m,dst);// 减法subtract(img,m,dst);// 除法divide(img,m,dst);// saturate_cast会做一个范围判定,是否在uchar范围内// saturate_cast<uchar>(p1,p2);imshow("new",dst);waitKey(0);destroyAllWindows();
}

GUI操作

void on_trac(int val,void *userdata)
{Mat *data = (Mat*)userdata;Mat m = Mat::zeros(data->size(),data->type());m = Scalar(val,val,val);Mat dst;add(*data,m,dst);imshow("new",dst);
}void test6()
{namedWindow("new",WINDOW_AUTOSIZE);Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");int maxValue = 100;int light = 50;cout<<src.type()<<endl;createTrackbar("Value Bar","new",&light,maxValue,on_trac,(void *)(&src));on_trac(50,&src);
}

addWeighted函数解释

dst = src1 * alpha + src2 * beta + gamma

5、异或操作

// 异或操作
void test7()
{Mat m1 = Mat::zeros(Size(255,255), CV_8UC3);Mat m2 = Mat::zeros(Size(255,255), CV_8UC3);rectangle(m1,Rect(100,100,80,80),Scalar(255,255,0),-1,LINE_8,0);rectangle(m2,Rect(130,130,80,80),Scalar(255,0,255),-1,LINE_8,0);imshow("new",m1);waitKey(0);imshow("new",m2);waitKey(0);Mat dst;// 按位与(都为真就为真)bitwise_and(m1,m2,dst);imshow("new",dst);waitKey(0);// 按位或(一个为真就为真)bitwise_or(m1,m2,dst);imshow("new",dst);waitKey(0);// 按位取反bitwise_not(m1,dst);imshow("new",dst);waitKey(0);// 异或(不同为真,相同为假)bitwise_xor(m1,m2,dst);imshow("new",dst);waitKey(0);destroyAllWindows();
}

6、通道分离,通道合并

// 通道分离,通道合并
void test8()
{namedWindow("new",WINDOW_AUTOSIZE);Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");imshow("new",src);waitKey(0);vector<Mat> mv;split(src,mv);imshow("new",mv[0]);waitKey(0);imshow("new",mv[1]);waitKey(0);imshow("new",mv[2]);waitKey(0);// 将蓝色和绿色通道全部置0,只保留红色通道,然后合并mv[0] = 0;mv[1] = 0;Mat dst;merge(mv,dst);imshow("new",dst);waitKey(0);// 通道融合// 第三个参数,0通道到2通道,1通道到1通道,2通道到0通道int from_to[] = {0,2,1,1,2,0};mixChannels(&src,1,&dst,1,from_to,3);imshow("new",dst);waitKey(0);
}

7、色彩空间转换

// 色彩空间转换
void test9()
{namedWindow("new",WINDOW_AUTOSIZE);Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/green.jpg");Mat dst,mask;cvtColor(src,dst,COLOR_BGR2HSV);// 出来一张2值化的图像,绿色背景是白色,人物是黑色inRange(dst,Scalar(35,43,46),Scalar(77,255,255),mask);Mat redback = Mat::zeros(src.size(),src.type());redback = Scalar(40,40,200);// 取放之后人物酒变成白色了,背景是黑色的bitwise_not(mask,mask);// 只拷贝不为0的区域,为0的区域不拷贝src.copyTo(redback,mask);imshow("new",redback);waitKey(0);
}

8、最大值、最小值

// 最大值、最小值
// 均值,方差
// 方差衡量数据集中值的离散程度,数据集中差异较小时,标准方差较小,差异较大时,方差较大(携带有效信息就越多)
// 1、计算出均值
// 2、计算每个元素与平均值的差的平方
// 3、计算平方差的平均值,得到的平方差相加,然后除以数据点的总数
// 4、取平方根:将平均平方差的值进行平方根运算,得到标准方差。

void test10()
{namedWindow("new",WINDOW_AUTOSIZE);Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/green.jpg",cv::IMREAD_GRAYSCALE);double minv,maxv;Point minLoc,maxLoc;minMaxLoc(src,&minv,&maxv,&minLoc,&maxLoc,Mat());cout<<"minv:"<<minv<<" maxv:"<<maxv<<" minLoc:"<<minLoc<<" maxLoc:"<<maxLoc<<endl;Mat mean,stddev;meanStdDev(src,mean,stddev);cout<<mean<<" "<<stddev<<endl;
}

9、绘制图像

void test11()
{namedWindow("new",WINDOW_AUTOSIZE);Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/green.jpg",cv::IMREAD_COLOR);// 绘制矩形Mat bg = Mat::zeros(src.size(),src.type());Mat dst;Rect rect(100,100,200,200);rectangle(bg,rect,Scalar(20,20,255),2,LINE_8,0);// 绘制圆,圆心坐标Point,15是半径circle(src,Point(350,400),150,Scalar(255,0,0),2,LINE_8,0);// 图像融合addWeighted(src,0.7,bg,0.3,0,dst);// 绘制线 两个点的位置line(bg,Point(100,100),Point(350,400),Scalar(0,255,0),2,LINE_8,0);// 绘制椭圆RotatedRect rrt;rrt.center = Point(200,200);rrt.size = Size(100,200);rrt.angle = 0;ellipse(src,rrt,Scalar(0,255,255),2,8);imshow("new",dst);waitKey(0);
}

10、多边形绘制

// 多边形绘制
void test13()
{Mat bg = Mat::zeros(Size(512,512),CV_8UC3);Point p1(100,200);Point p2(350,100);Point p3(450,280);Point p4(320,450);Point p5(80,400);vector<Point> pts;pts.push_back(p1);pts.push_back(p2);pts.push_back(p3);pts.push_back(p4);pts.push_back(p5);polylines(bg,pts, true,Scalar(0,0,255),2,LINE_8,0);// 填充多边形
//    fillPoly()imshow("new",bg);waitKey(0);
}

11、随机数

void test12()
{Mat bg = Mat::zeros(Size(512,512),CV_8UC3);int w = bg.cols;int h = bg.rows;// 随机数RNG rng(12345);while (true){int c = waitKey(10);if(c == 27) break;int x1 = rng.uniform(0,w);int y1 = rng.uniform(0,h);int x2 = rng.uniform(0,w);int y2 = rng.uniform(0,h);// 每次画之前清理一下bg = Scalar(0,0,0);line(bg,Point(x1,y1),Point(x2,y2),Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)),1,LINE_AA,0);imshow("new",bg);}
}

12、鼠标实时绘制矩形

Point sp(-1, -1);
Point ed(-1, -1);
Mat temp;static void on_draw(int event, int x, int y, int flags, void* userdata)
{Mat img = *((Mat*)userdata);if (event == EVENT_LBUTTONDOWN) {sp.x = x;sp.y = y;cout << "sp.x:" << sp.x << " sp.y:" << sp.y << endl;}else if (event == EVENT_LBUTTONUP) {ed.x = x;ed.y = y;cout << "ed.x:" << ed.x << " ed.y:" << ed.y << endl;int x1 = x - sp.x;int y1 = y - sp.y;if (x1 > 0 && y1 > 0) {Rect rect(sp.x, sp.y, x1, y1);temp.copyTo(img);imshow("ROI区域", img(rect));rectangle(img,rect,Scalar(0,0,255),2,8,0);imshow("new", img);sp.x = -1;sp.y = -1;}}else if (event == EVENT_MOUSEMOVE) {if (sp.x > 0 && sp.y > 0) {ed.x = x;ed.y = y;int dx = ed.x - sp.x;int dy = ed.y - sp.y;if (dx > 0 && dy > 0) {Rect box(sp.x, sp.y, dx, dy);temp.copyTo(img);rectangle(img, box, Scalar(0, 0, 255), 2, 8, 0);imshow("new", img);}}}
}void test14()
{Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");namedWindow("new", WINDOW_AUTOSIZE);setMouseCallback("new", on_draw, (void*)&src);src.copyTo(temp);imshow("new", src);waitKey(0);destroyAllWindows();
}

13、归一化

// 1、MINMAX
void test15()
{Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");namedWindow("new", WINDOW_AUTOSIZE);Mat img,img2;cout<<src.type()<<endl;src.convertTo(src,CV_32FC3);cout<<src.type()<<endl;normalize(src,img,1.0,0,NORM_MINMAX);// imshow想显示浮点数据,必须归一化0-1之间imshow("new",img);normalize(img,img2,255.0,0,NORM_MINMAX);img2.convertTo(img2,CV_8UC3);imshow("new1",img2);waitKey(0);
}

14、resize操作

// resize
void test16()
{Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");namedWindow("new", WINDOW_AUTOSIZE);Mat zoomin,zoomout;int w = src.cols;int h = src.rows;resize(src,zoomin,Size(w/2,h/2),0,0,INTER_LINEAR);resize(src,zoomout,Size(w*1.5,h*1.5),0,0,INTER_LINEAR);imshow("1",src);imshow("2",zoomin);imshow("3",zoomout);waitKey(0);
}

15、旋转翻转

void test17()
{Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");
//    namedWindow("new", WINDOW_AUTOSIZE);Mat dst,left,m1,m3;flip(src,dst,0);flip(src,left,1);flip(src,m1,-1);imshow("上下翻转",dst);imshow("左右翻转",left);imshow("180度旋转",m1);waitKey(0);// 图像旋转Mat d,M;int w = src.cols;int h = src.rows;M = getRotationMatrix2D(Point2f(w/2,h/2),45,1.0);double cos = abs(M.at<double>(0,0));double sin = abs(M.at<double>(0,1));int nw = cos * w + sin * h;int nh = sin * w + cos * h;M.at<double>(0,2) += (nw/2-w/2);M.at<double>(1,2) += (nh/2-h/2);warpAffine(src,d,M,Size(nw,nh),INTER_LINEAR,0,Scalar(0,0,255));imshow("new",d);waitKey(0);
}

16、视频操作


void test18()
{VideoCapture cap(0);Mat fram;while(true){cap.read(fram);if(fram.empty()){break;}flip(fram,fram,1);imshow("new",fram);int n = waitKey(10);if(n == 27){break;}}cap.release();
}

17、模糊操作

// 图像卷积模糊操作
void test19()
{Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");namedWindow("new", WINDOW_AUTOSIZE);Mat dst;blur(src,dst,Size(3,3),Point(-1,-1));imshow("new",dst);waitKey(0);
}

18、高斯模糊操作

// 高斯双边模糊
void test21()
{Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");namedWindow("new", WINDOW_AUTOSIZE);Mat dst;bilateralFilter(src,dst,0,100,10);imshow("new",dst);waitKey(0);
}// 高斯模糊
void test20()
{Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");namedWindow("new", WINDOW_AUTOSIZE);Rect rect(100,100,500,500);Mat roi = src(rect);GaussianBlur(roi,roi,Size(0,0),15);roi.copyTo(src(rect));imshow("new",src);waitKey(0);
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot整合MyBatis实现增删改查

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容: SpringBoot整合MyBatis实现增删改查 📚个人知识库: Leo知识库,欢迎大家访…

Java进阶-IO(1)

进入java IO部分的学习&#xff0c;首先学习IO基础&#xff0c;内容如下。需要了解流的概念、分类还有其他一些如集合与文件的转换&#xff0c;字符编码问题等&#xff0c;这次先学到字节流的读写数据&#xff0c;剩余下次学完。 一、IO基础 1、背景 1.1 数据存储问题 变量…

代码随想录day11(1)字符串:反转字符串中的单词 (leetcode151)

题目要求&#xff1a;给定一个字符串&#xff0c;将其中单词顺序反转&#xff0c;且每个单词之间有且仅有一个空格。 思路&#xff1a;因为本题没有限制空间复杂度&#xff0c;所以首先想到的是用split直接分割单词&#xff0c;然后将单词倒叙相加。 但如果想让空间复杂度为O…

芯来科技发布最新NI系列内核,NI900矢量宽度可达512/1024位

参考&#xff1a;芯来科技发布最新NI系列内核&#xff0c;NI900矢量宽度可达512/1024位 (qq.com) 本土RISC-V CPU IP领军企业——芯来科技正式发布首款针对人工智能应用的专用处理器产品线Nuclei Intelligence(NI)系列&#xff0c;以及NI系列的第一款AI专用RISC-V处理器CPU IP…

网络爬虫部分应掌握的重要知识点

目录 一、预备知识1、Web基本工作原理2、网络爬虫的Robots协议 二、爬取网页1、请求服务器并获取网页2、查看服务器端响应的状态码3、输出网页内容 三、使用BeautifulSoup定位网页元素1、首先需要导入BeautifulSoup库2、使用find/find_all函数查找所需的标签元素 四、获取元素的…

基于springboot+vue的健身房管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

●139.单词拆分 ● 关于多重背包,你该了解这些! ●背包问题总结篇!

●139.单词拆分 物品&#xff1a;wordDict里面的单词&#xff1b;背包容量&#xff1a;s.size()。 1.dp[j]含义。dp[j]true表示字符串前j个可以拆分成字典中的单词。dp[s.size()] 就是最后的结果&#xff0c;整个字符串能&#xff08;true&#xff09;不能&#xff08;false…

Docker 创建容器并指定时区

目录 1. 通过环境变量设置时区&#xff08;推荐&#xff09;2. 挂载宿主机的时区文件到容器中3. 总结 要在 Docker 容器中指定时区&#xff0c;可以通过两种方式来实现&#xff1a; 1. 通过环境变量设置时区&#xff08;推荐&#xff09; 在 Docker 运行时&#xff0c;可以通…

CentOS安装Docker(黑马学习笔记)

Docker 分为 CE 和 EE 两大版本。CE 即社区版&#xff08;免费&#xff0c;支持周期 7 个月&#xff09;&#xff0c;EE 即企业版&#xff0c;强调安全&#xff0c;付费使用&#xff0c;支持周期 24 个月。 Docker CE 分为 stable test 和 nightly 三个更新频道。 官方网站上…

文件底层的理解之缓冲区

目录 一、缓冲区的初步认识 二、向文件中写数据的具体过程 三、缓冲区刷新的时机 一、缓冲区的初步认识 缓冲区其实就是一块内存区域&#xff0c;采用空间来换时间&#xff0c;可以提高使用者的效率。我们一直说的缓冲区其实是语言层面上的缓冲区&#xff0c;其实操作系统内部…

JVM 第一部分 JVM两种解释器 类加载过程和类加载器

JVM是跨平台跨语言的虚拟机&#xff0c;不直接接触硬件&#xff0c;位于操作系统的上一层 跟字节码文件直接关联&#xff0c;和语言没有关系 一次编译成字节码文件&#xff0c;多次执行 虚拟机可以分成三部分&#xff1a;类加载器&#xff0c;运行时数据区&#xff0c;执行引…

TDengine 在 DISTRIBUTECH 分享输配电数据管理实践

2 月 27-29 日&#xff0c;2024 美国国际输配电电网及公共事业展&#xff08;DISTRIBUTECH International 2024&#xff09;在美国-佛罗里达州-奥兰多国家会展中心举办。作为全球领先的年度输配电行业盛会&#xff0c;也是美洲地区首屈一指的专业展览会&#xff0c;该展会的举办…

【和鲸冬令营】通过数据打造爆款社交APP用户行为分析报告

【&#x1f40b;和鲸冬令营】通过数据打造爆款社交APP用户行为分析报告 文章目录 【&#x1f40b;和鲸冬令营】通过数据打造爆款社交APP用户行为分析报告1 业务背景2 数据说明3 数据探索性分析4 用户行为分析4.1 用户属性与行为关系分析4.2 转化行为在不同用户属性群体中的分布…

值类型和引用类型详解(C#)

可能你对值类型和引用类型还不太了解。 值类型和引用类型&#xff0c;是c#比较基础&#xff0c;也必须掌握的知识点&#xff0c;但是也不是那么轻易就能掌握&#xff0c;今天跟着我一起来看看吧。 典型类型 首先我们看看这两种不同的类型有哪些比较典型的代表。 典型值类型…

在Windows 10系统中启用快速启动功能

在Windows 10系统中启用快速启动功能&#xff0c;可以按照以下步骤进行&#xff1a; 方法一&#xff08;通过设置应用&#xff09;&#xff1a; 点击任务栏左下角的“开始”按钮或者按键盘上的Win键打开“开始”菜单。在“开始”菜单中选择“设置”图标&#xff08;齿轮形状&…

3.3日学习打卡----初学Redis(一)

3.3日学习打卡 目录&#xff1a; 3.3日学习打卡NoSQL为什么要用NoSQL什么是NoSQL?NoSQL的四大分类关系型数据库和非关系型数据及其区别NoSQL经典应用 RedisRedis是什么?Linux下安装RedisDocker下安装Redis基本知识 NoSQL 为什么要用NoSQL 单机Mysql的美好年代 在90年代&…

Sqlmap进行http头注入及流量分析

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 利用 SQLMap 进行 HTTP 头注入的方式对于 Less-19 注入点的注入 SQLMap 工具我使用kali中自带的 注入准备 先使用bp将Less-19靶场的包抓下来保存到 txt 文件中,输入账号 admin…

Ubuntu23.10禁用Wayland

禁用前 编辑custom.conf文件 sudo vim /etc/gdm3/custom.conf 去掉WaylandEnablefalse前的#号 保存退出 重启系统 生效: 成功转换为X11

【LeetCode题解】2809. 使数组和小于等于 x 的最少时间+2788. 按分隔符拆分字符串+410. 分割数组的最大值

文章目录 [2809. 使数组和小于等于 x 的最少时间](https://leetcode.cn/problems/minimum-time-to-make-array-sum-at-most-x/)思路&#xff1a; [2788. 按分隔符拆分字符串](https://leetcode.cn/problems/split-strings-by-separator/)思路&#xff1a; [410. 分割数组的最大…

Leetcoder Day36| 动态规划part03

343. 整数拆分 给定一个正整数 n&#xff0c;将其拆分为至少两个正整数的和&#xff0c;并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2输出: 1解释: 2 1 1, 1 1 1。 示例 2: 输入: 10输出: 36解释: 10 3 3 4, 3 3 4 36。说明: 你可以假设 …