我在Vscode学OpenCV 几何变换(缩放、翻转、仿射变换、透视、重映射)

几何变换指的是将一幅图像映射到另一幅图像内的操作。

  1. cv2.warpAffine:使用仿射变换矩阵对图像进行变换,可以实现平移、缩放和旋转等操作。
  2. cv2.warpPerspective:使用透视变换矩阵对图像进行透视变换,可以实现镜头校正、图像纠偏等操作。
  3. cv2.getAffineTransform:计算仿射变换矩阵,根据输入的三个点对之间的关系来生成一个2x3的矩阵。
  4. cv2.getPerspectiveTransform:计算透视变换矩阵,根据输入的四个点对之间的关系来生成一个3x3的矩阵。
  5. cv2.resize:调整图像的大小,可以根据指定的尺寸或比例因子来进行缩放操作。
  6. cv2.flip:对图像进行翻转操作,可以在水平、垂直或两者方向上进行翻转。
  7. cv2.rotate:对图像进行旋转操作,可以按照指定的角度对图像进行顺时针或逆时针旋转。

这些函数可以在OpenCV中灵活使用,以实现各种图像的几何变换。通过调整参数和变换矩阵,可以达到所需的图像效果和变换结果。

CV 几何变换

  • 一、缩放
    • 1.1 写法
    • 1.1 改变图像的参数dsize的值
    • 1.2通过参数 fx 和 fy 指定
    • 1.3什么是插值
      • 部分介绍
  • 二、翻转
    • 2.1 语句 y=cv2.flip(img,1) 会使图像绕着 y 轴进行翻转。
    • 2.2 语句 xy=cv2.flip(img,-1) 会使图像同时绕着 x 轴和 y 轴进行翻转。
    • 2.3 语句 x=cv2.flip(img,0) 会使图像绕着 x 轴进行翻转。
  • 三、仿射变换
    • 3.1 平移
      • 3.1.1 代码及效果
      • 3.1.2 平移再缩放
    • 3.2 旋转
      • 3.2.1 代码及效果
    • 3.3 cv2.getAffineTransform:计算仿射变换矩阵
      • 3.3.1 代码
  • 四、透视
      • 4.1 `cv2.getPerspectiveTransform()` 转换矩阵
      • 4.2 代码及效果
  • 五、重映射
    • 5.1 复制
    • 5.2 翻转
      • 5.2.1 绕着x轴
      • 5.2.2 绕y轴翻转
      • 5.2.3 绕x轴、y轴翻转
      • 5.2.4 x轴、y轴互换
    • 5.3 图像缩放

一、缩放

dst = cv2.resize( src, dsize[, fx[, fy[, interpolation]]] )

 dst 代表输出的目标图像,该图像的类型与 src 相同,其大小为 dsize(当该值非零时),或者可以通过 src.size()fx、fy 计算得到。

 src 代表需要缩放的原始图像。

 dsize 代表输出图像大小。

 fx 代表水平方向的缩放比例。

 fy 代表垂直方向的缩放比例。

 interpolation 代表插值方式

1.1 写法

# 指定目标尺寸
resized_image = cv2.resize(image, (new_width, new_height))# 指定缩放比例因子
resized_image = cv2.resize(image, None, fx=scale_factor, fy=scale_factor)# 指定目标尺寸和插值方法
resized_image = cv2.resize(image, (new_width, new_height), interpolation=cv2.INTER_NEAREST)

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

1.1 改变图像的参数dsize的值

无论有fx,fy,都是由于dszie决定目标图像的大小,colws,rows

