OpenCV 学习笔记2 C++

1.图像直方图

直方图(Histogram)是图像处理中常用的工具,它表示图像中每个像素强度值的分布情况。在OpenCV中,可以使用 cv::calcHist 函数来计算图像的直方图。

图像直方图是一种展示图像像素强度分布的统计图表。它显示了图像中每个像素强度值的频率,有助于分析图像的亮度、对比度和色调等特征。以下是图像直方图的一些主要作用:

1.亮度和对比度分析: 直方图可以用于分析图像的整体亮度和对比度。通过观察直方图的形状,可以了解图像中亮度的分布情况,从而调整图像的亮度和对比度,使其更符合需求。

2.图像增强: 直方图均衡化是一种常见的图像增强方法,通过调整图像的直方图,使其更均匀地分布在整个灰度范围内,从而增强图像的细节和对比度。

3.颜色分析: 对于彩色图像,可以对每个颜色通道分别绘制直方图,以了解图像中各个颜色通道的分布情况。这对于颜色校正和调整非常有帮助。

4.阈值选择: 直方图可以帮助选择图像的二值化阈值。通过观察直方图的波峰和波谷,可以找到合适的阈值,将图像转换为二值图像。

5.检测图像质量问题: 异常的直方图形状可能指示图像质量问题,例如曝光不足或曝光过度。通过检查直方图,可以识别并纠正这些问题。

void TestDemo::histogram_demo(Mat& image)
{
    //创建一个白色底板的图像
    Mat img = Mat::zeros(Size(512,512),CV_8UC3);
    img = Scalar(255,255,255);

    //绘制直方图
    Mat gray;
    cvtColor(img,gray,COLOR_BGR2GRAY);//将图像转化为灰度图
    int histSize=256;//直方图尺寸
    float range[]={0,256};//像素值范围
    const float* histRange={range};
    Mat hist;
    //we compute the histogram from the 0-th channel
    int channels[]={0,1};
    calcHist(&gray,1,channels,Mat(),hist,1,&histSize,&histRange,true,false);//计算直方图 Mat()不使用mask  true->the histogram is uniform
    //第一个1代表Number of source images      第二个1代表Histogram dimensionality that must be positive and not greater than CV_MAX_DIMS (equal to 32 in the current OpenCV version).
    //hist :Output histogram, which is a dense or sparse dims -dimensional array
    int hist_w = 512;
    int hist_h = 400;
    int bin_w = cvRound((double)hist_w/histSize);// 直方图每条的宽度,cvRound 取整
    Mat histImage(hist_h,hist_w,CV_8UC3,Scalar(255,255,255));//Mat 高宽    创建直方图图像
    normalize(hist,hist,0,histImage.rows,NORM_MINMAX,-1,Mat());//直方图归一化
    for(int i=1;i<histSize;i++)
    {
        line(histImage,Point(bin_w*(i-1),hist_h-cvRound(hist.at<float>(i-1))),Point(bin_w*(i),hist_h-cvRound(hist.at<float>(i))),Scalar(0,0,0),2,LINE_8,0);//绘制直方图
    }
    namedWindow("histogram_demo",WINDOW_AUTOSIZE);
    imshow("histogram_demo",histImage);

}

2.二维直方图

二维直方图是在图像处理中用于描述两个变量(通常是图像的两个通道)之间关系的直方图。在图像处理中,最常见的是彩色图像的二维直方图,其中横轴和纵轴分别表示两个颜色通道。

以下是二维直方图的一些主要特点和应用:

1 颜色分布: 对于彩色图像,二维直方图可以显示不同颜色通道之间的关系。例如,对于RGB图像,横轴和纵轴可以分别表示红色和绿色通道,通过颜色在直方图中的分布,可以了解图像中不同颜色的占比。

2 色调相关性: 二维直方图可以用于分析图像中颜色通道之间的相关性。通过观察直方图的形状,可以了解图像中颜色的相关性,从而更好地理解图像的色调。

3 色彩校正: 通过分析二维直方图,可以识别和调整图像中不同通道的色彩偏差。这对于颜色校正非常有帮助,确保图像的颜色表现准确。

