【Python】OpenCV库中常用函数详解和示例

在Python中,OpenCV(Open Source Computer Vision Library)是一个广泛使用的图像和视频处理库。它包含许多用于图像处理和计算机视觉任务的函数。本文对一些常用的OpenCV函数及其详细解释和示例,以帮助大家理解和使用。

目录

  • cv2.imread()
    • 函数解析
    • 运行示例
  • cv2.imshow()、cv2.waitKey()、cv2.destroyAllWindows()
    • cv2.imshow()
    • cv2.waitKey()
    • cv2.destroyAllWindows()
    • 示例
  • cv2.cvtColor()
    • 函数解析
    • 运行示例
  • cv2.blur()
    • 函数原理
    • 运行示例
  • cv2.threshold()
    • 函数解析
    • 运行示例
  • cv2.drawContours()
    • 函数解析
    • 运行示例
  • cv2.findContours()
    • 函数解析
    • 运行示例
  • cv2.bitwise_and()
    • 函数解析
    • 运行示例
  • cv2.inRange()
    • 函数解析
    • 运行示例

cv2.imread()

函数解析

cv2.imread() 是OpenCV库中的一个函数,用于读取图像文件。这个函数将图像读入为NumPy数组,适合处理.jpg,.png,.bmp,.tiff等常见格式的图像。

函数原型为:cv2.imread(filename, flags=1)

其中,filename 是要读取的图像文件的名称(包括路径,如果图像不在当前工作目录下)。
flags 参数用于指定读图的方式,它是一个可选参数,默认值为1。它可以接受的正整数值有以下几种可能:

1. cv2.IMREAD_COLOR:这是默认值,用于读取一张彩色图像。这种模式下,图像的三个通道分别是BGR(蓝,绿,红)。这种模式是直接从文件中读取RGB值。
2. cv2.IMREAD_GRAYSCALE:以灰度模式读取图像。
3. cv2.IMREAD_UNCHANGED:读取图像包括alpha通道。
4. 0:不进行任何操作,只读取文件信息。
5. -1:读取图像并检查其大小(如果需要的话)为8位、16位、32位或浮点型。


函数返回值是一个NumPy数组,它表示读取的图像。如果读取失败(例如文件不存在或无法打开),函数将返回None。

运行示例

import cv2
img1 = cv2.imread('image.jpg') 
img2 = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)  # 读取灰度图像
cv2.imshow('image1', img1)
cv2.imshow('image2', img2)
cv2.waitKey(0)

运行展示结果:
在这里插入图片描述
可以看到,改变flags 参数的值,尽管读取的是同一幅图像中但一个显示的是彩色图一个是灰度图。

**注意:**由于cv2.imread()函数会根据指定的模式(flags)读取图像,因此其返回的图像数据类型可能不同。例如,如果以cv2.IMREAD_GRAYSCALE模式读取图像,则返回的图像将是灰度图,数据类型为uint8;如果以cv2.IMREAD_COLOR模式读取图像,则返回的图像将是彩色图,数据类型通常为uint8,但也可能为float32或double,具体取决于读取的图像数据是否能被准确地表示为uint8。

cv2.imshow()、cv2.waitKey()、cv2.destroyAllWindows()

这三个函数都是OpenCV库中的函数,用于显示和关闭图像窗口。

cv2.imshow()

cv2.imshow('image', img):

参数:第一个参数是窗口名称,第二个参数是要显示的图像。

解释:这个函数用于在窗口中显示图像。如果你已经有了一个名为'image'的窗口,调用这个函数会覆盖该窗口中的图像。如果你没有名为'image'的窗口,这个函数会创建一个新窗口。

cv2.waitKey()



cv2.waitKey(0)

参数:该函数只有一个参数,通常是0或者是一个大于0的整数。
解释:这个函数会等待用户按下键盘上的任意键。参数0表示无限等待。如果参数大于0,函数会等待指定的毫秒数。例如,cv2.waitKey(5000)将等待5秒。如果在这段时间内用户按下了任意键,程序将继续执行;否则,程序将继续等待。

cv2.destroyAllWindows()

cv2.destroyAllWindows()

