当前位置: 首页 > news >正文

OpenCV基础(1)

1.图像读写与窗口显示

1.1.imread读取图像文件

Mat cv::imread(const string &filename,int flags = IMREAD_COLOR);

  • filename:要读取的图像文件名
  • flags:读取模式,可以从枚举cv::ImreadModes中取值,默认取值是IMREAD_COLOR,表示始终将图像转换为三通道RGB彩色图像

如果从指定文件加载图像成功就返回Mat矩阵,否则就返回空矩阵

1.2.imwrite保存图片

bool cv::imwrite(const string &filename,InputArray img,const std::vector<int> &params=std::vector<int>());

  • filename:需要写入的文件名,必须加上后缀
  • img:Mat类型数据,要保存到文件当中的源图像数据
  • params:特定格式保存的参数编码,一般不用写

1.3.新建窗口并显示

void nameWindow(const string &winname,int flags);

  • winname:新建的窗口的名称
  • flags:窗口的标识,一般默认为WINDOW_AUTOSIZE
    • WINDOW_AUTOSIZE:窗口自适应图片大小,并且不可手动更改
    • WINDOW_NORMAL:用户可以改变这个窗口的大小
    • WINDOW_OPENGL:窗口创建的时候支持OpenGL

void imshow(const string &winname,InputArray img);

  • winname:显示的窗口名,可以使用nameWindow函数创建窗口,如不创建,imshow将自动创建
  • img:窗口中需要显示的图像

根据图像的深度,imshow会自动对其进行缩放,规则如下:

  • 如果图像数据类型是8U,就直接显示
  • 如果图像数据类型是16U或32S,imshow函数就会自动将每个像素值除以256并显示,即将原图像素值的范围由[0~255*256]映射到[0~255]
  • 如果图像数据类型是32F或64F,imshow函数就会自动将每个像素值除以255并显示,即将原图像素值的范围由[0~1]映射到[0~255](注意:原图像素值必须归一化)

1.4.销毁窗口

//销毁一个指定名称的窗口

void destoryWindow(const string &winnanme);

//销毁全部窗口

void destoryAllWindows();

1.5.调整窗口大小

void resizeWindow(const string &winname,int width,int height);

  • winname:要调整尺寸的窗口名称
  • width:调整后的窗口宽度
  • height:调整后的窗口高度

2.OpenCV中的事件

2.1.鼠标事件

void setMousecallback(const string &winname,MouseCallback onMouse,void *userdata=0);

  • winname:窗口的名字
  • onMouse:鼠标事件响应的回调函数指针
  • userdata:传给回调函数的参数

鼠标事件回调函数类型MouseCallback定义如下:

typedef void(* cv::MouseCallback)(int event,int x,inty,int flags,void *userdata);

event:鼠标事件

enum{EVENT_MOUSEMOVE=0,    //滑动EVENT_LBUTTONDOWN=1,  //左键单击EVENT_RBUTTONDOWN=2,  //右键单击EVENT_MBUTTONDOWN=3,  //中键单击EVENT_LBUTTONUP=4,    //左键放开EVENT_RBUTTONUP=5,    //右键放开EVENT_MBUTTONUP=6,    //中建放开EVENT_LBUTTONDBLCLK=7,//左键双击EVENT_RBUTTONDBLCLK=8,//右键双击EVENT_MBUTTONDBLCLK=9 //中键双击
}

x:鼠标事件的x坐标

y:鼠标事件的y坐标

flags:鼠标事件的标志

enum{EVENT_FLAG_LBUTTON=1,    //左键拖拽EVENT_FLAG_RBUTTON=2,    //右键拖拽EVENT_FLAG_MBUTTON=4,    //中键拖拽EVENT_FLAG_CTRLKEY=8,    //按CTRLEVENT_FLAG_SHIFTKEY=16,  //按SHIFTEVENT_FLAG_ALTKEY=32     //按ALT    
}

userdata:可选的参数

2.2.键盘事件

int waitKey(int delay=0);

delay:延时的时间,单位是毫秒,默认是0,表示永久等待。该函数在至少创建了一个窗口并该窗口处于活动状态才有效;如果有多个窗口,则其中任何一个都可以处于活动状态。在小于等于0时表示等待时间无限长,为正整数n时,至少等待n毫秒才结束。在等待期间,按任意按键函数结束,返回按键的键值(ASCII码),等待时间结束仍未按下按键则返回-1。

2.3.滑动条事件