4 图像分割: 二维直方图在图像分割中有广泛的应用。通过选择合适的阈值,可以将图像分割成不同的区域,从而实现物体的检测和识别。

5 通道选择: 通过分析二维直方图,可以确定哪些颜色通道对于特定任务最为重要。这对于图像特征提取和图像识别非常有帮助。

minMaxLoc
minMaxLoc()函数 是 OpenCV 库中的一个函数,用于找到一个多维数组中的最小值和最大值,以及它们的位置。

void minMaxLoc(InputArray src, double* minVal, double* maxVal=0, Point* minLoc=0, Point* maxLoc=0, InputArray mask=noArray());

src:输入数组或者向量,必须包含至少一个元素。
minVal:可选的输出参数,用于存储最小值的实际值。如果不需要这个值,可以设为0。
maxVal:可选的输出参数,用于存储最大值的实际值。如果不需要这个值,可以设为0。
minLoc:可选的输出参数,用于存储最小值的位置。如果不需要这个值,可以设为0。
maxLoc:可选的输出参数,用于存储最大值的位置。如果不需要这个值,可以设为0。
mask:可选的掩码,其大小和类型必须与 src 相同。如果指定了此参数,那么函数只查找具有非零掩码值的元素。
void TestDemo::histogram_2d_demo(Mat& image)
{
    

    //绘制二维直方图
    Mat hsv;
    cvtColor(image,hsv,COLOR_BGR2HSV);//将图像转换为HSV图
    // Quantize the hue to 30 levels
    // and the saturation to 32 levels
    int hbins =30,sbins=32;//H、S通道直方图尺寸
    int histSize[] = {hbins,sbins};
    // hue varies from 0 to 179, see cvtColor
    float hranges[] = {0,180};//H通道像素值范围
    // saturation varies from 0 (black-gray-white) to
    // 255 (pure spectrum color)
    float sranges[] = {0,256};//S通道像素值范围
    const float* ranges[] = {hranges,sranges};
    MatND hist;
     // we compute the histogram from the 0-th and 1-st channels
    int channels[] = {0,1};
    calcHist(&hsv,1,channels,Mat(),// do not use mask
             hist,2,histSize,ranges,true,// the histogram is uniform
             false);//计算二维直方图
    double maxVal = 0;
    minMaxLoc(hist,0,&maxVal,0,0);
    int scale = 10;
    Mat histImg = Mat::zeros(sbins*scale,hbins*10,CV_8SC3);

    for(int h =0;h<hbins;h++)
    {
        for(int s = 0;s<sbins;s++)
        {
            float binVal = hist.at<float>(h,s);
            int intensity = cvRound(binVal * 255 / maxVal);
            rectangle(histImg,Point(h*scale,s*scale),Point((h+1)*scale-1,(s+1)*scale - 1),Scalar::all(intensity),FILLED);
        }
    }
    namedWindow("histogram_2d_demo",WINDOW_FREERATIO);
    imshow("histogram_2d_demo",histImg);


}

在这里插入图片描述

3.直方图均衡化

图像直方图均衡化是一种用于增强图像对比度的方法,通过调整图像的灰度分布,使得各个灰度级均匀分布,从而提高图像的视觉效果。下面详细讲解一下图像直方图均衡化的原理和步骤:
原理:

灰度直方图: 图像的灰度直方图表示了图像中各个灰度级的分布情况,即每个灰度级的像素数量。

累积分布函数(CDF): CDF 是灰度直方图的累积形式,表示每个灰度级以下的像素累积数量。

均衡化变换: 均衡化变换的目标是将图像的灰度分布映射到均匀分布,即让 CDF 尽可能平滑。

步骤:

计算灰度直方图: 对图像进行灰度化,统计各个灰度级的像素数量。

计算累积分布函数(CDF): 利用灰度直方图计算各个灰度级的累积概率。

均衡化变换: 利用均衡化变换公式,对每个灰度级进行映射。

