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

opencv复习

目录

1.core

1.图像变换

1.1 affine仿射变换

1.2 透视变换

2.四元数(旋转)

2.1 轴角转四元数

2.2 旋转矩阵转四元数

2.3 欧拉角转旋转矩阵

2.4 四元数转旋转矩阵

2.5 四元数用eigen用的比较多 

2. imgproc. Image Processing

2.1 bilateralFilter

2.2 blur均值滤波 

2.3  boxFilter()

2.4 buildPyramid() 

2.5 dilate,erode

 2.6 GaussianBlur()

2.7 medianBlur()

2.8 拉普拉斯算子(Laplacian)

2.9 morphologyDefaultBorderValue

 2.10 morphologyEx()

2.11 pyrMeanShiftFiltering

2.12 floodfill

 2.13 scharr

2.14 stackBlur()

2.15 adaptiveThreshold()

2.16 threshold、THRESH_OTSU

3.opencv图像分割

3.1自适应阈值

3.2固定阈值

3.3floodfill

3.4grabcut

4.一些其余的 

4.1直方图

4.2霍夫变换

4.3canny边缘检测


1.core

#include <opencv2/core/affine.hpp>

1.图像变换

1.1 affine仿射变换

该变换能保证图像的平直性和平行性,原来的直线仿射变换后还是直线,原来的平行线经过仿射变换之后还是平行线。

mat m = cv::getAffineTransforms(const point2f* src, const point* 2f dst);

 mat m = cv::getRotationMatrix2D((cols / 2, rows / 2), 45, 1)

图像真正的旋转指的是:

cv::warpAffine(src, dst, m, dst_sz);