//创建滑动条
int cv::createTrackbar(const string &trackbarname,const string &winname,int *value,int count,TrackCallback onChange=0,void *userdata=0);//回调函数类型TrackbarCallback的定义
typedef void(* cv::TrackbarCallback)(int pos,void *userdata);//获取滑动块的位置
int cv::getTrackbarpos(const string &trackName,const string &winname);//设置滑动块的位置
void cv::setTrackbarPos(const string &trackName,const string &winname,int pos);

3.矩阵操作

3.1.构造矩阵

Mat::Mat()
Mat::Mat(int rows,int cols,int type)
Mat::Mat(Size size,int type)
Mat::Mat(int rows,int cols,int type,const Scalar &s)
Mat::Mat(Size size,int type,const Scalar &s)
Mat::Mat(const Mat &m)
Mat::Mat(int rows,int cols,int type,void *data,size_t step=AUTO_STEP)
Mat::Mat(Size size,int type,void *data,size_t step=AUTO_STEP)
Mat::Mat(const Mat &m,const Range &rowRange,const Range &colRange)
Mat::Mat(const Mat &m,const Rect &roi)
Mat::Mat(int ndims,const int *sizes,int type,const Scalar &s)
void create(int rows,int cols,int type)

3.2.构造特殊矩阵

//定义全0矩阵
static MatExpr zeros(int rows,int cols,int type)
static MatExpr zeros(Size size,int type)
static MatExpr zeros(int ndims,const int *sz,int type)//定义全1的矩阵
static MatExpr ones(int rows,int cols,int type)
static MatExpr ones(Size size,int type)
static MatExpr ones(int ndims,const int *sz,int type)//定义对角线为1的矩阵
static MatExpr eye(int rows,int cols,int type)
static MatExpr eye(Size size,int type)

3.3.获取矩阵的属性

Mat类提供了如下公有成员变量:

  • rows:矩阵的行数
  • cols:矩阵的列数
  • dims:矩阵的维数
  • uchar *cv::Mat::data:指向Mat数据部分的首地址
//获得矩阵通道数
int channels();//判断矩阵是否为空
bool empty();//获取矩阵的总个数
size_t Mat::total();

3.4.复制矩阵

//深复制
Mat clone();
void copyTo(OutputArray m);
void copyTo(OutputArray m,InputArray mask);//浅复制(赋值运算符和拷贝构造函数)
Mat dst=src;
Mat dst(src);

4.图像处理基础

4.1.颜色变换

void cvtColor(InputArray src,OutputArray dst,int code,int dstCn=0);

  • src:输入图像
  • dst:输出图像
  • code:转换的代码或标识
  • dstCn:目标图像的通道数,默认取值为0,如果取值为0,就由src和dst决定

4.2.画矩形

void cv::rectangle(InputOutputArray img,Point p1,Point p2,const SCalar &color,int thickness=1,int lineType=LINE_8,int shift=0);

void cv::rectangle(InputOutputArray img,Rect rec,const SCalar &color,int thickness=1,int lineType=LINE_8,int shift=0);

  • img:矩形所在的图像
  • p1:矩形的一个顶点
  • p2:矩形对角线上的另一个顶点
  • color:线条的颜色
  • thickness:线条的粗细程度,取负值(如CV_FILLED)函数绘制填充了色彩的矩形
  • lineType:线条的类型
  • shift:坐标点的小数点位数

4.3.画圆

void cv::circle(InputOutputArray img,Point center,int radius,const SCalar &color,int thickness=1,int lineType=LINE_8,int shift=0);

  • img:圆所在的图像
  • center:圆心的坐标
  • radius:圆的半径
  • color:线条的颜色
  • thickness:线条的粗细程度,取负值(如CV_FILLED)函数绘制填充了色彩的圆形
  • lineType:线条的类型
  • shift:坐标点的小数点位数

4.4.画椭圆

void cv::ellipse(InputOutputArray img,Point center,Size axes,double angle,double startAngle,double endAngle,const SCalar &color,int thickness=1,int lineType=LINE_8,int shift=0);

  • img:椭圆所在的图像
  • center:椭圆圆心的坐标
  • axes:轴的长度
  • angle:偏转的角度
  • startAngle:圆弧起始角的角度
  • endAngle:圆弧终结角的角度
  • color:线条的颜色
  • thickness:线条的粗细程度
  • lineType:线条的类型
  • shift:坐标点的小数点位数

4.5.画线段