fx=(double)dsize.width/src.cols
fy=(double)dsize.height/src.rows```

在这里插入图片描述

1.2通过参数 fx 和 fy 指定

dsize的值为None,通过目标的参数fx,fy来实现的。
dsize(round(fx*src.cols),round(fy*src.rows))

在这里插入图片描述

1.3什么是插值

几何变换(如调整大小)期间确定无法直接映射的像素点值的必要性。当你放大图像时,会引入一些在原始图像中没有相应值的新像素。插值方法用于估算这些新像素的值。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img1=cv.imread("./Pic/test_img.jpg")
rows,cols=img1.shape[:2]
print(rows)
print(cols)

部分介绍

  • 最近邻插值:最近邻插值方法会选择最接近目标像素位置的原始像素的值作为新像素的值。这种方法计算简单,但可能会导致图像的锯齿状边缘和失真。

  • 双线性插值:双线性插值方法会根据目标像素位置周围的四个最近原始像素的值进行加权平均,以计算新像素的值。这种方法可以产生较平滑的图像,但可能会导致细节的模糊。

  • 双三次插值:双三次插值方法会根据目标像素位置周围的16个最近原始像素的值进行加权平均,以计算新像素的值。这种方法可以产生更平滑的图像,但计算复杂度较高。

选择哪种插值方法取决于应用的需求。如果需要保留图像的细节和边缘,可以选择双线性或双三次插值。如果需要快速计算并可以容忍一些失真,可以选择最近邻插值。

总之,插值方法在图像缩放中起着重要的作用,可以影响图像质量和计算效率。根据具体需求选择适当的插值方法是很重要的。

二、翻转

在图像处理中,旋转和翻转是两种不同的操作。
·
旋转 意味着围绕图像的中心或其他指定点按某个角度旋转图像。这会导致图像内容的重组,但不会改变内容本身的方向。在 OpenCV 中,你可以使用 cv2.rotate 函数来旋转图像。
·
翻转 意味着以水平或垂直轴为对称轴来颠倒图像内容。水平翻转会使图像左右颠倒,而垂直翻转则会使图像上下颠倒。在 OpenCV 中,你可以使用 cv2.flip 函数来实现图像的翻转。
·
总结来说,旋转是根据一个角度来调整图像的方向,而翻转是基于图像的对称轴来颠倒图像内容。

dst = cv2.flip( src, flipCode )

#src 代表了原始像素点(源像素),dst 代表了目标像素点(目标像素)

dst 代表和原始图像具有同样大小、类型的目标图像。

src 代表要处理的原始图像。

flipCode 翻转的方式(水平翻转、垂直翻转或同时进行水平和垂直翻转)
在这里插入图片描述

2.1 语句 y=cv2.flip(img,1) 会使图像绕着 y 轴进行翻转。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
imgx=cv.imread("./Pic/test_img.jpg")
dst=cv.flip(imgx,1)
plt.imshow(dst[:,:,::-1])

在这里插入图片描述

2.2 语句 xy=cv2.flip(img,-1) 会使图像同时绕着 x 轴和 y 轴进行翻转。

dst=cv.flip(imgx,-1)
plt.imshow(dst[:,:,::-1])

在这里插入图片描述

2.3 语句 x=cv2.flip(img,0) 会使图像绕着 x 轴进行翻转。

dst=cv.flip(imgx,0)
plt.imshow(dst[:,:,::-1])

在这里插入图片描述

三、仿射变换

仿射变换是一种线性变换,可以通过矩阵的乘法来描述。这种变换在保持图像中的平行性和直线性方面非常强大,因此在图像处理和计算机视觉领域得到广泛应用。它能够实现平移、旋转、缩放和剪切等操作,并且在变换后仍然能够保持空间关系的几何特性。

dst = cv2.warpAffine( src, M, dsize[, flags[, borderMode[, borderValue]]] )

  • src: 输入图像,即需要进行仿射变换的图像。
  • M: 变换矩阵,描述了平移、旋转和缩放等操作。
  • dsize: 输出图像的大小,即变换后的图像的尺寸。
  • flags: 插值方法的标志。用于指定在变换过程中如何对像素进行插值。这是可选参数。
  • borderMode: 边界模式,指定了当像素越界时的处理方式(例如镜像、填充等)。这也是一个可选参数。
  • borderValue: 当使用常量边界模式时,指定边界填充的数值。这同样是一个可选参数。

在运用中就简化成
dst = cv2.warpAffine( src , M , dsize )

3.1 平移

平移是一种基本的仿射变换操作,它将图像沿着给定的方向进行移动。
【图像平移将图像按照指定方向和距离,移动到相应的位置】

M = | 1 0 tx || 0 1 ty |

在这里,tx 和 ty 分别表示沿 x 和 y 方向的平移量。当应用这个平移矩阵时,图像中的每个像素将按照指定的偏移量进行移动。

只需提供适当的变换矩阵,可以很容易地实现图像的平移操作
dst = cv2.warpAffine( src , M , dsize )

img:输入图像
M: 2*3移动矩阵(注意:将M设置为np.float32类型的Numpy数组。)

dsize:输出图像的大小注意:输出图像的大小,它应该是(宽度,高度)的形式。请记住,width=列数, height=行数。

3.1.1 代码及效果

import numpy as np
import cv2 as cv
import matplotlib.pyplot as pltimg1 = cv.imread('./Pic/test_img.jpg')# 平移
rows, cols = img1.shape[:2]
M = np.float32([[1, 0, 100], [0, 1, 50]])
dst = cv.warpAffine(img1, M, (cols, rows))# 显示
fig, axes = plt.subplots(1, 2, figsize=(12, 6))axes[0].imshow(cv.cvtColor(img1, cv.COLOR_BGR2RGB))
axes[0].set_title("Original")axes[1].imshow(cv.cvtColor(dst, cv.COLOR_BGR2RGB))
axes[1].set_title("Change")
plt.show()

在这里插入图片描述

3.1.2 平移再缩放

更改dsize的大小
在这里插入图片描述

3.2 旋转

retval=cv2.getRotationMatrix2D(center, angle, scale)
在这里,cv2.getRotationMatrix2D()函数用于生成一个旋转矩阵,其参数的含义如下:

  • center:旋转的中心点坐标,通常以元组 (x, y) 的形式表示。在图像处理中,(0, 0) 通常代表图像的左上角。

  • angle:旋转角度,以度为单位。正数表示逆时针旋转,负数表示顺时针旋转。

  • scale:可选的缩放因子。如果不需要对图像进行缩放,可以将其设置为1。如果想要按比例缩放图像,可以提供缩放因子。

该函数返回一个2x3的变换矩阵,将它应用到原始图像上可以实现指定中心点、角度和缩放比例的旋转。

3.2.1 代码及效果

import numpy as np
import cv2 as cv
import matplotlib.pyplot as pltimg = cv.imread('./Pic/test_img.jpg')# 获取图像尺寸
rows, cols = img.shape[:2]# 旋转角度为90度
theta = 90
theta_rad = np.deg2rad(theta)# 构造旋转矩阵
M = cv.getRotationMatrix2D((cols / 2, rows / 2), theta, 1)# 进行图像旋转
dst = cv.warpAffine(img, M, (cols, rows))# 显示图像
fig, axes = plt.subplots(1, 2, figsize=(12, 6))
axes[0].imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
axes[0].set_title("Original")axes[1].imshow(cv.cvtColor(dst, cv.COLOR_BGR2RGB))
axes[1].set_title("Rotated")
plt.show()

在这里插入图片描述

M = cv.getRotationMatrix2D((cols/ 2, rows / 2), 45, 0.5)

在这里插入图片描述

3.3 cv2.getAffineTransform:计算仿射变换矩阵

retval=cv2.getAffineTransform(src, dst)

 src 代表输入图像的三个点坐标。
 dst 代表输出图像的三个点坐标。

3.3.1 代码

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
x1, y1 = 100, 100
x2, y2 = 200, 300
x3, y3 = 100, 200u1, v1 = 150, 150
u2, v2 = 250, 150
u3, v3 = 150, 250img = cv.imread('./Pic/test_img.jpg')# 获取图像尺寸
rows, cols = img.shape[:2]# 定义原始图像上的三个点和目标图像上的三个对应点
pts_original = np.float32([[x1, y1], [x2, y2], [x3, y3]])
pts_target = np.float32([[u1, v1], [u2, v2], [u3, v3]])# 获取仿射变换矩阵
M = cv.getAffineTransform(pts_original, pts_target)# 进行仿射变换
dst = cv.warpAffine(img, M, (cols, rows))# 显示图像
fig, axes = plt.subplots(1, 2, figsize=(12, 6))
axes[0].imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
axes[0].set_title("Original")axes[1].imshow(cv.cvtColor(dst, cv.COLOR_BGR2RGB))
axes[1].set_title("Transformed")
plt.show()

在这里插入图片描述

四、透视

dst = cv2.warpPerspective( src, M, dsize[, flags[, borderMode[, borderValue]]] )
cv2.warpPerspective()函数用于执行透视变换,它接受以下参数:

  1. src: 输入图像。这是要进行透视变换的原始图像。

  2. M: 变换矩阵。这是通过cv2.getPerspectiveTransform()或其他类似函数计算得到的透视变换矩阵。

  3. dsize: 输出图像的大小,表示为 (width, height)

  4. flags(可选参数): 这是一个插值方法的标志,用于指定如何在变换过程中对图像进行插值。默认情况下为cv2.INTER_LINEAR,这意味着使用线性插值。其他可能的值包括cv2.INTER_NEAREST(最近邻插值)、cv2.INTER_CUBIC(立方插值)等。

  5. borderMode(可选参数): 用于定义边界像素的模式。默认为cv2.BORDER_CONSTANT,表示将边界填充为常数值。其他可能的值包括cv2.BORDER_REFLECT(边界像素的镜像反射)和cv2.BORDER_WRAP(边界像素的重复等)。

  6. borderValue(可选参数): 当borderModecv2.BORDER_CONSTANT时,可以指定边界填充的常数值。默认为0。

4.1 cv2.getPerspectiveTransform() 转换矩阵

可以使用函数 cv2.getPerspectiveTransform() 生成适用于 cv2.warpPerspective() 的转换矩阵。该函数的语法格式为:

retval = cv2.getPerspectiveTransform(src, dst)

其中,参数含义如下:

  • src:代表输入图像的四个顶点的坐标。

  • dst:代表输出图像的四个顶点的坐标。

需要注意的是,src 参数和 dst 参数都是包含四个点的数组,与仿射变换函数 cv2.getAffineTransform() 中的三个点是不同的。在实际使用中,我们可以根据需求控制 src 中的四个点映射到 dst 中的四个点。

4.2 代码及效果

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt# 定义原始图像上的四个点和目标图像上的四个对应点
src_points = np.float32([[100, 100], [200, 300], [100, 200], [300, 150]])
dst_points = np.float32([[150, 150], [250, 150], [150, 250], [300, 200]])img = cv.imread('./Pic/test_img.jpg')# 获取透视变换矩阵
M = cv.getPerspectiveTransform(src_points, dst_points)# 进行透视变换
dst = cv.warpPerspective(img, M, (img.shape[1], img.shape[0]))# 显示图像
fig, axes = plt.subplots(1, 2, figsize=(12, 6))
axes[0].imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
axes[0].set_title("Original")axes[1].imshow(cv.cvtColor(dst, cv.COLOR_BGR2RGB))
axes[1].set_title("Transformed")
plt.show()

在这里插入图片描述

五、重映射

重映射是指将图像中的像素从一个位置映射到另一个位置的过程。在计算机视觉和图像处理中,重映射通常用于图像几何变换(如旋转、缩放、仿射变换、透视变换等)以及校正畸变等操作。

在重映射过程中,我们需要定义一个映射关系,将输入图像中的每个像素映射到输出图像中的相应位置。这个映射关系可以通过变换矩阵(如仿射变换矩阵或透视变换矩阵)来实现,也可以通过自定义的像素级映射函数来完成。一旦建立了映射关系,就可以根据该关系对图像进行重映射,从而实现所需的变换效果。

在OpenCV中,重映射通常涉及到两个主要函数:cv2.remap()cv2.warpAffine()cv2.warpPerspective()。前者允许用户提供自定义的映射关系,而后者则使用预定义的变换矩阵来执行重映射。

5.1 复制

当使用 cv2.remap() 函数来实现图像复制时,我们可以通过以下步骤进行处理:

  1. 创建网格:首先,我们需要创建一个与原始图像大小相同的网格。这个网格将用于映射坐标值。
height, width = img.shape[:2]
map_x, map_y = np.meshgrid(np.arange(width), np.arange(height))
  1. 设置 map1 和 map2 的值:接下来,我们将 map1 的值设定为对应位置上的 x 轴坐标值,将 map2 的值设定为对应位置上的 y 轴坐标值。
map1 = map_x
map2 = map_y
  1. 使用 remap 函数实现图像复制:将处理后的 map1 和 map2 参数传递给 cv2.remap() 函数,同时指定插值方法(如 cv2.INTER_LINEAR)。
remapped_img = cv2.remap(img, map1, map2, interpolation=cv2.INTER_LINEAR)
  1. 显示复制后的图像:最后,我们可以通过显示函数来展示复制后的图像,以便观察结果。
cv2.imshow("Remapped Image", remapped_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

通过以上步骤,我们可以利用重映射函数 cv2.remap() 来实现图像的复制。这种方法允许我们更灵活地控制图像的映射过程,以实现各种类型的图像处理效果。

5.2 翻转

5.2.1 绕着x轴

在OpenCV中,要实现图像绕x轴翻转,需要进行以下映射过程:

  1. x坐标轴的值保持不变。
  2. y坐标轴的值以x轴为对称轴进行交换。

这反映在两个映射数组(map1和map2)上的变化如下:

  • 对于map1,其值保持不变。
  • 对于map2,需要将其值调整为“总行数-1-当前行号”。

需要注意的是,在OpenCV中,行号的下标是从0开始的。因此,在对称关系中存在一个规律:“当前行号+对称行号=总行数-1”。据此,在绕着x轴翻转时,map2中当前行的行号应调整为“总行数-1-当前行号”。

5.2.2 绕y轴翻转

要实现图像绕y轴翻转,需要进行以下映射过程:

  1. y坐标轴的值保持不变。
  2. x坐标轴的值以y轴为对称轴进行交换。

这反映在两个映射数组(map1和map2)上的变化如下:

  • 对于map2,其值保持不变。
  • 对于map1,需要将其值调整为“总列数-1-当前列号”。

需要注意的是,在OpenCV中,列号的下标是从0开始的。因此,在对称关系中存在一个规律:“当前列号+对称列号=总列数-1”。据此,在绕着y轴翻转时,map1中当前列的列号应调整为“总列数-1-当前列号”。

5.2.3 绕x轴、y轴翻转

要实现图像绕x轴、y轴翻转,需要进行以下映射过程:

  1. x坐标轴的值以y轴为对称轴进行交换。
  2. y坐标轴的值以x轴为对称轴进行交换。

这反映在两个映射数组(map1和map2)上的变化如下:

  • 对于map1,需要将其值调整为“总列数-1-当前列号”。
  • 对于map2,需要将其值调整为“总行数-1-当前行号”。

5.2.4 x轴、y轴互换

要实现图像的x轴、y轴互换,需要进行以下映射过程:

对于任意一点,都需要将其x轴、y轴坐标互换。这反映在两个映射数组(mapx和mapy)上的变化如下:

  • 对于mapx,其值调整为所在行的行号。
  • 对于mapy,其值调整为所在列的列号。

需要注意的是,如果行数和列数不一致,上述运算可能存在值无法映射的情况。默认情况下,无法完成映射的值会被处理为0。

5.3 图像缩放

上述介绍的映射都是直接完成的整数映射,处理起来比较方便。在处理更复杂的问题时,
就需要对行、列值进行比较复杂的运算来实现。

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

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

相关文章

Positive证书:最便宜的SSL证书

在当今数字化的时代,网上交易和信息传输已经成为我们生活中不可或缺的一部分。然而,随着网络犯罪的增加,确保在线信息的安全性变得尤为重要。Positive证书作为一种经济实惠的数字证书,在提供有效安全性的同时,为用户提…

C# Onnx 特征匹配 DeDoDe 检测,不描述---描述,不检测

目录 介绍 效果 模型信息 项目 代码 下载 介绍 github地址:https://github.com/Parskatt/DeDoDe DeDoDe 🎶 Detect, Dont Describe - Describe, Dont Detect, for Local Feature Matching The DeDoDe detector learns to detect 3D consisten…

Redis主从,缓存击穿,雪崩,哨兵等问题

Redis的性能管理: Redis的数据缓存在内存当中 INFO memory used_memory:853808 Redis中数据占用的内存 used_memory_rss:3715072 Redis向操作系统申请的内容 used_memory_peak:853808 Redis使用的内存的峰值 系统巡检:硬件巡检,数据库…

解析IBM SPSS Statistics 26 forMac/win中文版:全面统计分析解决方案

作为一款强大的统计分析软件,IBM SPSS Statistics 26(spss统计软件)在全球范围内被广泛使用。无论是学术研究、市场调研还是商业决策,SPSS统计软件都能提供全面的解决方案,帮助用户快速、准确地分析数据。 首先&#…

第二证券:什么是权重股?权重股可以长期持有吗?

权重版块是指该版块股票市值巨大,在股票总市值中的比重很大(即权重很大),其涨跌对股票指数的影响很大的一个版块,比方,商场上的证券、钢铁、银行、保险、石油等板块的个股。 权重股适合长时间持有&#xf…

Mac- Iterm 2 (替换mac terminal 终端的下一代终端工具)

1.应用场景 主要用于macOS中作为终端工具使用, 执行终端命令, Iterm 2 (替换mac terminal 终端的下一代终端工具) 2.学习/操作 1.文档阅读 chatgpt & 其他资料 2.整理输出 2.1 是什么 Iterm 2 (替换mac terminal 终端的下一代终端工具) 2.2 为什么需要「应用场景」 macOS…

skywalking中gateway的拓扑图没有出现

背景: 刚开始的时候gateway没有出现,后来百度说添加插件的jar包, apm-spring-cloud-gateway-2.1.x-plugin-8.15.0.jar apm-spring-webflux-5.x-plugin-8.15.0.jar 然后解决了gateway节点出来了, 但是:拓扑图却是User指…

利用NVIDIA DALI读取视频帧

1. NVIDIA DALI简介 NVIDIA DALI全称是NVIDIA Data Loading Library,是一个用GPU加速的数据加载和预处理库,可用于图像、视频和语音数据的加载和处理,从而为深度学习的训练和推理加速。 NVIDIA DALI库的出发点是,深度学习应用中…

文心大模型商业化领跑,百度在自我颠覆中重构生长力

随着科技巨头竞逐AI大模型,人工智能技术成为今年最受瞩目的新技术。但是,AI大模型的创新之路,还缺少一个足够有力的商业化答案。 作为全球最先发布大模型的互联网大厂,百度能否加速大模型的应用落地,以及文心大模型能…

C++ Boost 实现异步端口扫描器

端口扫描是一种用于识别目标系统上哪些网络端口处于开放、关闭或监听状态的网络活动。在计算机网络中,端口是一个虚拟的通信端点,用于在计算机之间传输数据。每个端口都关联着特定类型的网络服务或应用程序。端口扫描通常是网络管理员、安全专业人员用来…

springboot项目中获取业务功能的导入数据模板文件

场景: 在实际业务场景中,经常会遇到某些管理功能需要数据导入共功能,但既然是导入数据,肯定会有规则限制,有规则就会有数据模板,但这个模板一般是让客户自己下载固定规则模板,而不是让客户自己随便上传模板。下面介绍直接下载模板 一、下载模板示例 1、在项目的…

Mysql查看Binlog文件

前期准备 检查是否开启binlog mysql> SHOW VARIABLES LIKE log_bin; // 或者 mysql> SHOW VARIABLES LIKE log%;ON代表开启,OFF代表关闭。如为OFF需 开启 后才能查看,但只能查看开启之后时间点的。 查看binlog文件有哪些 一般yum安装的mysql…

Program Header Table(转载)

程序头表与段表相互独立,由ELF文件头统一管理。 程序头表负责ELF文件从文件到加载后映像的映射关系,一般只有可执行文件包含。 1. segment和section segment: 程序头表项描述的对象称为segment,即elf文件加载后的数据块; 它提供…

微服务开发中,使用AOP和自定义注解实现对权限的校验

一、背景 微服务开发中,暴露在外网的接口,为了访问的安全,都是需要在http请求中传入登录时颁发的token。这时候,我们需要有专门用来做校验token并解析用户信息的服务。如下图所示,http请求先经过api网关,网…

[点云分割] 欧式距离分割

效果&#xff1a; 代码&#xff1a; #include <iostream> #include <chrono>#include <pcl/ModelCoefficients.h> // 模型系数的定义 #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> // 各种点云数据类型 #include <pcl/sample_c…

java“贪吃蛇”小游戏

基于java实现贪吃蛇小游戏&#xff0c;主要通过绘制不同的图片并以一定速度一帧一帧地在窗体上进行展示。 我是在javaSwing项目下创建了一个包 名字叫做&#xff1a;Snakes包 包下有一个启动类和一个设置代码的主界面两个类 代码主界面&#xff1a; 代码主界面主要讲解的是 …

window文件夹下python脚本实现批量删除无法预览的图片

你是否遇到过下载的图片会发现有些图片会无法预览情况&#xff1f; 有几种原因可能导致一些图片在预览时无法正常显示&#xff1a; 损坏的图片文件&#xff1a; 图片文件可能损坏或者部分损坏&#xff0c;导致无法被正常解析和预览。这种情况可能是因为文件在传输过程中损坏、…

机器学习入门(第二天)——感知机

概述 每个算法都是为了解决一类问题&#xff0c;或者说解决之前的问题所创造出来的&#xff0c;而感知机&#xff0c;在解决一类问题的时候也暴露了很多问题&#xff0c;变相的推动了以后的算法的改进方向。 知识树 苹果表示相对重要的 直观介绍 现在有一盘红豆和绿豆&#…

2014年8月20日 Go生态洞察:Go在OSCON的精彩亮相

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

网络异常检测

随着社交网络、视频流、点对点技术、云计算和 SaaS 的出现&#xff0c;可以肯定地说&#xff0c;现代企业的好坏取决于他们的网络&#xff0c;尤其是在它们提供的带宽和安全性方面。无论是银行保护其数据免遭盗窃&#xff0c;还是商业组织保护其网络免受安全威胁和攻击&#xf…