C++ void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
       //参数InputArray src:输入变换前图像
        //参数OutputArray dst:输出变换后图像,需要初始化一个空矩阵用来保存结果,不用设定矩阵尺寸
        //参数InputArray M:变换矩阵,用另一个函数getAffineTransform()计算
        //参数Size dsize:设置输出图像大小
        //参数int flags = INTER_LINEAR:设置插值方式,默认方式为线性插值
        //参数int borderMode=BORDER_CONSTANT:边界像素模式,默认值BORDER_CONSTANT
        //参数const Scalar& borderValue=Scalar(),在恒定边界情况下取的值,默认值为Scalar(),即0 

 仿射变换是一种二维坐标到二维坐标之间的线性变换,它保持了二维图形的平直性(直线经过变换之后依然是直线)和平行性(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。

任意的仿射变换都能表示为乘一个矩阵(线性变换),再加上一个向量(平移)的形式。

//demo
//仿射变换—平移,旋转,缩放,翻转,错切#include "stdafx.h"
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>using namespace cv;
using namespace std;int main(int argc, char* argv) {Mat src, dst;src = imread("C:/Users/59235/Desktop/image/girl5.jpg");if (!src.data) {printf("could not load image...\n");return -1;}namedWindow("original image", CV_WINDOW_AUTOSIZE);imshow("original image", src);Mat dst_warp, dst_warpRotateScale, dst_warpTransformation, dst_warpFlip;Point2f srcPoints[3];//原图中的三点 ,一个包含三维点(x,y)的数组,其中x、y是浮点型数Point2f dstPoints[3];//目标图中的三点  //第一种仿射变换的调用方式:三点法//三个点对的值,上面也说了,只要知道你想要变换后图的三个点的坐标,就可以实现仿射变换  srcPoints[0] = Point2f(0, 0);srcPoints[1] = Point2f(0, src.rows);srcPoints[2] = Point2f(src.cols, 0);//映射后的三个坐标值dstPoints[0] = Point2f(0, src.rows*0.3);dstPoints[1] = Point2f(src.cols*0.25, src.rows*0.75);dstPoints[2] = Point2f(src.cols*0.75, src.rows*0.25);Mat M1 = getAffineTransform(srcPoints, dstPoints);//由三个点对计算变换矩阵  warpAffine(src, dst_warp, M1, src.size());//仿射变换  //第二种仿射变换的调用方式:直接指定角度和比例                                          //旋转加缩放  Point2f center(src.cols / 2, src.rows / 2);//旋转中心  double angle = 45;//逆时针旋转45度  double scale = 0.5;//缩放比例  Mat M2 = getRotationMatrix2D(center, angle, scale);//计算旋转加缩放的变换矩阵  warpAffine(src, dst_warpRotateScale, M2, Size(src.cols, src.rows), INTER_LINEAR);//仿射变换//仿射变换—平移Point2f srcPoints1[3];Point2f dstPoints1[3];srcPoints1[0] = Point2i(0, 0);srcPoints1[1] = Point2i(0, src.rows);srcPoints1[2] = Point2i(src.cols, 0);dstPoints1[0] = Point2i(src.cols / 3, 0);dstPoints1[1] = Point2i(src.cols / 3, src.rows);dstPoints1[2] = Point2i(src.cols + src.cols / 3, 0);Mat M3 = getAffineTransform(srcPoints1, dstPoints1);warpAffine(src, dst_warpTransformation, M3, Size(src.cols + src.cols / 3, src.rows));//仿射变换—翻转、镜像Point2f srcPoints2[3];Point2f dstPoints2[3];srcPoints2[0] = Point2i(0, 0);srcPoints2[1] = Point2i(0, src.rows);srcPoints2[2] = Point2i(src.cols, 0);dstPoints2[0] = Point2i(src.cols, 0);dstPoints2[1] = Point2i(src.cols, src.rows);dstPoints2[2] = Point2i(0, 0);Mat M4 = getAffineTransform(srcPoints2, dstPoints2);warpAffine(src, dst_warpFlip, M4, Size(src.cols, src.rows));//flip(src, dst_warpFlip, 1);//  flipCode:= 0 图像向下翻转//> 0 图像向右翻转//< 0 图像同时向下向右翻转imshow("affine transformation1(三点法)", dst_warp);imshow("affine transfoemation2(指定比例和角度)", dst_warpRotateScale);imshow("affine transfoemation3(仿射变换平移)", dst_warpTransformation);imshow("affine transformation4(仿射变换镜像)", dst_warpFlip);waitKey(0);return 0;
}

1.2 透视变换

# 设取原图上的四个点组成矩阵points1,变换后的四个点组成的矩阵points2
# mat_perspective = cv.getPerspectiveTransform(points1, points2)
# image_perspective = cv.warpPerspective(image_original, mat_perspective, (image_original.shape[1], image_original.shape[0]))

cv.imshow("image_perspective", image_perspective)

平面的单应性被定义为从一个平面到另一个平面的投影映射。 二维平面上的点映射到摄像机成像画面上的映射,就是平面单应性的典型例子。

  • cv::findHomography:计算单应性矩阵

findHomography的method参数用于选择计算单应性矩阵的算法。

cv::RANSAC:随机抽样方法( random sampling with consensus),随机选择所提供点的子集,并计算一个同源矩阵。RANSAC算法计算许多这样的随机抽样,并保留具有最大部分的抽样。该方法在实际应用中在拒绝噪声离群数据和寻找正确答案方面非常有效
cv::LMEDS:最小二乘中位数(least median of squares method),顾名思义,LMeDS背后的想法是最小化中值误差,而不是用默认方法基本上最小化的均方误差。这种方法的缺点是,只有当插入器至少构成数据点的大多数时,它才能表现良好。相比之下,RANSAC可以正常工作,并在给出几乎任何信噪比时给出令人满意的答案。
cv::RHO:RHO算法,在OpenCV3中使用,它基于一种被称为PROSAC的“加权”RANSAC修改,在许多异常值的情况下运行得更快。

在没有相机标定参数的情况下,可以利用物理平面和像平面中的四个对应点

需要一个3x3的变换矩阵。
为了得到视角变换(透视变换)矩阵,需要在输入图像上找四个点,以及在输出图像上对应的位置。这四个点中的任意三个都不能共线。
然后函数cv2.getPerspectiveTransform()创建一个3x3的矩阵,即为透视变换矩阵。
最后将矩阵传入函数cv2.warpPerspective对图像进行透视变换。
透视变换是二维到三维,再到另一个二维视平面的映射。

2.四元数(旋转)

旋转的表示转换与实现 - Hyaline-w - 博客园

#include <opencv2/calib3d.hpp>

2.1 轴角转四元数

2.2 旋转矩阵转四元数

2.3 欧拉角转旋转矩阵

2.4 四元数转旋转矩阵

2.5 四元数用eigen用的比较多 

Eigen::Quaterniond q1(w, x, y, z);// 第一种方式
 
Eigen::Quaterniond q2(Vector4d(x, y, z, w));// 第二种方式
 
Eigen::Quaterniond q2(Matrix3d(R));// 第三种方式

2.5.2 左乘右乘 

对于矩阵表示,在左乘时候,实际上是对坐标(或者说对偶空间上的元素)进行变换,表现为原空间基向量不变,变换本身发生了变换。

而右乘是对原空间基向量进行变换,表现为坐标(对偶空间上的元素)不变,原空间基向量发生改变。

基于固定坐标系的旋转变换左乘旋转矩阵,基于自身坐标系的旋转变换右乘旋转矩阵。

2. imgproc. Image Processing

OpenCV: Image Filtering

RGB就是3通道,颜色表示最大为255,所以可以用CV_8UC3这个数据类型来表示;灰度图就是C1,只有一个通道;而带alph通道的PNG图像就是C4,是4通道图片。

2.1 bilateralFilter

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

1. d是在滤波时选取的空间距离参数,这里表示以当前像素点为中心点的直径。如果该值为非正数,则会自动从参数 sigmaSpace 计算得到。如果滤波空间较大(d>5),则速度较慢。因此,在实时应用中,推荐d=5。对于较大噪声的离线滤波,可以选择d=9。

 2. sigmaColor是滤波处理时选取的颜色差值范围,该值决定了周围哪些像素点能够参与到滤波中来。与当前像素点的像素值差值小于 sigmaColor 的像素点,能够参与到当前的滤波中。该值越大,就说明周围有越多的像素点可以参与到运算中。该值为0时,滤波失去意义;该值为255时,指定直径内的所有点都能够参与运算。

 3. sigmaSpace是坐标空间中的sigma值。它的值越大,说明有越多的点能够参与到滤波计算中来。当d>0时,无论sigmaSpace的值如何,d都指定邻域大小;否则,d与 sigmaSpace的值成比例。

4. borderType是边界样式,该值决定了以何种方式处理边界。一般情况下,不需要考虑该值,直接采用默认值即可。

2.2 blur均值滤波 

 void blur( InputArray src, OutputArray dst,
            Size ksize, Point anchor = Point(-1,-1),
            int borderType = BORDER_DEFAULT );

1.ksize是滤波核的大小。滤波核大小是指在均值处理过程中,其邻域图像的高度和宽度。

2.anchor 是锚点,其默认值是(-1,-1),表示当前计算均值的点位于核的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。

3..borderType是边界样式,该值决定了以何种方式处理边界。一般情况下不需要考虑该值的取值,直接采用默认值即可。                      

通常情况下,使用均值滤波函数时,对于锚点anchor和边界样式borderType,直接采用其默认值即可。因此,函数cv2.blur()的一般形式为:

2.3  boxFilter()

OpenCV还提供了方框滤波方式,与均值滤波的不同在于,方框滤波不会计算像素均 值。在均值滤波中,滤波结果的像素值是任意一个点的邻域平均值,等于各邻域像素值之 和除以邻域面积。而在方框滤波中,可以自由选择是否对均值滤波的结果进行归一化,即 可以自由选择滤波结果是邻域像素值之和的平均值,还是邻域像素值之和。

2.4 buildPyramid() 

void cv::buildPyramid    
(
    InputArray     src,
    OutputArrayOfArrays     dst,//目的地向量,包含 maxlevel + 1 个与 src 同类型的图像。dst[0] 将与 src 相同。dst[1] 是金字塔的下一层,它是 src 的平滑和缩小版,依此类推。
    int     maxlevel,//最后一层(最小的一层)金字塔的 0 基索引。必须是非负数。
    int     borderType = BORDER_DEFAULT 
)    

pyrUp( tmp, dst, Size( tmp.cols*2, tmp.rows*2 )
pyrDown( tmp, dst, Size( tmp.cols/2, tmp.rows/2 )

2.5 dilate,erode

 膨胀就是求局部最大值的操作,从图像直观看来,就是将图像光亮部分放大,黑暗部分缩小。

OpenCV 图像处理之膨胀与腐蚀 - 知乎

//demo#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{// 读取图像Mat image = imread("your_image.jpg", IMREAD_GRAYSCALE);if (image.empty()){cout << "Could not open or find the image" << endl;return -1;}// 定义核Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));// 膨胀操作,有1全1Mat dilatedImage;dilate(image, dilatedImage, kernel);// 腐蚀操作,有0全0Mat erodedImage;erode(image, erodedImage, kernel);// 显示结果imshow("Original Image", image);imshow("Dilated Image", dilatedImage);imshow("Eroded Image", erodedImage);waitKey(0);return 0;
}

 2.6 GaussianBlur()

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main() {// 读取图像Mat image = imread("your_image.jpg");if (image.empty()) {cout << "Could not open or find the image" << endl;return -1;}// 进行高斯滤波Mat blurredImage;GaussianBlur(image, blurredImage, Size(5, 5), 1.5);// 显示原始图像和滤波后的图像imshow("Original Image", image);imshow("Blurred Image", blurredImage);waitKey(0);return 0;
}

2.7 medianBlur()

void medianBlur(InputArray src, OutputArray dst, int ksize)//像素点邻域灰度值的中值来代替该像素点的灰度值

2.8 拉普拉斯算子(Laplacian)

通过模板可以发现,当邻域内像素灰度相同时,模板的卷积运算结果为0;当中心像素灰度高于邻域内其他像素的平均灰度时,模板的卷积运算结果为正数;当中心像素的灰度低于邻域内其他像素的平均灰度时,模板的卷积的负数。对卷积运算的结果用适当的衰弱因子处理并加在原中心像素上,就可以实现图像的锐化处理。

//demo
#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main() {// 读取图像Mat image = imread("your_image.jpg");if (image.empty()) {cout << "Could not open or find the image" << endl;return -1;}// 转换为灰度图像Mat grayImage;cvtColor(image, grayImage, COLOR_BGR2GRAY);// 应用拉普拉斯算子Mat laplacianImage;Laplacian(grayImage, laplacianImage, CV_16S, 3);// 对结果进行绝对值处理并转换为 8 位图像convertScaleAbs(laplacianImage, laplacianImage);// 显示结果imshow("Original Image", image);imshow("Laplacian Image", laplacianImage);waitKey(0);return 0;
}

2.9 morphologyDefaultBorderValue

morphologyDefaultBorderValue()

int main()
{Mat image, image_gray, image_bw, image_bw2, image_bw3;   //定义输入图像,灰度图像,二值图像image = imread("开运算闭运算.png");  //读取图像;if (image.empty()){cout << "读取错误" << endl;return -1;}//转换为灰度图像cvtColor(image, image_gray, COLOR_BGR2GRAY);//转换为二值图threshold(image_gray, image_bw, 120, 255, 1); //通过0,1调节二值图像背景颜色cv::imshow("image_bw", image_bw);//构造结构元Mat kernel = getStructuringElement(0, Size(5, 5));//腐蚀morphologyEx(image_bw, image_bw2, 0, kernel);cv::imshow("image_bw2", image_bw2);//膨胀morphologyEx(image_bw, image_bw3, 1, kernel);cv::imshow("image_bw3", image_bw3);cv::waitKey(0);  //暂停,保持图像显示,等待按键结束return 0;
}

 2.10 morphologyEx()

cv2.morphologyEx()实现开运算,闭运算,礼帽与黑帽操作以及梯度运算

2.11 pyrMeanShiftFiltering

Opencv均值漂移pyrMeanShiftFiltering彩色图像分割流程剖析_opencv pyrmeanshiftfiltering-CSDN博客

2.12 floodfill

 图像分割中的漫水填充(Flood Fill)算法是一种基于区域增长的像素分类方法。其原理是在图像中从种子点开始,逐渐向周围扩展,并根据一定的条件决定是否将相邻的像素归属于同一区域。

漫水填充的基本原理如下:

  • 选择种子点。
  • 以种子点为中心,判断4邻域或者8邻域的像素值与种子点像素值的差值,将差值小于阈值的像素点添加进区域内。
  • 将新加入的像素点作为新的种子点,反复执行Step2,直到没有新的像素点被添加进该区域。 
void floodFill_f(Mat mat){// 如果是四通道图像,则要把四通道图像转换成三通道Mat image;cv::cvtColor(mat, image, cv::COLOR_BGRA2BGR);RNG rng(10086);//随机数,用于随机生成像素//设置操作标志flagsint connectivity=4;//连接领域方式int  maskVal=255;//掩码图像的数值int  flags=connectivity|(maskVal<<8)|FLOODFILL_FIXED_RANGE;//漫水填充操作方式标志Rect rect;                     // 输出的填充区域//设置与选中像素点的差值Scalar loDiff=Scalar (20,20,20);Scalar upDiff=Scalar (20,20,20);//声明掩摸矩阵变量Mat mask=Mat::zeros(image.rows+2,image.cols+2,CV_8UC1);ostringstream ss;for(int i=0;i<20;i++){//随机产生图像中某一像素值int py=rng.uniform(0,image.rows-1);int px=rng.uniform(0,image.cols-1);Point point=Point (px,py);//彩色图像中填充的像素值Scalar newVal=Scalar (rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255));//浸水填充函数int area= floodFill(image,mask,point,newVal,&rect,loDiff,upDiff,flags);//输出像素点和填充的像素数目ss<<"像素点x:"<<point.x<<"   y:"<<point.y<<"   填充像素数目"<<area<<endl;}LOGD("%s",ss.str().c_str());//输出填充的图像结果imwrite("/sdcard/DCIM/img.png",image);imwrite("/sdcard/DCIM/mask.png",mask);
}

 2.13 scharr

Sobel 算子和 Scharr 算子都是用于图像处理中边缘检测的梯度算子,但它们有以下一些区别:

  1. 模板系数:Sobel 算子的模板系数相对较小,而 Scharr 算子的模板系数更大,这使得 Scharr 算子对边缘的检测更敏感,能够检测到更细微的边缘变化。

  2. 精度:Scharr 算子在计算梯度时具有更高的精度,尤其在检测水平和垂直方向的边缘时。

  3. 噪声敏感度:由于 Scharr 算子的敏感性更高,它对噪声也可能更敏感。相比之下,Sobel 算子在一定程度上对噪声更具鲁棒性。

  4. 计算复杂度:Scharr 算子由于模板系数较大,计算复杂度相对较高。

2.14 stackBlur()

 高斯模糊的耗时会随着kernel size的增大而增大,对于StackBlur和BoxBlur,其并不会随着kernel size增大而耗时增加。这是为什么?

2.15 adaptiveThreshold()

2.16 threshold、THRESH_OTSU

3.opencv图像分割

3.1自适应阈值

3.2固定阈值

3.3floodfill

3.4grabcut

OpenCV提供了一种流行的图像分割算法——GrabCut算法的实现。GrabCut是一种复杂且计算量大的算法,但它通常会得到非常准确的结果。该算法特别适合提取图像中的前景对象,例如,将目标对象从一张图片剪切并粘贴到另一张图片中。

2.图像分割实战

cv::grabCut函数的使用方法非常简单,只需要输入一个图像并将其中的一些像素标记为属于背景或前景。基于这些标记,算法可以分割图像的前景/背景。

4.一些其余的 

4.1直方图

直方图均衡化特别适用于背景和前景都被良好照亮的图像。但是,如果图像包含高对比度区域,则结果可能不理想,因为它会增加背景噪声的对比度并减少有用信号的对比度。

4.2霍夫变换

霍夫变换常用来提取图像中的直线和圆等几何形状。它通过一种投票算法检测具有特定形状的物体。该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果。

针对每个像素点,使得theta从-90度到180度,使用极坐标p = xcos(theta) + ysin(theta) 计算得到共270组(p,theta)代表着霍夫空间的270条直线。将这270组值存储到H中。

如果一组点共线,则这组点中的每个值,都会使得H(p,theta)加1。

因此找到H(p,theta)值最大的直线,就是共线的点最多的直线,H(p,theta)值次大的,是共线点次多的直线。可以根据一定的阈值,将比较明显的线全部找出来

4.3canny边缘检测

图像降噪。我们知道梯度算子可以用于增强图像,本质上是通过增强边缘轮廓来实现的,也就是说是可以检测到边缘的。但是,它们受噪声的影响都很大。那么,我们第一步就是想到要先去除噪声,因为噪声就是灰度变化很大的地方,所以容易被识别为伪边缘。

计算图像梯度,得到可能边缘。计算图像梯度能够得到图像的边缘,因为梯度是灰度变化明显的地方,而边缘也是灰度变化明显的地方。当然这一步只能得到可能的边缘。因为灰度变化的地方可能是边缘,也可能不是边缘。这一步就有了所有可能是边缘的集合。

非极大值抑制。通常灰度变化的地方都比较集中,将局部范围内的梯度方向上,灰度变化最大的保留下来,其它的不保留,这样可以剔除掉一大部分的点。将有多个像素宽的边缘变成一个单像素宽的边缘。即“胖边缘”变成“瘦边缘”。

双阈值筛选。通过非极大值抑制后,仍然有很多的可能边缘点,进一步的设置一个双阈值,即低阈值(low),高阈值(high)。灰度变化大于high的,设置为强边缘像素,低于low的,剔除。在low和high之间的设置为弱边缘。进一步判断,如果其领域内有强边缘像素,保留,如果没有,剔除。

相关文章:

opencv复习

目录 1.core 1.图像变换 1.1 affine仿射变换 1.2 透视变换 2.四元数&#xff08;旋转&#xff09; 2.1 轴角转四元数 2.2 旋转矩阵转四元数 2.3 欧拉角转旋转矩阵 2.4 四元数转旋转矩阵 2.5 四元数用eigen用的比较多 2. imgproc. Image Processing 2.1 bilateralF…...

【Unity高级】在编辑器中如何让物体围绕一个点旋转固定角度

本文介绍如何在编辑器里让物体围绕一个点旋转固定角度&#xff0c;比如上图里的Cube是围绕白色圆盘的中心旋转45度的。 目标&#xff1a; 创建一个在 Unity 编辑器中使用的旋转工具&#xff0c;使开发者能够在编辑模式下快速旋转一个物体。 实现思路&#xff1a; 编辑模式下…...

通过IP远程连接MySQL服务时不允许连接到这个MySQL服务器

当你在连接Mysql时报这个错误时 is not allowed to connect to this MySQL server&#xff0c;意思是 MySQL 服务器不允许来自 IP 地址的连接。这通常是由于 MySQL 服务器的访问控制列表&#xff08;ACL&#xff09;限制了特定主机的连接。 要解决这个问题&#xff0c;你需要授…...

试题转excel;pdf转excel;试卷转Excel,word试题转excel

一、问题描述 一名教师朋友&#xff0c;偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运&#xff0c;几百道题几乎需要一个下午的时间 关键这些事&#xff0c;枯燥无聊费眼睛&#xff0c;实在是看起来就很蠢的工作 就想着做一个工具&#xff0c;可以自动处理…...

wordpress网站使用Linux宝塔面板和SQL命令行导入导出超过50M限制的数据库

wordpress网站使用Linux宝塔面板添加mysql数据库&#xff0c;使用phpMyAdmin工具导入sql数据库文件&#xff0c;会有最大限制50M。即使把sql数据库文件压缩为gzip或zip压缩包&#xff0c;压缩包也超过50M&#xff0c;该怎么办&#xff1f;怎样导入超过50M数据库呢&#xff1f; …...

VCP-CLIP A visual context prompting modelfor zero-shot anomaly segmentation

GitHub - xiaozhen228/VCP-CLIP: (ECCV 2024) VCP-CLIP: A visual context prompting model for zero-shot anomaly segmentation 需要构建正样本&#xff0c;异常样本&#xff0c;以及对应的Mask...

【原生js案例】webApp实现鼠标移入移出相册放大缩小动画

图片相册这种动画效果也很常见&#xff0c;在我们的网站上。鼠标滑入放大图片&#xff0c;滑出就恢复原来的大小。现在我们使用运动定时器来实现这种滑动效果。 感兴趣的可以关注下我的系列课程【webApp之h5端实战】&#xff0c;里面有大量的css3动画效果制作原生知识分析&…...

杂谈随笔-关于unity开发游戏

最近有在做unity的游戏开发&#xff0c;都是自学&#xff0c;甚至没有完整的课程体系…… 在犹豫要不要出系列教程&#xff0c;帮助新手快速入门的同时算是巩固一下基础知识。 那这篇文章先谈谈我对于引擎开发游戏的一些小观点&#xff0c;算是做了这么十几个星期的微不足道的…...

base64转file文件对象

1.base64转file文件对象 //将base64转换为文件 dataURLtoFile(dataurl, filename) { var arr dataurl.split(,),mime arr[0].match(/:(.*?);/)[1],bstr atob(arr[1]),n bstr.length,u8arr new Uint8Array(n);while (n--) {u8arr[n] bstr.charCodeAt(n);}return new Fil…...

【jvm】为什么要有GC

目录 1. 自动内存管理2. 提升程序稳定性3. 优化性能4. 跨平台能力5. 分代回收策略 1. 自动内存管理 1.JVM中的GC机制负责自动管理内存&#xff0c;这意味着开发人员不需要手动分配和释放内存。2.这一特性大大简化了Java程序的内存管理&#xff0c;降低了内存泄漏和内存溢出等问…...

开发指南085-大号版elementUI

ElementUI有些地方显示实在太小&#xff0c;不方便操作&#xff0c;需要放大&#xff1a; 1、el-dialog的标题栏那个关闭符号 使用如下方法放大 ::v-deep .el-dialog__headerbtn { font-size: 40px; font-weight: 700; top: 0px; } 2、el-table-column 设置sor…...

#渗透测试#红蓝对抗#SRC漏洞挖掘# Yakit(5)进阶模式-MITM中间人代理与劫持(下)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

使用WebStorm开发Vue3项目

记录一下使用WebStorm开发Vu3项目时的配置 现在WebStorm可以个人免费使用啦&#xff01;?? 基本配置 打包工具&#xff1a;Vite 前端框架&#xff1a;ElementPlus 开发语言&#xff1a;Vue3、TypeScript、Sass 代码检查&#xff1a;ESLint、Prettier IDE&#xff1a;WebSt…...

Mac 录制电脑系统内的声音的具体方法?

1.第一步&#xff1a;下载BlackHole 软件 方式1&#xff1a;BlackHole官方下载地址 方式2&#xff1a; 百度云下载 提取码: n5dp 2.第二步&#xff1a;安装BlackHole 双击下载好的BlackHole安装包&#xff0c;安装默认提示安装。 3.第三步&#xff1a;在应用程序中找到音频…...

计算机网络

1.网络协议是什么&#xff1f; 在计算机网络要做到有条不紊地交换数据&#xff0c;就必须遵守一些约定好的规则&#xff0c;比如交换数据地格式&#xff0c;是否需要发送一个应答信息。这些规则被称为网络协议。 分层结构 应用层&#xff1a;为计算机用户提供服务表示层&…...

爬取某市KFC餐厅信息(POST请求+PYMYSQL)

# 简介 本教程将指导您如何使用Python爬取石家庄市的KFC门店信息&#xff0c;并将这些信息存储到MySQL数据库中。我们将使用requests库来发送网络请求&#xff0c;pymysql库来操作MySQL数据库。 环境准备 在开始之前&#xff0c;请确保您已经安装了以下Python库&#xff1a…...

109.【C语言】数据结构之二叉树层序遍历

目录 1.知识回顾 2.代码实现 准备工作 LevelOrder函数 代码框架 关键代码 3.执行结果 1.知识回顾 层序遍历参见106.【C语言】数据结构之二叉树的三种递归遍历方式文章 截取的部分内容 定义:按层的方式遍历(,设n为树的深度,h1-->h2-->h3-->...-->hn) 以下面…...

Java转C之内存管理

从 Java 转向 C 语言开发&#xff0c;内存管理和指针是两个核心且关键的概念。这些概念在 Java 中被抽象和自动化处理&#xff0c;而在 C 语言中则需要开发者手动管理和操作。 目录 内存管理概述指针基础 指针的定义与初始化地址运算符 & 和解引用运算符 *指针运算 动态内…...

共享内存和信号量

一、共享内存原理 1、基础前提 共享内存是为了进程之间通信服务的。进程间的通信的核心是要让两个不同的进程看到同一份资源。之前的匿名管道通过父子进程继承的关系&#xff0c;让父子进程看到同一份资源&#xff0c;进而进行通信&#xff1b;命名管道则是通过唯一的路径让两…...

SED命令

基本用法&#xff1a; sed命令具体应用&#xff1a; 1.删除第2-5行 nl regular_express.txt | sed 2d结果&#xff1a; 2.在第二行之后新增两行&#xff0c;分别为"drink tea…" 和"drink beer?" nl regular_express.txt | sed 2 a\ drink tea...\…...

洛谷 P6368 [COCI2006-2007#6] MAGIJA C语言

题目&#xff1a;https://www.luogu.com.cn/problem/P6368 题目背景 知名魔术师 AlDimi Kartimi 需要你帮助他来设计他扑克牌的背面图案。 题目描述 众所周知&#xff0c;扑克牌的背面是一个矩形&#xff0c;通过做两边的中垂线可以将矩形分成相等的四部分。 AlDimi Karti…...

TDesign:Picker 选择器

Picker 选择器 API文档地址 单列选择器用法 /// view onTap:(){TDPicker.showMultiPicker(context,data: [controller.coinList],title: ,rightTextStyle: TextStyle(color: AppColors.ColorMain),onConfirm: (selected) {controller.onTapCoin(selected);Navigator.of(contex…...

LLMs之Agent之Lares:Lares的简介、安装和使用方法、案例应用之详细攻略

LLMs之Agent之Lares&#xff1a;Lares的简介、安装和使用方法、案例应用之详细攻略 导读&#xff1a;这篇博文介绍了 Lares&#xff0c;一个由简单的 AI 代理驱动的智能家居助手模拟器&#xff0c;它展现出令人惊讶的解决问题能力。 >> 背景痛点&#xff1a;每天都有新的…...

实验3-实时数据流处理-Flink

1.前期准备 &#xff08;1&#xff09;Flink基础环境安装 参考文章&#xff1a; 利用docker-compose来搭建flink集群-CSDN博客 显示为这样就成功了 &#xff08;2&#xff09;把docker&#xff0c;docker-compose&#xff0c;kafka集群安装配置好 参考文章&#xff1a; …...

axios笔记

一、axios是什么 前端最流行的ajax请求库 二、json-server json-server可以帮助我们搭建http服务 为什么要搭建http服务&#xff1f; &#xff1a;是因为我们用axios的时候&#xff0c;需要向服务端发送请求 我们需要服务端这样一个角色&#xff0c;来与axios结合做实践 1.…...

python拆分Excel文件

按Sheet拆分Excel 或 按照某一列的不同值拆分Excel。文档样式如下&#xff1a; 结果&#xff1a;红色是按照Sheet名拆出的&#xff0c;蓝色和橙色是某个Sheet按照某列的不同值拆分的。 代码&#xff1a; # -*- coding: utf-8 -*- """ 拆分excel文件——按照…...

使用IntelliJ IDEA开发Gradle插件并发布到本地

博主所用软件版本为&#xff1a; IntelliJ IDEA 2024.1.4 (Community Edition) Android Studio Ladybug Feature Drop | 2024.2.2 Beta 1 1、制作gradle插件&#xff08;IntelliJ IDEA 2024.1.4&#xff09; 新建groovy工程&#xff0c;File–>New–>Project… 右键点…...

C# 通过smtp发送邮件(配置好了参数可以直接用)

可以直接用 using System; using System.Net; using System.Net.Mail;class EmailSender {// 发送邮件的函数&#xff0c;接收SMTP配置作为参数public static void SendEmail(string smtpServer, int smtpPort, string senderEmail, string senderPassword, string subject, s…...

【数据结构】栈和队列

目录 1.栈 1.1.栈的概念及结构 1.2.栈的实现 2.队列 2.1.队列的概念及结构 2.2.队列的实现 3.运用栈理解一道题 4.使用两个队列实现一个栈 1.栈 1.1.栈的概念及结构 首先&#xff0c;我们来了解一种新的数据结构——栈。栈是一种特殊的线性表&#xff0c;其只允许在固…...

使用 Spring Doc 为 Spring REST API 生成 OpenAPI 3.0 文档

Spring Boot 3 整合 springdoc-openapi 概述 springdoc-openapi 是一个用于自动生成 OpenAPI 3.0 文档的库&#xff0c;它支持与 Spring Boot 无缝集成。通过这个库&#xff0c;你可以轻松地生成和展示 RESTful API 的文档&#xff0c;并且可以使用 Swagger UI 或 ReDoc 进行…...

网络数据库安全和数据安全概述

1、数据安全的三要素 完整性&#xff0c;机密性&#xff0c;可用性 2、安全技术和措施 数据完整性技术、数据备份和恢复技术、数据加密技术、访问控制技术、用户管理和身份验证技术 3、数据库安全 数据库安全是指数据库的任何部分都不允许受到侵害&#xff0c;或未经授权的…...

STM32F10X与GD32工程创建区别

1.宏定义区别 GD32虽然与STM32F10X的管脚兼容&#xff0c;但是用keil创建工程时&#xff0c;GD32在选择芯片型号的时候就已经自己定义了宏。STM32F10x需要手动定义宏。在以下界面定义用到的单片机。 2.时钟区别。GD32最大时钟为120Mhz,所用的hal库里面的系统初始化会初始化时钟…...

cmakelist使用总结

支持能编译成在不同系统上运行程序的方法 我们代码就一份&#xff0c;但有时需要编译成arm32&#xff0c;有时需要编译成x86_64,或更多 1、首先先将代码定义一个名称&#xff1a; #将所有的源文件列为一个集合&#xff0c;集合名字叫做SRC_LISTS set(SRC_LISTS main.cpp A.cpp…...

【论文阅读】国际开源发展经验及其对我国开源创新体系建设的启示

作者&#xff1a;包云岗老师 包云岗老师是计算机体系结构方向的大牛&#xff0c;推动了体系结构方面的开源事业! 欢迎对本栏目感兴趣的人学习"一生一芯"~ 学习体会&#xff1a; 承接前文&#xff0c;唐志敏老师讲到已有的软硬件生态系统和开发成本制约了对新结构的探…...

React 初学者指南:从零开始构建第一个 React 应用

React 是一个用于构建用户界面的 JavaScript 库&#xff0c;它能够让我们高效地构建复杂的 UI。对于 React 初学者来说&#xff0c;最重要的就是理解它的基本概念以及如何开始使用它。本文将引导你从零开始构建你的第一个 React 应用 1.1. 安装 React 环境 首先&#xff0c…...

力扣93题:复原 IP 地址

力扣93题&#xff1a;复原 IP 地址&#xff08;C语言实现详解&#xff09; 题目描述 给定一个只包含数字的字符串 s&#xff0c;复原它并返回所有可能的 IP 地址格式。 有效的 IP 地址需满足以下条件&#xff1a; IP 地址由四个整数&#xff08;每个整数位于 0 到 255 之间…...

字符编码发展历史

文章目录 发展历史- ASCII- ISO-8859- Unicode- UTF系列- UTF-8- UTF-16- UTF-32 - 中文编码- GB2312- GBK- GB18030 - 其他编码 归纳总结 发展历史 计算机的基础是二进制数字&#xff08;0和1&#xff09;。虽然人类日常使用的是各种字符&#xff08;如字母、数字、符号等&am…...

aws codepipeline + github + sonarqube + jenkins实践CI/CD

https://blog.csdn.net/u011564831/article/details/144007981文章浏览阅读1.2k次&#xff0c;点赞31次&#xff0c;收藏21次。本文使用 Jenkins 结合 CodeBuild, CodeDeploy 实现 Serverless 的 CI/CD 工作流&#xff0c;用于自动化发布已经部署 lambda 函数。在 AWS 海外区&a…...

KNN_识别图片数字

1.实验过程省略灰度化处理过程&#xff0c;用已经处理好的txt数据进行训练 3.jpg from PIL import Image def imgtotxt(imgfile,txtfile,size (32,32)):image_file Image.open(imgfile).resize(size,Image.LANCZOS).convert(L)width,height image_file.sizef open(txtfile,…...

python 清华pip镜像源报HTTP error 403

报错信息 ERROR: HTTP error 403 while getting https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/52/79/a64937a2185b91a96cc5406e3ea58120980c725543d047e112fb3084a972/fake_useragent-2.0.0-py3-none-any.whl (from https://mirrors.tuna.tsinghua.edu.cn/pypi/we…...

HTTP 网络技术学习:缓存;为什么有时候出现问题要清除浏览器缓存?客户端缓存和服务端缓存是什么。

目录&#xff1a; 问题的背景Http的缓存是什么客户端设置缓存&#xff0c;需要服务端允许&#xff1f;缓存分类&#xff1a;为什么会有客户端缓存和服务器端缓存&#xff1f;客户端缓存的参数设置&#xff0c;举例代码实现缓存 一、问题的背景 有时候网站出现问题&#xff0…...

极限科技三周年庆典:追求极致,共创未来科技新篇章

2024 年 12 月 3 日&#xff0c;一场盛大的庆典活动在香港 IFS 集团旗下长沙玛珂酒店璀璨启幕&#xff0c;极限科技迎来了其三周年的辉煌庆典。此次庆典不仅是对极限科技过往成就的回顾与庆祝&#xff0c;更是对未来科技梦想的展望并开始新的启航。 庆典现场&#xff0c;极限科…...

利用PHP和GD库实现图片拼接的方法

利用PHP和GD库实现图片拼接的方法主要涉及到加载图片资源、创建目标画布、将图片资源绘制到目标画布上&#xff0c;并最终输出或保存拼接后的图片。以下是实现图片拼接的基本步骤&#xff1a; 加载图片资源&#xff1a; 使用imagecreatefromjpeg()、imagecreatefrompng()或ima…...

SpringBoot自动配置底层核心源码

SpringBoot底层核心源码 一、工程创建二、进一步改造三、自动配置 探究SpringBoot的自动配置原理&#xff0c;我们可以自己写一个启动类的注解。 一、工程创建 首先创建一个工程&#xff0c;工程目录如下&#xff1a; 自定义一个启动函数&#xff1a; package org.springboo…...

故障识别 | GADF-CNN-SSA-XGBoost数据分类预测/故障识别(Matlab)

故障识别 | GADF-CNN-SSA-XGBoost数据分类预测/故障识别&#xff08;Matlab&#xff09; 目录 故障识别 | GADF-CNN-SSA-XGBoost数据分类预测/故障识别&#xff08;Matlab&#xff09;分类效果基本描述程序设计参考资料 分类效果 基本描述 格拉姆角场差&#xff08;GADF&#…...

【VUE小型网站开发】优化通用配置 二

1. 引入 MyBatis Plus 1.1 添加依赖 <dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- My…...

基于阻塞队列的生产者消费者模型动画演示

一个基于阻塞队列的生产者消费者模型的动画演示&#xff1a; 这是打包好的程序。程序是用 QT 写的。 通过网盘分享的文件&#xff1a;CP模型.7z 链接: https://pan.baidu.com/s/1YjC7YiSqHGqdr6bbffaDWg?pwde6g5 提取码: e6g5 CP模型...

springSecurity认证流程

Spring Security 是spring家族中的一个安全管理框架。相比于另一个安全框架Shiro&#xff0c;它提供更丰富的功能和社区资源&#xff0c;但也较难上手。所以一般大项目用spring Security&#xff0c;小项目用Shiro。 一般web应用需要认证和授权&#xff0c;这也是spring Secur…...

vite5+vue3+Ts5 开源图片预览器上线

images-viewer-vue3&#xff1a;一款Vue3的轻量级图像查看器&#xff0c;它基于Flip动画技术&#xff0c;支持PC和h5移动网页预览照片&#xff0c;如果它是Vue3开发的产品。 npm开源地址:https://www.npmjs.com/package/images-viewer-vue3?activeTabreadme Flip 动画 < …...

Qt开发:元对象系统的介绍和使用

文章目录 概述元对象系统的概念和组成QObject 的详细介绍1.QObject 的主要特性信号与槽机制动态属性对象树&#xff08;Object Trees&#xff09;事件处理 2.QMetaObject的主要特性函数签名常用功能 概述 Qt本身并不是一种编程语言&#xff0c;它实质上是一个跨平台的C开发类库…...