void cv::line(InputOutputArray img,Point p1,Point p2,const SCalar &color,int thickness=1,int lineType=LINE_8,int shift=0);

  • img:线段所在的图像
  • p1:线段起始点
  • p2:线段结束点
  • color:线条的颜色
  • thickness:线条的粗细程度
  • lineType:线条的类型
  • shift:坐标点的小数点位数

4.6.多边形填充

void cv::fillPoly(Mat &img,const Point **pts,const int *npts,int ncountours,const Scalar &color,int lineType=LINE_8,int shift=0,Point offset=Point());

  • img:输入图像
  • pts:多边形点集
  • color:多边形颜色
  • lineType:线条的类型
  • shift:坐标点的小数点位数
  • offset:等高线所有点的偏移

4.7.文字绘制

//绘制文字

void cv::putText(cv::Mat &img,const string &text,cv::Point origin,int fontFace,double fontScale,cv::Scalar color,int thickness=1,int lineType=8,bool bottomLeftOrigin=false);

//获取字符串的长度和宽度

Size cv::getTextSize(const string &text,cv::Point origin,int fontFace,double fontScale,int thickness,int *baseLine);

  • img:待绘制的图片
  • text:待绘制的文字
  • origin:文本框的左下角
  • fontFace:字体
  • fontScale:尺寸因子,值越大,字体越大
  • color:线条颜色
  • thickness:线条宽度
  • lineType:线条类型
  • baseLine:文字最底部的y坐标

4.8.随机数

//使用种子产生一个32位随机整数
RNG();
RNG(uint64 state);
RNG rng;     //创建RNG对象,使用默认种子-1
int N1 = rng;//产生32位整数,其实rng既是一个RNG对象,又是一个随机整数//产生一个均匀分布的随机数(返回一个[a,b)范围的均匀分布的随机数)
int uniform(int a,int b);//产生一个高斯分布的随机数(返回一个均值为0,标准差为sigma的高斯分布1的随机数)
double gaussian(double sigma);//返回下一个随机数
unsigned next();//用随机数填充矩阵
void fill(InputOutputArray mat,int distType,InputArray a,InputArray b,bool saturateRange=false);

4.9.为图像添加边框

void cv::copyMakeBorder(InputArray src,OutputArray ddst,int top,int bottom,int left,int right,int borderType,const Scalar &value=Scalar());

  • src:输入图像
  • dst:输出图像
  • top、bottom、left、right:表示源图像在4个方向上扩充多少像素
  • borderType:边界类型
    • BORDER_REPLICATE:复制法,复制最边缘的像素扩充边界
    • BORDER_REFLECT_101:对称法,以最边缘的像素为轴,对称填充
    • BORDER_CONSTANT:常量法,以一个常量像素值填充扩充的边界
    • BORDER_REFLECT:和对称法原理一致,不过连最边缘的像素也要对称过去
    • BORDER_WRAP:用另一侧的元素来填充这一侧的扩充边界

4.10.在图像当中查找轮廓

//查找轮廓
void cv::findContours(InputArray image,OutPutArrayOfArrays contours,OutPutArray hierarchy,int mode,int method,Point offset=Point());//绘制轮廓
void cv::drawContours(InputOutputArray image,OutPutArrayOfArrays contours,int contourIdx,const Scalar &color,int thickness=1,int lineType=LINE_8,InputArray hierarchy=noArray(),int maxLevel=INT_MAX,Point offset=Point());

5.视频处理

5.1.播放视频文件

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;void processiamge(Mat &frame)
{circle(frame, Point(cvRound(frame.cols / 2), cvRound(frame.rows / 2)), 150, Scalar(0, 0, 255), 2, 8);
}int main()
{string filename = "1.avi";//打开的视频文件VideoCapture capture;capture.open(filename);double rate = capture.get(CV_CAP_PROP_FPS);//获取视频文件的帧率int delay = cvRound(1000.000 / rate);if (!capture.isOpened())//判断是否打开视频文件{return -1;}else{while (true){Mat frame;//capture.read(frame);capture >> frame;//读出每一帧的图像if (frame.empty()) break;imshow("处理前视频", frame);processiamge(frame);imshow("处理后视频", frame);waitKey(delay);}}return 0;
}

5.2.设置和获取视频属性

//获取属性 double get(int propId);

//设置属性 bool set(int propId,double value);

