我在Vscode学OpenCV 几何变换(缩放、翻转、仿射变换、透视、重映射)
几何变换指的是将一幅图像映射到另一幅图像内的操作。
cv2.warpAffine:使用仿射变换矩阵对图像进行变换,可以实现平移、缩放和旋转等操作。cv2.warpPerspective:使用透视变换矩阵对图像进行透视变换,可以实现镜头校正、图像纠偏等操作。cv2.getAffineTransform:计算仿射变换矩阵,根据输入的三个点对之间的关系来生成一个2x3的矩阵。cv2.getPerspectiveTransform:计算透视变换矩阵,根据输入的四个点对之间的关系来生成一个3x3的矩阵。cv2.resize:调整图像的大小,可以根据指定的尺寸或比例因子来进行缩放操作。cv2.flip:对图像进行翻转操作,可以在水平、垂直或两者方向上进行翻转。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()函数用于执行透视变换,它接受以下参数:
-
src: 输入图像。这是要进行透视变换的原始图像。 -
M: 变换矩阵。这是通过cv2.getPerspectiveTransform()或其他类似函数计算得到的透视变换矩阵。 -
dsize: 输出图像的大小,表示为(width, height)。 -
flags(可选参数): 这是一个插值方法的标志,用于指定如何在变换过程中对图像进行插值。默认情况下为cv2.INTER_LINEAR,这意味着使用线性插值。其他可能的值包括cv2.INTER_NEAREST(最近邻插值)、cv2.INTER_CUBIC(立方插值)等。 -
borderMode(可选参数): 用于定义边界像素的模式。默认为cv2.BORDER_CONSTANT,表示将边界填充为常数值。其他可能的值包括cv2.BORDER_REFLECT(边界像素的镜像反射)和cv2.BORDER_WRAP(边界像素的重复等)。 -
borderValue(可选参数): 当borderMode为cv2.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() 函数来实现图像复制时,我们可以通过以下步骤进行处理:
- 创建网格:首先,我们需要创建一个与原始图像大小相同的网格。这个网格将用于映射坐标值。
height, width = img.shape[:2]
map_x, map_y = np.meshgrid(np.arange(width), np.arange(height))
- 设置 map1 和 map2 的值:接下来,我们将 map1 的值设定为对应位置上的 x 轴坐标值,将 map2 的值设定为对应位置上的 y 轴坐标值。
map1 = map_x
map2 = map_y
- 使用 remap 函数实现图像复制:将处理后的 map1 和 map2 参数传递给
cv2.remap()函数,同时指定插值方法(如cv2.INTER_LINEAR)。
remapped_img = cv2.remap(img, map1, map2, interpolation=cv2.INTER_LINEAR)
- 显示复制后的图像:最后,我们可以通过显示函数来展示复制后的图像,以便观察结果。
cv2.imshow("Remapped Image", remapped_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
通过以上步骤,我们可以利用重映射函数 cv2.remap() 来实现图像的复制。这种方法允许我们更灵活地控制图像的映射过程,以实现各种类型的图像处理效果。
5.2 翻转
5.2.1 绕着x轴
在OpenCV中,要实现图像绕x轴翻转,需要进行以下映射过程:
- x坐标轴的值保持不变。
- y坐标轴的值以x轴为对称轴进行交换。
这反映在两个映射数组(map1和map2)上的变化如下:
- 对于map1,其值保持不变。
- 对于map2,需要将其值调整为“总行数-1-当前行号”。
需要注意的是,在OpenCV中,行号的下标是从0开始的。因此,在对称关系中存在一个规律:“当前行号+对称行号=总行数-1”。据此,在绕着x轴翻转时,map2中当前行的行号应调整为“总行数-1-当前行号”。
5.2.2 绕y轴翻转
要实现图像绕y轴翻转,需要进行以下映射过程:
- y坐标轴的值保持不变。
- x坐标轴的值以y轴为对称轴进行交换。
这反映在两个映射数组(map1和map2)上的变化如下:
- 对于map2,其值保持不变。
- 对于map1,需要将其值调整为“总列数-1-当前列号”。
需要注意的是,在OpenCV中,列号的下标是从0开始的。因此,在对称关系中存在一个规律:“当前列号+对称列号=总列数-1”。据此,在绕着y轴翻转时,map1中当前列的列号应调整为“总列数-1-当前列号”。
5.2.3 绕x轴、y轴翻转
要实现图像绕x轴、y轴翻转,需要进行以下映射过程:
- x坐标轴的值以y轴为对称轴进行交换。
- y坐标轴的值以x轴为对称轴进行交换。
这反映在两个映射数组(map1和map2)上的变化如下:
- 对于map1,需要将其值调整为“总列数-1-当前列号”。
- 对于map2,需要将其值调整为“总行数-1-当前行号”。
5.2.4 x轴、y轴互换
要实现图像的x轴、y轴互换,需要进行以下映射过程:
对于任意一点,都需要将其x轴、y轴坐标互换。这反映在两个映射数组(mapx和mapy)上的变化如下:
- 对于mapx,其值调整为所在行的行号。
- 对于mapy,其值调整为所在列的列号。
需要注意的是,如果行数和列数不一致,上述运算可能存在值无法映射的情况。默认情况下,无法完成映射的值会被处理为0。
5.3 图像缩放
上述介绍的映射都是直接完成的整数映射,处理起来比较方便。在处理更复杂的问题时,
就需要对行、列值进行比较复杂的运算来实现。
相关文章:
我在Vscode学OpenCV 几何变换(缩放、翻转、仿射变换、透视、重映射)
几何变换指的是将一幅图像映射到另一幅图像内的操作。 cv2.warpAffine:使用仿射变换矩阵对图像进行变换,可以实现平移、缩放和旋转等操作。cv2.warpPerspective:使用透视变换矩阵对图像进行透视变换,可以实现镜头校正、图像纠偏等…...
MATLAB算法实战应用案例精讲-【图像处理】图像缩放
目录 前言 知识储备 MATLAB图像处理函数 数字数字图像增强 数字数字图像的变换...
Doris的PROPERTIES与ENGINE(九)
接上篇----------Doris分区与分桶 在建表语句的最后 PROPERTIES 中,可以指定以下两个参数: replication_num 每个 Tablet 的副本数量。默认为 3,建议保持默认即可。在建表语句中,所有 Partition 中的 Tablet 副本数量统一指定。…...
华为云数据库 RDS 下载全量备份文件 wget
地址下载 wget -O FILE_NAME --no-check-certificate "DOWNLOAD_URL"FILE_NAME:重命名,例如mysql1121.qpDOWNLOAD_URL: 地址下载 参考 华为云数据库 RDS 下载全量备份文件...
C#使用whisper.net实现语音识别(语音转文本)
目录 介绍 效果 输出信息 项目 代码 下载 介绍 github地址:https://github.com/sandrohanea/whisper.net Whisper.net. Speech to text made simple using Whisper Models 模型下载地址:https://huggingface.co/sandrohanea/whisper.net/tree…...
从零开始学习typescript——运算符(算术运算符、赋值运算符、比较运算符)
算术运算符 算术运算符主要是针对数值类型和长整型;包括有加法、减法、乘法、除法、自增、自减等运算 加法() let x:number1let y:number 2console.log(xy)减法(-) let x:number1let y:number 2console.log(y-x)乘法…...
likeshop单商户商城系统 任意文件上传漏洞复现
0x01 产品简介 likeshop单商户标准商城系统适用于B2C、单商户、自营商城场景。完美契合私域流量变现闭环交易使用。 系统拥有丰富的营销玩法,强大的分销能力,支持电子面单和小程序直播等功能。无论运营还是二开都是性价比极高的100%开源商城系统。 0x02…...
CentOS 7 使用pugixml 库
安装 pugixml Git下载地址:https://github.com/zeux/pugixml 步骤1:首先,你需要下载pugixml 的源代码。你可以从Github或者源代码官方网站下载。并上传至/usr/local/source_code/ 步骤2:下载完成后,需要将源代码解压…...
深度学习 loss 是nan的可能原因
1 loss 损失值非常大,超过了浮点数的范围,所以表示为overflow 状态下的男。 解决办法: 减小学习率,观察loss值是不是还是nan 在将数据输入模型前,进行恰当的归一化 缩放 2 loss 的计算中存在除以0, log(0…...
[ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
本文收录于【#云计算入门与实践 - AWS】专栏中,收录 AWS 入门与实践相关博文。 本文同步于个人公众号:【云计算洞察】 更多关于云计算技术内容敬请关注:CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文: [ 云计算 | …...
第二十章:多线程
进程 线程的特点 1.进程是资源分配的最小单位,线程是最小的执行单位 2.一个进程可以有多个线程 3.线程共享进程资源 package twentyth; public class ThreadTest extends Thread { public void run() { for (int i 1; i < 10; i) {//继承重…...
CentOS 7启动时报“Started Crash recovery kernel arming.....shutdown....”问题处理过程
有台虚拟机由于CPU负载过高而宕机,宕机重启后停在“Started Crash recovery kernel arming…shutdown…”阶段,如下所示: 重置虚拟机,进入grub菜单,按e编辑启动选项,在linux16 行末,加上&…...
Android 13 - Media框架(14)- OpenMax(二)
这一节我们将来解析 media.codec 这个 HIDL service 究竟提供了什么服务,服务是如何启动的。 1、main 函数 我们先来看 frameworks/av/services/mediacodec/main_codecservice.cpp: int main(int argc __unused, char** argv) {strcpy(argv[0], "…...
【Python大数据笔记_day11_Hadoop进阶之MR和YARNZooKeeper】
MR 单词统计流程 已知文件内容: hadoop hive hadoop spark hive flink hive linux hive mysql input结果: k1(行偏移量) v1(每行文本内容)0 hadoop hive hadoop spark hive 30 flink hive linux hive mysql map结果:k2(split切割后的单词) v2(拼接…...
飞桨——总结PPOCRLabel中遇到的坑
操作系统:win10 python环境:python3.9 paddleocr项目版本:2.7 1.报错:ModuleNotFoundError: No module named Polygon(已解决) 已解决所以没有复现报错内容 尝试方法一:直接使用pip命令安装&…...
LeetCode(30)长度最小的子数组【滑动窗口】【中等】
目录 1.题目2.答案3.提交结果截图 链接: 长度最小的子数组 1.题目 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果…...
Niushop 开源商城 v5.1.7:支持PC、手机、小程序和APP多端电商的源码
Niushop 系统是一款基于 ThinkPHP6 开发的电商系统,提供了丰富的功能和完善的商品机制。该系统支持普通商品和虚拟商品,并且针对虚拟商品还提供了完善的核销机制。同时,它也支持新时代的商业模式,如拼团、分销和多门店砍价等营销活…...
Navmesh 寻路
用cocos2dx引擎简单实现了一下navmesh的多边形划分,然后基于划分多边形的a*寻路。以及路径拐点优化算法 用cocos主要是方便使用一些渲染接口和定时器。重点是实现的原理。 首先画了一个带有孔洞的多边形 //多边形的顶点数据Vec2(100, 100),Vec2(300, 200),Vec2(50…...
YOLOv5 分类模型 数据集加载 3
YOLOv5 分类模型 数据集加载 3 自定义类别 flyfish YOLOv5 分类模型 数据集加载 1 样本处理 YOLOv5 分类模型 数据集加载 2 切片处理 YOLOv5 分类模型的预处理(1) Resize 和 CenterCrop YOLOv5 分类模型的预处理(2)ToTensor 和 …...
『亚马逊云科技产品测评』活动征文|AWS 存储产品类别及其适用场景详细说明
授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 目录 前言、AWS 存储产品类别 1、Amazon Elastic Block Store (EBS) …...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