生成均衡化后的图像: 根据均衡化变换,生成均衡化后的图像。
void TestDemo::equalizeHist_demo(Mat& image)
{
    Mat equalizedImage;
    Mat gray;
    cvtColor(image,gray,COLOR_BGR2GRAY);
    // applyColorMap(gray,bgr,COLORMAP_JET);

    equalizeHist(gray,equalizedImage);
    // cvtColor(equalizedImage,bgr,COLOR_GRAY2BGR);
    namedWindow("equalizeHist_demo",WINDOW_FREERATIO);
    imshow("equalizeHist_demo",equalizedImage);
 
}

在这里插入图片描述

4.图像卷积

图像卷积是图像处理中的一种基本操作,它通过在图像上滑动一个卷积核(也称为滤波器或窗口),对图像的每个像素进行加权和的操作。这一过程可以用来实现一系列的图像处理任务,如模糊、锐化、边缘检测等。下面是图像卷积的基本原理和步骤:
原理:

卷积核: 卷积核是一个小矩阵,包含了一组权重值。卷积操作时,卷积核在图像上滑动,与图像中的每个像素进行加权和的计算。

加权和计算: 对于图像中的每个像素,卷积核与图像的对应区域进行逐元素相乘,然后将所有乘积结果相加,得到最终的加权和。

滑动操作: 卷积核在图像上滑动,对每个像素都进行加权和的计算,得到新的图像。

步骤:

定义卷积核: 确定卷积核的大小和权重。

图像填充: 可选的步骤,对图像进行填充,以保留边缘信息。

卷积操作: 卷积核在图像上滑动,对每个像素进行加权和的计算。

输出结果: 得到卷积后的图像,即输出结果。
void TestDemo::convolution_demo(Mat& image)
{
    //创建一个白色底板的图像
    Mat img = Mat::zeros(Size(512,512),CV_8UC3);
    img = Scalar(255,255,255);

    //图像卷积操作
    Mat kernel = (Mat_<float>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);//创建卷积核   图像锐化
    
    Mat dst;
    filter2D(image,dst,-1,kernel);//图像卷积
    //when ddepth=-1, the output image will have the same depth as the source
    namedWindow("convolution_demo",WINDOW_FREERATIO);
    imshow("convolution_demo",dst);
}

在这里插入图片描述

5.高斯滤波

高斯滤波(Gaussian Blur)是一种常用的图像模糊技术,它使用高斯函数对图像进行卷积,从而实现图像平滑处理。高斯滤波的主要目的是去除图像中的高频噪声,使图像更加平滑,减少细节信息,常用于图像预处理、边缘检测前的图像平滑等任务。
高斯滤波的原理:

高斯函数: 高斯函数是一种数学函数,通常用于表示正态分布。在图像处理中,高斯函数用于生成一个二维的高斯核(卷积核)。

卷积操作: 高斯核在图像上滑动,对图像中的每个像素进行加权和的计算。不同位置的像素受到的权重由高斯函数的形状决定,距离中心越远的像素权重越小。

权重计算: 高斯函数的形状由标准差(σ)决定,标准差越大,权重分布越广。权重计算采用二维高斯函数的值,将其归一化,得到最终的权重。

高斯滤波的步骤:

定义高斯核: 定义一个二维高斯核,指定标准差。

图像卷积: 将高斯核与图像进行卷积操作。

输出结果: 得到经过高斯模糊处理后的图像。
void TestDemo::guassian_blur_demo(Mat& image)
{
    //定义高斯核大小和标准差
    int kernel_size =35;
    double sigma = 35;

    //高斯模糊
    Mat dst;
    GaussianBlur(image,dst,Size(kernel_size,kernel_size),sigma);
    //GaussianBlur参数为输入图像、输出图像、高斯核大小、标准差

    namedWindow("gaussian_blur_demo",WINDOW_FREERATIO);
    imshow("gaussian_blur_demo",dst);

}

在这里插入图片描述

6.双边滤波

