当前位置: 首页 > 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是制定…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

ui框架-文件列表展示

ui框架-文件列表展示 介绍 UI框架的文件列表展示组件&#xff0c;可以展示文件夹&#xff0c;支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项&#xff0c;适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...

CSS3相关知识点

CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...