5.3.播放摄像头视频

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;void processiamge(Mat &frame)
{circle(frame, Point(cvRound(frame.cols / 2), cvRound(frame.rows / 2)), 150, Scalar(0, 0, 255), 2, 8);
}int main()
{VideoCapture capture;capture.open(0);//0表示摄像头的索引号double rate = capture.get(CV_CAP_PROP_FPS);//获取视频文件的帧率int delay = cvRound(1000.000 / rate);if (!capture.isOpened())//判断是否打开视频文件{return -1;}else{while (true){Mat frame;//capture.read(frame);capture >> frame;//读出每一帧的图像if (frame.empty()) break;imshow("处理前视频", frame);processiamge(frame);imshow("处理后视频", frame);waitKey(delay);}}return 0;
}

5.4.录制视频

#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  
using namespace cv;void main()
{VideoCapture capture(0);//如果是笔记本,0打开的是自带的摄像头,1 打开外接的相机double rate = 25.0;//视频的帧率Size videoSize(1280,960);VideoWriter writer("VideoTest.avi", CV_FOURCC('M', 'J', 'P', 'G'), rate, videoSize);Mat frame;while (capture.isOpened()){capture >> frame;writer << frame;imshow("video", frame);if (waitKey(20) == 27)//27是键盘摁下esc时,计算机接收到的ascii码值{break;}}
}

相关文章:

OpenCV基础(1)

1.图像读写与窗口显示 1.1.imread读取图像文件 Mat cv::imread(const string &filename,int flags IMREAD_COLOR); filename&#xff1a;要读取的图像文件名flags&#xff1a;读取模式&#xff0c;可以从枚举cv::ImreadModes中取值&#xff0c;默认取值是IMREAD_COLOR&am…...

【freertos】FreeRTOS信号量的介绍及使用

FreeRTOS信号量 一、概述二、PV原语三、函数接口1.创建一个计数信号量2.删除一个信号量3.信号量释放4.在中断释放信号量5.获取一个信号量&#xff0c;可以是二值信号量、计数信号量、互斥量。6.在中断获取一个信号量&#xff0c;可以是二值信号量、计数信号量7.创建一个二值信号…...

React Native 全栈开发实战班 - 图片加载与优化

在移动应用中&#xff0c;图片加载与优化 是提升用户体验和减少资源消耗的重要环节。图片加载不当可能导致应用卡顿、内存泄漏甚至崩溃。本章节将介绍 React Native 中常用的图片加载方法&#xff0c;包括 Image 组件的使用、第三方图片加载库&#xff08;如 react-native-fast…...

Golang云原生项目:—实现ping操作

熟悉报文结构 ICMP校验和算法&#xff1a; 报文内容&#xff0c;相邻两个字节拼接到一起组成一个16bit数&#xff0c;将这些数累加求和若长度为奇数&#xff0c;则将剩余一个字节&#xff0c;也累加求和得出总和之后&#xff0c;将和值的高16位与低16位不断求和&#xff0c;直…...

mysql如何查看当前事务的事务id

-- 开启一个事务&#xff0c;但不执行写操作 START TRANSACTION; -- 查询 InnoDB 事务信息 SELECT * FROM information_schema.innodb_trx;在 MySQL 的 MVCC (多版本并发控制) 中&#xff0c;事务 ID (Transaction ID) 是由 InnoDB 存储引擎分配的&#xff0c;它的分配机制与事…...

在linux里如何利用vim对比两个文档不同的行数

在Linux中&#xff0c;可以使用vimdiff命令来对比两个文档中不同的行。首先确保你的系统中安装了vim编辑器。 打开终端&#xff0c;使用以下命令来启动vimdiff&#xff1a; vimdiff file1 file2 这里file1和file2是你想要对比的两个文件的路径。 vimdiff会以并排方式打开两…...

深入解析Python中的逻辑回归:从入门到精通

引言 在数据科学领域&#xff0c;逻辑回归&#xff08;Logistic Regression&#xff09;是一个非常重要的算法&#xff0c;它不仅用于二分类问题&#xff0c;还可以通过一些技巧扩展到多分类问题。逻辑回归因其简单、高效且易于解释的特点&#xff0c;在金融、医疗、广告等多个…...

【数据库】mysql数据库迁移前应如何备份数据?

MySQL 数据库的备份是确保数据安全的重要措施之一。在进行数据库迁移之前&#xff0c;备份现有数据可以防止数据丢失或损坏。以下是一套详细的 MySQL 数据库备份步骤&#xff0c;适用于大多数情况。请注意&#xff0c;具体的命令和工具可能因 MySQL 版本的不同而有所差异。整个…...