参数:该函数没有参数。
解释:这个函数会关闭所有由OpenCV创建的窗口。如果你在调用cv2.imshow()后想要确保窗口被关闭,通常会在显示完图像后调用这个函数。注意,这个函数不会影响由其他库(如matplotlib)创建的窗口。

示例

import cv2
img = cv2.imread('115.jpg')
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

读取图像,然后显示在“image”的窗口中,手动按任意键程序继续,最后关闭窗口。

cv2.cvtColor()

函数解析

cv2.cvtColor() 是 OpenCV 库中的一个函数,用于将图像从一种颜色空间转换到另一种颜色空间。这个函数非常有用,因为不同的颜色空间可以提供不同的图像处理和分析视角。

函数原型为:

cv2.cvtColor(src, code)

参数详解:

src: 源图像,这应该是一个 NumPy 数组。
code: 转换的标识符,这是一个整数,用于指定目标颜色空间。可能的值包括:
cv2.COLOR_BGR2BGRA:从 BGR 到 BGRA。
cv2.COLOR_RGB2RGBA:从 RGB 到 RGBA。
cv2.COLOR_BGRA2BGR:从 BGRA 到 BGR。
cv2.COLOR_RGBA2RGB:从 RGBA 到 RGB。
cv2.COLOR_BGR2GRAY:从 BGR 到灰度。
cv2.COLOR_RGB2GRAY:从 RGB 到灰度。
cv2.COLOR_GRAY2BGR:从灰度到 BGR。
cv2.COLOR_GRAY2RGB:从灰度到 RGB。
cv2.COLOR_BGR2RGB:从 BGR 到 RGB。
cv2.COLOR_RGB2BGR:从 RGB 到 BGR。

运行示例

import cv2
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

在这里插入图片描述
可以看到,用该函数转为灰度图的效果和cv2.imread()函数读取时设置为灰度图类似。

cv2.blur()

cv2.blur() 是 OpenCV 库中的一个函数,也被称为盒形滤波。它是一种简单平滑(滤波)技术,用于减小图像噪声和细节。该操作对于大多数图像是向下采样(分辨率降低)的。

函数原理

函数原型为:
cv2.blur(src, ksize[, dst[, anchor[, borderType]]])

参数详解:

src: 输入图像。
ksize: 滤波器的大小,这必须是奇数,如 (5,5)。
dst: 输出图像。
anchor: 锚点,定义了滤波器的参考点。默认值为 (-1,-1)。
borderType: 定义在滤波过程中使用的像素边界类型。默认值为 cv2.BORDER_DEFAULT。

运行示例


import cv2

# 读取图像
img = cv2.imread('115.jpg')

# 应用模糊操作
blurred = cv2.blur(img, (5,5))  # 使用5x5的滤波器

# 显示原始和模糊图像
cv2.imshow('Original Image', img)
cv2.imshow('Blurred Image', blurred)

cv2.waitKey(0)
cv2.destroyAllWindows()

运行输出效果:
在这里插入图片描述

可以看到,处理后的图像变得模糊,尤其是在数字细节处。

cv2.threshold()

cv2.threshold 是 OpenCV 库中的一个函数,主要用于对灰度图像进行阈值化处理,也就是将图像的像素值进行分类。这个函数的基本原理是将图像的每个像素值与设定的阈值进行比较,然后根据比较结果将像素值设置为0或255。

函数解析

函数原型:
cv2.threshold(src, thresh, maxval, type)

参数:
src: 输入图像,必须是8位或32位的单通道图像。
thresh: 阈值,是一个0到255之间的整数。
maxval: 当源图像的像素值大于(或小于)阈值时要赋予的值。如果最大值大于最大允许值(32767),则最大值被设置为最大允许值。
type: 阈值类型,有以下几种选择:cv2.THRESH_BINARY, cv2.THRESH_BINARY_INV, cv2.THRESH_TRUNC, cv2.THRESH_TOZERO, cv2.THRESH_TOZERO_INV。