双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空间与信息和灰度相似性,达到保边去噪的目的,具有简单、非迭代、局部处理的特点。之所以能够达到保边去噪的滤波效果是因为滤波器由两个函数构成:一个函数是由几何空间距离决定滤波器系数,另一个是由像素差值决定滤波器系数。

void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT )

. InputArray src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。
. OutputArray dst: 输出图像,和原图像有相同的尺寸和类型。
. int d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。
. double sigmaColor: 颜色空间过滤器的sigma值,这个参数的值月大,表明该像素邻域内有月宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
. double sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace五官,否则d正比于sigmaSpace.
. int borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.
void TestDemo::bilateral_filter_demo(Mat& image)
{
    //定义参数
    int diameter = 20 ; //像素领域的直径
    double sigma_color = 175.0;// 颜色空间标准差
    double sigma_space = 175.0;// 空间的标准差

    //高斯双边滤波
    Mat dst;
    bilateralFilter(image,dst,diameter,sigma_color,sigma_space);

    //显示结果
    namedWindow("bilateral_filter_demo",WINDOW_AUTOSIZE);
    imshow("bilateral_filter_demo",dst);
}

在这里插入图片描述

7.实时人脸检测

CascadeClassifier是opencv下objdetect模块中用来做目标检测的级联分类器的一个类;简而言之是滑动窗口机制+级联分类器的方式;

 C++: bool CascadeClassifier::load(const string& filename)
void CascadeClassifier::detectMultiScale(const Mat& image, vector<Rect>& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size())
cascade – Haar classifier cascade (OpenCV 1.x API only). It can be loaded from XML or YAML file using Load(). When the cascade is not needed anymore, release it using cvReleaseHaarClassifierCascade(&cascade).
image – Matrix of the type CV_8U containing an image where objects are detected.
objects – Vector of rectangles where each rectangle contains the detected object.
scaleFactor – Parameter specifying how much the image size is reduced at each image scale.
minNeighbors – Parameter specifying how many neighbors each candiate rectangle should have to retain it.
flags – Parameter with the same meaning for an old cascade as in the function cvHaarDetectObjects. It is not used for a new cascade.
minSize – Minimum possible object size. Objects smaller than that are ignored.
maxSize – Maximum possible object size. Objects larger than that are ignored.
void TestDemo::face_detect_demo()
{
    //加载人脸检测器模型
    cv::CascadeClassifier face_cascade;
    if(!face_cascade.load("/home/liutao/opencv-3.4.7/data/haarcascades/haarcascade_frontalface_default.xml"))
    {
        std::cerr<<" Error loading face cascade model!"<<std::endl;

        return;
    }

    //在这里添加进行人脸检测的代码

    //例如 ,可以在摄像头捕获的每一帧上进行人脸检测
    cv::VideoCapture capture(0);//打开默认摄像头
    if(!capture.isOpened())
    {
        std::cerr<<"Error opening camera!"<<std::endl;
        return ;
    }

    cv::Mat frame;
    while(capture.read(frame))
    {
        //转换图像为灰度图
        Mat gray;
        cvtColor(frame,gray,COLOR_BGR2GRAY);
        equalizeHist(gray,gray);//直方图均衡化提高对比度

        //进行双边滤波
        Mat dst;
        bilateralFilter(gray,dst,20,150,150);

        //进行人脸检测
        std::vector<cv::Rect>faces;
        face_cascade.detectMultiScale(dst,faces,1.1,3,0,cv::Size(30,30));
        flip(frame,frame,1);

        //在图像上标记检测到的人脸
        for(const auto& face :faces)
        {
            cv::rectangle(frame,face,cv::Scalar(255,0,0),2);//用蓝色矩形标记人脸
        }

        //显示结果
        cv::imshow("Face Detection Demo",frame);

        //检测按键,按下ESC键退出循环
        if(cv::waitKey(30)==27)
        {
            break;
        }

    }

}

8.轮廓检测

轮廓发现findContours