C语言——鸡兔同笼问题

没注释的源代码 #include <stdio.h> #include <stdlib.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main(int argc, char *argv[]) { int tou 10; i…...

数据结构王道P234第二题

#include<iostream> using namespace std; int visit[MAxsize]; int color[MaxSize];//1表示红&#xff0c;2表示白&#xff1b; bool dfs(Graph G, int i){visit[i]1;ArcNode *p;bool flag1;for(pG.vertices[i].firsrarc; p ; pp->next){int jp->adjvex;if(!visi…...

层归一化和批归一化

层归一化是针对某一样本的所有特征&#xff0c;批归一化是针对所有样本的某一特征。 计算公式&#xff1a;&#xff08;当前值 - 均值&#xff09;/ 标准差。 作用&#xff1a;缓解梯度消失和梯度爆炸的问题&#xff0c;并提高网络的泛化性能。 为什么Transform和BERT中使用层归…...

Spring Cloud Gateway 网关

微服务网关 Spring Cloud Gateway https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories Spring Cloud 在版本 2020.0.0 开始&#xff0c;去除了 Zuul 网关的使用&#xff0c;改用 Spring Cloud Gateway 作为网关…...

LabVIEW中的UDP与TCP比较

在LabVIEW中&#xff0c;UDP和TCP可以用于不同的网络通信场景&#xff0c;开发者可以根据需求选择合适的协议。以下是结合LabVIEW开发时的一些比较和应用场景&#xff1a; 1.TCP在LabVIEW中的应用&#xff1a; 可靠性高的场景&#xff1a;当开发一个对数据传输的准确性和完整…...

半导体器件与物理篇3 P-N结

热平衡时的PN结 pn结的定义&#xff1a;由p型半导体和n型半导体接触形成的结 pn结的特性和关键变量包括&#xff1a;整流性&#xff08;即电流单向导通的特性&#xff09;、平衡费米能级&#xff08;费米能级 E F E_F EF​为常数, d E F d x 0 &#xff09;、内建电势 \frac…...

深入剖析String类的底层实现原理

嘿嘿,家人们,今天咱们来模拟实现string,好啦,废话不多讲,开干! 1:string.h 1.1:构造函数与拷贝构造函数 1.1.1:写法一 1.1.2:写法二(给缺省值) 1.2:赋值运算符重载与operatror[]获取元素 1.3:容量与迭代器 1.4:reserve与resize 1.5:清空与判断是否为空 1.6:push_back与…...

#其它:面试题

第一面试官提问如下&#xff1a; 1、自我介绍 2、根据项目提问&#xff1a;混合开发调取api的通讯方式 3、技术提问&#xff1a;如何隐藏div&#xff0c;但是div需要存在 使用 visibility 隐藏&#xff1a; 1.visibility: hidden2.display: none 3.opcity: 04、css塌陷问题…...

计算机视觉中的双边滤波:经典案例与Python代码解析

&#x1f31f; 计算机视觉中的双边滤波&#xff1a;经典案例与Python代码解析 &#x1f680; Hey小伙伴们&#xff01;今天我们要聊的是计算机视觉中的一个重要技术——双边滤波。双边滤波是一种非线性滤波方法&#xff0c;主要用于图像去噪和平滑&#xff0c;同时保留图像的边…...

【AI日记】24.11.17 看 GraphRAG 论文,了解月之暗面

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 核心工作 内容&#xff1a;看 GraphRAG 论文时间&#xff1a;4 小时评估&#xff1a;不错&#xff0c;继续 非核心工作 内容&#xff1a;了解国内大模型方向&#xff0c;重点了解了创业独角兽-月之暗面&…...

Front Panel Window Bounds 与 Front Panel Window Bounds 的区别与应用

在LabVIEW中&#xff0c;Front Panel Window Bounds 和 Front Panel WindowBounds 是两个不同的属性节点&#xff0c;用于描述前面板窗口的位置和大小。它们的区别主要体现在它们表示的是窗口的不同部分&#xff0c;具体如下&#xff1a; 1 Window Bounds&#xff1a;调整整个…...

比较TCP/IP和OSI/RM的区别

一、结构不同 1、OSI&#xff1a;OSI划分为7层结构&#xff1a;物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。 2、TCP/IP&#xff1a;TCP/IP划分为4层结构&#xff1a;应用层、传输层、互联网络层和主机-网络层。 二、性质不同 1、OSI&#xff1a;OSI是制定…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...