阈值类型的解释:
cv2.THRESH_BINARY: 超过阈值的像素被赋予最大值,低于阈值的像素被赋予0。
cv2.THRESH_BINARY_INV: 低于阈值的像素被赋予最大值,超过阈值的像素被赋予0。
cv2.THRESH_TRUNC: 超过阈值的像素被赋予阈值。
cv2.THRESH_TOZERO: 低于阈值的像素被赋予0,超过阈值的像素被赋予最大值。
cv2.THRESH_TOZERO_INV: 超过阈值的像素被赋予0,低于阈值的像素被赋予最大值。

运行示例

import cv2

# 读取图像并转换为灰度图像
image = cv2.imread('115.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 使用cv2.threshold进行阈值化处理
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# 显示原始图像和阈值化后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Thresholded Image', thresh)
cv2.imwrite('thread.jpg',thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

上面的代码读取一个名为 ‘115.jpg’ 的图像文件,将其转换为灰度图像,并使用 cv2.threshold 函数进行阈值化处理。然后,它在窗口中显示原始图像和阈值化后的图像。运行输出效果如下图:

在这里插入图片描述

cv2.drawContours()

cv2.drawContours 是 OpenCV 库中的一个函数,用于在图像上绘制轮廓。它可以在二维或三维图像上绘制连续的轮廓。

函数解析

函数原型:

函数原型:
cv2.drawContours(image, contours, contourIndex, color[, thickness[, font[, fontScale[, label[, offset ]]]])

参数:
image: 要绘制轮廓的图像,可以是彩色图像或灰度图像。
contours: 轮廓的集合,可以是嵌套的列表或者单独的列表。每个轮廓是一个点数组,表示对象的边界。
contourIndex: 要绘制的轮廓的索引。如果为负数,则绘制所有轮廓。
color: 轮廓的颜色。可以是 RGB 三元组或十六进制颜色代码。
thickness: 轮廓的线宽。如果是负数(例如 -CV_FILLED),则填充轮廓内部。
font: 用于绘制标签的字体。
fontScale: 字体缩放因子。
label: 轮廓的标签。
offset: 绘制的偏移量。

运行示例

下面是一个简单的示例,展示如何使用 cv2.drawContours 函数在图像上绘制轮廓:

import cv2
import numpy as np

# 创建一个黑色背景图像
image = np.zeros((500, 500), dtype=np.uint8)

# 创建三个不同大小的圆形轮廓
contours = [np.array([[200, 200], [300, 200], [300, 300], [200, 300]]),
             np.array([[100, 100], [300, 100], [300, 300], [100, 300]]),
             np.array([[100, 200], [200, 250], [300, 250], [350, 200]]),
             ]

# 使用cv2.drawContours绘制所有轮廓,颜色为红色,线宽为2
cv2.drawContours(image, contours, -1, (255, 0, 0), 2)

# 显示绘制后的图像
cv2.imshow('Contours', image)
cv2.imwrite('Contours.jpg',image)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出的效果图:
在这里插入图片描述

cv2.findContours()

cv2.findContours 是 OpenCV 库中的一个函数,用于找到图像中的轮廓。这对于在图像处理中识别和标记对象非常有用。该函数可以处理二值图像,并在其中找到轮廓。

函数解析

函数原型:
cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])

函数详解:
image:源图像必须是灰度图像,可以是 8 位无符号整数或者 32 位浮点数。如果是彩色图像或者多通道图像,那么它会被自动转换为灰度图像。
mode:这是一个枚举(Enumeration)类型,用来选择轮廓检索模式。可以选择四种模式中的一种,比如 cv2.RETR_EXTERNAL(只检索最外层的轮廓),cv2.RETR_LIST(检索所有轮廓并将其保存为列表),cv2.RETR_CCOMP(检索所有轮廓并将其保存为两个层的树状结构),和 cv2.RETR_TREE(检索所有轮廓并将其保存为多层的树状结构)。
method:这也是一个枚举(Enumeration)类型,用来选择轮廓近似方法。可以选择三种方法中的一种,比如 cv2.CHAIN_APPROX_SIMPLE(压缩水平的、垂直的和斜的部分,也就是,函数通过压缩零水平、垂直和斜线交叉得到轮廓),cv2.CHAIN_APPROX_TC89_L1(使用 Ramer-Douglas-Peucker 算法,设置参数 epsilon 为 0.5)和 cv2.CHAIN_APPROX_TC89_KCOS(使用 Ramer-Douglas-Peucker 算法,设置参数 epsilon 为 0.1)。
contours: 这是一个列表,用来存储检测到的轮廓。轮廓是点的集合,每个轮廓都有一个“父”轮廓(如果有的话)。这个参数是返回的结果。
hierarchy: 这是一个可选的输出参数。它是一个包含多个轮廓层次信息的对象。如果指定了这个参数,那么函数会在这个对象中存储最外层轮廓和它的嵌套层次。
offset: 可选的参数,指定点相对于当前位置的偏移量。如果指定了这个参数,那么在计算轮廓时,会从图像的边界像素开始偏移。

运行示例

import cv2
import numpy as np

# 加载图像并转换为灰度图像
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 二值化图像
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# 查找轮廓
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 创建一个和原图大小一样的全黑图像,作为绘制轮廓的基础图像
drawn = np.zeros_like(image)

# 在新图像上绘制找到的轮廓
cv2.drawContours(drawn, contours, -1, (0, 255, 0), 3)

# 在窗口中显示原图和带有轮廓标记的图像
cv2.imshow('Original Image', image)
cv2.imshow('Drawn Image', drawn)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
上面的代码读取一个名为 ‘115.jpg’ 的图像文件,将其转换为灰度图像,并查找其中的轮廓。最后在窗口中显示原图和带有轮廓标记的图像。

cv2.bitwise_and()

cv2.bitwise_and() 是 OpenCV 库中的一个函数,用于对输入图像进行按位与操作。它将每个像素与对应的掩码像素进行按位与运算,生成结果图像。

函数解析

cv2.bitwise_and(src1, src2, mask[, dst[, dtype]])
参数详解:

src1 和 src2:源图像,必须是相同大小和类型。
mask:掩码图像,必须是与源图像相同大小和类型的单通道图像。
dst:输出图像,必须是相同大小和类型,并且与源图像和掩码图像的通道数相同。
dtype:可选参数,指定输出图像的数据类型。默认为 -1,表示使用与输入图像相同的数据类型。

运行示例

import cv2
import numpy as np

# 加载图像和掩码
image1 = cv2.imread('115.jpg')
image2 = cv2.imread('115.jpg')
mask = cv2.imread('115.jpg')

# 将图像转换为灰度图像
image1_gray = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
image2_gray = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
mask_gray = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)