void findContours( InputOutputArray image,      //输入图像8bit单通道二值化图像
                    OutputArrayOfArrays contours, //找到的轮廓 vector<vector<Point>>
                    OutputArray hierachy          //可选 图像拓扑结构 vector<Vec4i>
                    int mode,                     //轮廓返回模式
                    int method,                   //发现方法
                    Point offset = Point());      //轮廓像素的位移,默认(0,0)无位移
mode类型Value
RETR_EXTERNAL只检测最外层轮廓
RETR_LIST检索所有轮廓并存到List中,无上下结构,全部同级
RETR_CCOMP检索所有轮廓,并组成双层结构
RETR_TREE检索所有轮廓,并重新建立网状轮廓结构
mode类型Value
CHAIN_APPROX_NONE返回轮廓中所有点
CHAIN_APPROX_SIMPLE水平、垂直、斜 只返回最后一个点
CHAIN_APPROX_TC89_KCOS CHAIN_APPROX_TC89_L1使用Teh-Chin链逼近算法

hierarchy向量内每一个元素的4个int型变量——hierarchy[i][0] ~hierarchy[i][3],分别表示第i个轮廓 同级的下一条轮廓、同级的前一条轮廓、下级的第一个子节点、上级父节点。如果当前轮廓没有 同级的下一条轮廓、同级的前一条轮廓、下级的第一个子节点、上级父节点,则hierarchy[i][0] ~hierarchy[i][3]的相应位被设置为默认值-1。

void drawContours( InputOutputArray image,      //输出图像
                   InputArrayOfArrays contours, //全部发现的轮廓对象
                   int contourIdx,              //轮廓索引号
                   const Scalar& color,         //颜色
                   int thickness = 1,           //线宽
                   int lineType = LINE_8,       //线类型
                   InputArray hierarchy = noArray(), //拓扑结构图
                   int maxLevel = INT_MAX,     //最大层数,0绘制当前,1绘制当前及内嵌轮廓
                   Point offset = Point() );   //轮廓位移