# 对图像进行按位与操作(使用掩码)
result = cv2.bitwise_and(image1_gray, image2_gray, mask=mask_gray)

# 显示结果图像
cv2.imshow('Result', result)
cv2.imwrite('Result.jpg', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

这里为了省事,用的是同一幅图像,大家可以进行替换,使用不同图像进行。
在这里插入图片描述

cv2.inRange()

cv2.inRange是OpenCV库中的一个函数,用于从指定的颜色范围中过滤图像的像素。它通常用于颜色过滤或对象识别。

函数解析

函数原型:
cv2.inRange(src, lowerbord, upperbord, mask)

参数:
src: 输入的源图像,必须是8位或32位的单通道图像。
lowerbord: 颜色范围的下界,表示为包含三个元素的元组,分别对应红色、绿色和蓝色的范围(0-255)。
upperbord: 颜色范围的上界,同样表示为包含三个元素的元组,分别对应红色、绿色和蓝色的范围(0-255)。
mask: 输出图像的位深度,例如对于8位图像,值为CV_8U。
函数原型:

运行示例

以下是一个使用cv2.inRange函数的示例,该示例读取一张图像,然后仅显示图像中蓝色和绿色像素位于特定范围内的部分:

import cv2
import numpy as np

# 加载图像并转换为灰度图像
image = cv2.imread('115.jpg')
#gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 定义颜色范围的下界和上界
lower_range = np.array([110, 50, 50]) # 对于蓝绿色像素,下界为(110,50,50),上界为(130,255,255)
upper_range = np.array([130, 255, 255])

# 使用cv2.inRange过滤图像中的像素
mask = cv2.inRange(image, lower_range, upper_range)

# 将原图和过滤后的图像进行按位与操作,得到最终的输出图像
res = cv2.bitwise_and(image, image, mask=mask)

# 显示原图和输出图像
cv2.imshow('Original Image', image)
cv2.imshow('Filtered Image', res)
cv2.imwrite('Filtered Image.jpg', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
在这个示例中,我们首先加载一张图像。然后我们定义了一个颜色范围的下界和上界。接着我们使用cv2.inRange函数过滤图像中的像素,将过滤后的像素保存在一个掩码中。最后我们将原图和过滤后的图像进行按位与操作,得到最终的输出图像。

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

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

相关文章

小型图书管理系统

摘要 随着各图书馆的图书数量不断增多和图书馆规模的不断扩大,管理这些庞大的体系非常困难的,因为图书的情况是随时改变的,因此必需对图书进行动态的管理,而这对于一个管理人员来说是一件比较复杂的事情。 针对各个模块不同的数据…

ros2+UBUNTU读取STM32发送过来的数据(C++)

ATTENTION:一般ros2上位机访问STM32不是使用串口,即使树莓派有串口,我也不会用的,因为那还要去学习其他的语言,一般就是ros2---------ubs转串口-------STM32串口。 这个USB转串口,我们已经安装了CH340驱动了&#xff…

Qt篇——QChartView实现鼠标滚轮缩放、鼠标拖拽平移、鼠标双击重置缩放平移、曲线点击显示坐标

话不多说。 第一步&#xff1a;自定义QChartView&#xff0c;直接搬 FirtCurveChartView.h #ifndef FITCURVECHARTVIEW_H #define FITCURVECHARTVIEW_H #include <QtCharts>class FitCurveChartView : public QChartView {Q_OBJECTpublic:FitCurveChartView(QWidget *…

23、什么是卷积的 Feature Map?

这一节介绍一个概念&#xff0c;什么是卷积的 Feature Map&#xff1f; Feature Map, 中文称为特征图&#xff0c;卷积的 Feature Map 指的是在卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;通过卷积这一操作从输入图像中提取的特征图。 上一节用示意动图介绍了卷积算…

【开源】基于Vue和SpringBoot的开放实验室管理系统

项目编号&#xff1a; S 013 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S013&#xff0c;文末获取源码。} 项目编号&#xff1a;S013&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实…

3.镜像加速器

目录 1 阿里云 2 网易云 从网络上拉取镜像的时候使用默认的源可能会慢&#xff0c;用国内的源会快一些 1 阿里云 访问 阿里云-计算&#xff0c;为了无法计算的价值 然后登录&#xff0c;登录后搜索 容器镜像服务 点击容器镜像服务 点击管理控制台 点击 镜像工具->镜像…

Python的requests库实现HTTPS

嘿&#xff0c;Python程序员们&#xff01;今天我们要来点刺激的——使用Python的requests库实现HTTPS请求&#xff01;是的&#xff0c;你没有听错&#xff0c;我们要一起迈入HTTPS的神秘世界&#xff01; 首先&#xff0c;我们来了解一下HTTPS是什么。HTTPS是HTTP Secure的缩…

前端时间的失败总结复盘

分享失败经验&#xff0c;前段时间的总结复盘&#xff1a; 与伙伴合作面对异常决策要及时提出质疑&#xff0c;怼&#xff0c;别太客气&#xff0c;客气起来&#xff0c;小心翼翼在意他人情绪那么这个项目就会让人难受&#xff0c;不要因为因为伙伴身上有标签/光环/权威就觉得…

【C++】map和set的使用及注意事项

map和set的使用及注意事项 1.关联式容器2. 键值对3.set3.1接口介绍3.1.1构造3.1.2迭代器3.1.3容量3.1.4修改 3.2set使用及注意事项 4.multiset5.map6.multimap349. 两个数组的交集 1.关联式容器 在初阶阶段&#xff0c;我们已经接触过STL中的部分容器&#xff0c;比如&#xf…

持续集成交付CICD:Sonarqube 扫描本地项目(关联Gitlab项目与Jenkins流水线)

目录 一、实验 1.Java项目扫描 2.视图徽章 3.版本管理 一、实验 1.Java项目扫描 &#xff08;1&#xff09;指定项目信息关联的首页为GitLab项目&#xff0c;持续集成为Jenkins流水线 &#xff08;2&#xff09;命令行 sonar-scanner -Dsonar.host.urlhttp://192.168.20…

RAG落地实践、AI游戏开发、上海·深圳·广州线下工坊启动!星河社区重磅周

飞桨星河社区在成立的5年以来&#xff0c;已汇集660万AI开发者&#xff0c;覆盖深度学习初学者、在职开发者、企业开发者、高校教师、创业者等&#xff0c;已成为AI领域最具影响力的社区之一&#xff0c;无论是AI爱好者还是AI开发者&#xff0c;都能在这里探索AI的无限可能。 飞…

字符指针变量数组指针变量

字符指针变量 在指针的类型中&#xff0c;我们知道有一种指针叫做字符指针 一般的使用情况如下&#xff1a; #include<stdio.h> int main() {char ch w;char* pa &ch;*pa h;printf("%c", *pa);return 0; } 还有一种使用方法如下&#xff1a; #incl…

计算机速成课Crash Course - 07. 中央处理器

今天开始计算机速成课Crash Course的系列讲解。 更多技术文章&#xff0c;全网首发公众号 “摸鱼IT” 锁定 -上午11点 - &#xff0c;感谢大家关注、转发、点赞&#xff01; 计算机速成课Crash Course - 07. 中央处理器 07. 中央处理器 提示下&#xff0c;这集可能是最难的一…

Python-图片去重

直接上代码 # 修改一下第34行文件夹路径以及13行图片后缀名即可使用 import os from hashlib import md5def remove_duplicate_images(folder_path):image_files []duplicate_images set()# 遍历文件夹&#xff0c;找到所有 JPG 图片文件for root, dirs, files in os.walk(f…

LeetCode | 110. 平衡二叉树

LeetCode | 110. 平衡二叉树 OJ链接 首先计算出二叉树的高度然后计算当前节点的左右子树的高度&#xff0c;然后判断当前节点的左右子树高度差是否超过 1&#xff0c;最后递归地检查左右子树是否也是平衡的。 //计算二叉树的高度 int height(struct TreeNode* root) {if(root…

SOLIDWORKS弯曲特征在泵阀行业中的应用

弯曲特征-折弯 此类弯曲特征以绕三重轴的折弯轴折弯一个或多个实体。 定位三重轴和剪裁基准面&#xff0c;控制折弯的角度、位置和界限。 此弯曲类型可用于多种应用&#xff0c;包括工业设计、机械设计、解决金属冲压中的回弹条件以及从复杂的曲面形状中删除底切等。 本篇文章…

【每日易题】Leetcode上Hard难度的动态规划题目——地下城游戏的实现

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;博主最近一直在钻研动态规划算法&#xff0c;最近在Leetcode上刷题的时候遇到一个Hard难度的动态规划题&#xff0c;今天就借此机会来给大家分享…

CopyOnWriteArrayList怎么用

什么是CopyOnWriteArrayListCopyOnWriteArrayList常用方法CopyOnWriteArrayList源码详解CopyOnWriteArrayList使用注意点CopyOnWriteArrayList存在的性能问题CopyOnWriteArrayList 使用实例基本应用实例并发应用实例 拓展写时复制 什么是CopyOnWriteArrayList CopyOnWriteArra…

Uber Go 语言编码规范

uber-go/guide 的中文翻译 English 文档链接 Uber Go 语言编码规范 Uber 是一家美国硅谷的科技公司&#xff0c;也是 Go 语言的早期 adopter。其开源了很多 golang 项目&#xff0c;诸如被 Gopher 圈熟知的 zap、jaeger 等。2018 年年末 Uber 将内部的 Go 风格规范 开源到 G…

每天一点python——day85

#每天一点Python——85 #python常见的异常类型&#xff1a; #如图&#xff1a; #①数学运算异常【由于会报错&#xff0c;我直接全部注释掉了】 print(10/0) 输出&#xff1a;ZeroDivisionError: division by zero#②索引错误list1[1,2,3,4] print(list1[5])#找索引为4的元素 输…