void TestDemo::getContours(Mat& imgDil,Mat& img)
{
    vector<vector<Point>> contours;//轮廓数据 检测到的轮廓,每个轮廓都存储为点向量
    vector<Vec4i>hierarchy;//可选的输出向量(例如 std::vector<cv::Vec4i>),包含有关图像拓扑的信息

    findContours(imgDil,contours,hierarchy,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);

    for(int i=0;i<contours.size();i++)
    {
        double area = contourArea(contours[i]);//计算每个轮廓区域
        cout<<area<<endl;
        vector<vector<Point>>conPoly(contours.size());
        vector<Rect>boundRect(contours.size());
        string objectType;

        if(area>1000)//过滤噪声
        {
            //找轮廓的近似多边形或曲线
            double peri = arcLength(contours[i],true);
            approxPolyDP(contours[i],conPoly[i],0.02 * peri,true);

            cout<<conPoly[i].size()<<endl;
            boundRect[i] = boundingRect(conPoly[i]);//找每个近似曲线的最小上边界矩形

            int objCor = (int)conPoly[i].size();

            if(objCor == 3){objectType = "Tri";}
            if(objCor == 4){
                float aspRatio = (float)boundRect[i].width/boundRect[i].height;//宽高比
                cout << aspRatio <<endl;
                if(aspRatio > 0.95 && aspRatio <1.05){
                    objectType = "Square";
                }
                else{
                    objectType = "Rect";
                }
            }
            if(objCor >4 ){ objectType = "CirCle";}

            drawContours(img,conPoly,i,Scalar(255,0,255),2);//绘制滤除噪声后的所有轮廓
            rectangle(img,boundRect[i].tl(),boundRect[i].br(),Scalar(0,255,0),5);//绘制边界框
            putText(img,objectType,{ boundRect[i].x,boundRect[i].y - 5},FONT_HERSHEY_PLAIN,1,Scalar(0,69,255),1);
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

市场份额第一!博睿数据持续领跑中国APM市场

近日&#xff0c;全球领先的IT市场研究和咨询公司IDC发布《中国IT统一运维软件产品市场跟踪报告&#xff0c;2023H2》。报告显示&#xff0c;2023下半年博睿数据以 17.6%的市场份额蝉联 APM(应用性能监控)市场第一。2023年全年博睿数据以18.8%的市场份额持续领跑中国APM市场。 …

实现联系人前后端界面,实现分页查询04.15

实现联系人前后端界面&#xff0c;实现分页查询项目包-CSDN博客 项目结构 数据库中建立两个表&#xff1a; 完整的后端目录 建立联系人People表&#xff0c;分组Type表&#xff0c;实现对应实体类 根据需求在mapper中写对应的sql语句 查询所有&#xff0c;删除&#xff0c;添…

网工交换基础——Access、Trunk、Hybrid处理VLAN的过程

一、VLAN帧格式&#xff1a; 通过Tag区分不同VLAN。打tag/剥离tag都有交换机接口进行。 1.接收方向&#xff1a;不会进行tag的剥离/弹出&#xff08;永远不会剥离VLAN Tag&#xff09;。 2.交换机内部&#xff1a;处理的都是带Tag的数据帧。 交换机开机&#xff0c;默认生成树…

振弦式土压力计性能评估指南

振弦式土压力计是一种常用的岩土工程监测仪器&#xff0c;主要用于测量土体中各点的土压力变化。在长期的监测过程中&#xff0c;保持土压力计的性能稳定与准确至关重要。因此&#xff0c;定期检查和确定振弦式土压力计的性能是否正常成为了一项必要的工作。本文将详细介绍如何…

PHP-extract变量覆盖

[题目信息]&#xff1a; 题目名称题目难度PHP-extract变量覆盖1 [题目考点]&#xff1a; 变量覆盖指的是用我们自定义的参数值替换程序原有的变量值&#xff0c;一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击。 经常导致变量覆盖漏洞场景有&#xff1a;$$&#x…

【智能算法】花朵授粉算法(FPA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2012年&#xff0c;Yang等人受到自然界花朵授粉过程启发&#xff0c;提出了鸭群算法&#xff08;Flower Pollination Algorithm, FPA&#xff09;。 2.算法原理 2.1算法思想 FPA基于自然界花朵授…

Git 指令

一.常见命令 1.1 初始化仓库 #初始化仓库 git init #查看隐藏文件 ll -a #查看隐藏文件.git结构 tree .git/1.2 创建/删除用户信息 #创建用户信息 git config user.email "151859163.com" git config user.name "zsl" #查看 git config -l #删除用户信息…

水电预付费远程管理

1.概述&#xff1a;水电预付费远程管理的定义与重要性 水电预付费远程管理系统是一种先进的能源管理模式&#xff0c;它允许用户在使用水电资源前预先支付费用&#xff0c;并通过远程技术进行实时监控和管理。这种系统不仅提高了效率&#xff0c;减少了欠费风险&#xff0c;也…

【缓存常见问题】

在使用缓存时特别是在高并发场景下会遇到很多问题&#xff0c;常用的问题有缓存穿透、缓存击穿、缓存雪崩以及缓存一致性问题。 1、缓存穿透 首先&#xff0c;什么是缓存穿透呢&#xff1f; 缓存穿透是指请求一个不存在的数据&#xff0c;缓存层和数据库层都没有这个数据&…

VTK 动画:利用 Qt 的时间控制

VTK 动画&#xff1a;利用 Qt 的时间控制 VTK 动画&#xff1a;利用 Qt 的时间控制VS2022 QT6.2.3 VTK9.3.0 环境配置Qt 定时器类 QTimer实现运行结果参考 VTK 动画&#xff1a;利用 Qt 的时间控制 第一篇文章 《VTK 动画&#xff1a;框架、流程与实现》 讲到了 VTK 的动画框…

小行星碰撞

题目链接 小行星碰撞 题目描述 注意点 两个小行星相互碰撞&#xff0c;较小的小行星会爆炸如果两颗小行星大小相同&#xff0c;则两颗小行星都会爆炸每一颗小行星以相同的速度移动正负表示小行星的移动方向&#xff08;正表示向右移动&#xff0c;负表示向左移动&#xff09…

超净实验室用耐强酸碱耐高温PFA酸缸进口透明聚四氟塑料方槽

PFA清洗槽是四氟清洗桶后的升级款&#xff0c;主要用于半导体光伏光电等行业&#xff0c;一体成型&#xff0c;无需担心漏液&#xff0c;表面光滑无毛刺。 别名PFA浸泡桶、PFA酸缸、PFA方槽等&#xff0c;可定制尺寸&#xff0c;可配套盖子&#xff0c;盖子有PFA/PTFE两种材质…

如何寻找可靠的第三方软件检测机构

随着科技的飞速发展和数字化进程的加速&#xff0c;软件质量成为了企业竞争的关键。为了确保软件的质量和性能&#xff0c;许多企业选择寻找第三方的软件检测机构来进行软件的质量控制和评估。那么&#xff0c;如何找到一家可靠的第三方软件检测机构呢&#xff1f; 1.明确检测…

前段css中border-radius的简单使用

前段css中border-radius的使用 一、前言二、border-radius语法三、border-radius的模型例子1.源码12.源码1效果截图 四、border-radius的动画效果&#xff08;动态交互&#xff09;1.源码22.源码2显示效果 五、结语六、定位日期 一、前言 在CSS中&#xff0c;我们常用border-r…

AUS Global 与皇家贝蒂斯俱乐部在对战皇家马德里的比赛日举办现场体验活动

AUS Global 最近前往西班牙庆祝与皇家贝蒂斯的赞助合作&#xff0c;并获得了难忘的比赛日体验&#xff0c;包括在贵宾室中观看皇家贝蒂斯对阵皇家马德里的精彩比赛。 活动开始时&#xff0c;AUS Global 受邀来到皇家贝蒂斯主场贝尼托-比利亚马林体育场的独家 Showbox 贵宾室。…

微信小程序的支付功能,纯前端步骤,超级详细

1、首先在微信开放平台&#xff0c;申请移动应用并开通支付功能&#xff0c;申请应用后可以获取 AppID 和 AppSecret 值 2、在前端项目中的配置参数中打开支付功能 步骤&#xff1a;项目的根目录下有个manifest.json文件&#xff0c;打开并在左侧目录找到APP SDK配置&#xf…

AI实景无人直播自动卖卷系统,开创了实体商家直播自运营先河。

AI实景无人直播自动卖卷系统&#xff0c;开创了实体商家直播自运营先河。 从当下这一刻起&#xff0c;拒绝内耗&#xff0c;做行动的巨人。因为&#xff0c;命运不会偏袒任何人&#xff0c;却会眷顾一直朝着光亮前进的人。 《人民日报》 随着新媒体的快速发展&#xff0c;很…

【力扣】55. 跳跃游戏 - 力扣(LeetCode)

Problem: 55. 跳跃游戏 记录自己解答的思路和代码 文章目录 问题思路复杂度Code 问题 思路 这个题的主要思路就是先找到0对应的位置&#xff0c;然后标记起来对应left&#xff0c;如果只有一个零&#xff0c;只需要left后面的数中有>1的数就能跳过去&#xff0c;如果是00&a…

Jmeter 接口造10w条用户数据

1、将mysql-connector-java-5.1.22-bin.jar放到D:\apache-jmeter-5.5\lib\ext目录下 2、在测试计划中&#xff0c;添加mysql-connector-java-5.1.22-bin.jar包路径 3、添加-线程组-添加-配置元件-jdbc connection configuration 4、配置jdbc连接参数 设置变量名称&#xff1a;…

【火猫TV】LOL:沙特电竞世界杯奖金公布 奖金丰厚Faker成为最大赢家 !

北京时间4月18日&#xff0c;今年的电竞赛事可以说是缤纷多彩&#xff0c;在LOL项目上除了大家熟悉的各大赛区的联赛&#xff0c;拳头举办的MSI和世界赛&#xff0c;在今年还有一项新的赛事&#xff0c;那就是在MSI结束之后沙特将会举办一场电竞世界杯&#xff0c;此消息出来的…
最新文章