OpenCV 图片处理与绘制

news2024/11/22 12:09:55

目录

1. 图片处理

1.1 灰度处理

1.1.1 图像灰度化处理

1.1.2 图像灰度化的算法

1.2 图像二值化

1.3 边缘检测

​编辑 2. 绘图

2.1 绘制线段

2.2 绘制矩形

2.3 绘制圆形

2.4 绘制椭圆

2.5 绘制多边形

2.6 绘制文字图片


1. 图片处理

1.1 灰度处理

        将彩色图像转化为灰度图像的过程是图像的灰度化处理。彩色图像中的每个像素的颜色
由R,G,B 三个分量决定,而每个分量中可取值0-255,这样一个像素点可以有1600 多万
(256*256*256=1677256)的颜色的变化范围。而灰度图像是R,G,B 三个分量相同的一种
特殊的彩色图像,其中一个像素点的变化范围为256 种,所以在数字图像处理中一般将各种
格式的图像转化为灰度图像以使后续的图像的计算量少一些。灰度图像的描述与彩色图像一
样仍然反映了整副图像的整体和局部的色度和高亮等级的分布和特征。

1.1.1 图像灰度化处理


        灰度化处理就是将一幅色彩图像转化为灰度图像的过程。彩色图像分为R,G,B 三个分
量,分别显示出红绿蓝等各种颜色,灰度化就是使彩色的R,G,B 分量相等的过程。灰度值
大的像素点比较亮(像素值最大为255,为白色),反之比较暗(像素最下为0,为黑色)。
图像灰度化核心思想是R = G = B ,这个值也叫灰度值。

1.1.2 图像灰度化的算法

        1.最大值法:使转化后的R,G,B 的值等于转化前3 个值中最大的一个,即:R=G=B=max

(R,G,B)。这种方法转换的灰度图亮度很高。

        2. 平均值法:是转化后R,G,B 的值为转化前R,G,B 的平均值。即:R=G=B=(R+G+B)/3。

这种方法产生的灰度图像比较柔和。

        3. 加权平均值法: 按照一定权值,对R,G,B 的值加权平均, 即:分别为R,G,B的权值,取不同的值形成不同的灰度图像。由于人眼对绿色最为敏感,红色次之,对蓝色的敏感性最低,因此使将得到较易识别的灰度图像。一般得到的灰度图像效果最好。


以下代码中会有四种方法实现灰度化:代码中的4个方法都可以单独拿出来使用,这里为了方便就把四种方法写在一起。

image_path = "./resource/robot.jpg" #待灰度化处理的照片的相对路径,也可以直接使用绝对路径

def gray_image():
    # method 1 : use the second parameter of imread() to read image as gray scale.
    img_handler = cv2.imread(image_path, cv2.IMREAD_COLOR)
    img_handler_gray = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)

    # methOd 2: cvtColor 颜色空间转换
    img_handler_gray = cv2.cvtColor(img_handler, cv2.COLOR_BGR2GRAY)


# # method 3: 平均值法:取R,G,B三者的平均值
    height, width, deep = img_handler.shape
    gray_img_info = (height, width, deep)
    # zeros()第二个参数必须要设置成np.uint8 ,否则灰度化会失败
    img_handler_gray = np.zeros(gray_img_info, np.uint8)
    print(height, width, deep)

    for i in range(0, height):
        for j in range(0, width):
            # 读取每一个像素点的B,G,R
            (b, g, r) = img_handler[i, j]
            # 取像素点中B,G,R的平均值
            gray = (int(b) + int(g) + int(r))/3
            # 将灰度图片中的像素点的B,G,R设置成平均值
            img_handler_gray[i, j] = np.uint8(gray)

    # method 4 : 加权平均值法
    # gray = r*0.299+g*0.587+b*0.114 三个加权值之和必须为1

    img_handler = cv2.imread(image_path, cv2.IMREAD_COLOR)
    (height, width, deep) = img_handler.shape
    img_info = (height, width, deep)
    img_handler_gray = np.zeros(img_info, np.uint8)

    for i in range(0, height):
        for j in range(0, width):
            b, g, r = img_handler[i, j]
            gray = r * 0.299 + g * 0.587 + b * 0.114
            img_handler_gray[i,j] = np.uint8(gray)

    cv2.imshow("original_image", img_handler)
    cv2.imshow("gray_image", img_handler_gray)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

代码运行结果:

1.2 图像二值化

        图像处理是计算机视觉和图像分析的一个重要领域,其中阈值化是一项常用的图像处理技术之一。在OpenCV中,提供了许多用于图像处理的函数和工具,其中cv2.threshold函数用于执行图像阈值化操作。

        图像阈值化是一种图像处理技术,它根据图像内像素点强度的分布规律设置一个阈值,然后根据像素点强度高于或低于这个阈值来进行一些处理。简单来说,就是通过设置一个阈值,将图像转换为二值图像,即像素点只有两种可能的强度值(通常是0和255)。这种处理技术可以用来突出图像中的特定区域或特征,例如边缘或纹理,从而简化后续的图像分析和处理步骤。

        二值化核心思想是设阈值,大于阈值的为0(黑色)或255(白色),使图像称为黑白图。阈值可固定,也可以自适应阈值。自适应阈值一般为一点像素与这点为中序的区域像素平均值或者高斯分布加权和的比较,其中可以设置一个差值也可以不设置。

        threshold 的函数如下,

ret, threshold = cv2.threshold(src, thresh, maxval, type) 
  • src 为输入的灰度图片

  • threshold 是预设的阈值 

  • maxval 像素值超过了阈值(或者小于阈值,取决于阈值类型)所赋予的值

  • type 阈值类型

    • cv2.THRESH_BINARY:二值化,像素值大于阈值的被赋予maxval,小于阈值的被赋予0。

    • cv2.THRESH_BINARY_INV:反二值化,与cv2.THRESH_BINARY相反,像素值大于阈值的被赋予0,小于阈值的被赋予maxval

    • cv2.THRESH_TRUNC:截断,像素值大于阈值的被赋予阈值,小于阈值的不变。

    • cv2.THRESH_TOZERO:设置为零,像素值小于阈值的被赋予0,大于阈值的不变。

    • cv2.THRESH_TOZERO_INV:反设置为零,与cv2.THRESH_TOZERO相反,像素值小于阈值的不变,大于阈值的被赋予0。

    • cv2.THRESH_OTSU:这是 Otsu 的二值化方法。这个方法会自动计算最佳阈值,使得两类的类间方差最大。当你使用 Otsu 方法时,设置的阈值(这里是0)会被忽略,Otsu 方法会自动计算一个最佳阈值。

  • 返回值ret : 二值化使用的阈值,当使用OTSU模式时返回自动计算的最佳阈值

  • 返回值threshold: 二值化之后的图像数据

使用不同阈值类型的代码为:每个阈值类型都需要调整预设的阈值,以达到最佳的效果

image_path = "./resource/robot.jpg"
def image_binarization():
    img_handler = cv2.imread(image_path,cv2.IMREAD_COLOR)
    img_handler_gray = cv2.cvtColor(img_handler,cv2.COLOR_BGR2GRAY)

    ret0, threshold0 = cv2.threshold(img_handler_gray,10,255,cv2.THRESH_BINARY)

    ret1, threshold1 = cv2.threshold(img_handler_gray, 10, 255, cv2.THRESH_BINARY_INV)

    ret2, threshold2 = cv2.threshold(img_handler_gray, 100, 255, cv2.THRESH_TRUNC)

    ret3, threshold3= cv2.threshold(img_handler_gray, 10, 255, cv2.THRESH_TOZERO)

    ret4, threshold4 = cv2.threshold(img_handler_gray, 100, 255, cv2.THRESH_TOZERO_INV)

    ret5, threshold5 = cv2.threshold(img_handler_gray, 0, 255, cv2.THRESH_OTSU)

    titles = ["THRESH_BINARY value"+str(ret0),"THRESH_BINARY_INV value"+str(ret1),"THRESH_TRUNC value"+str(ret2),"THRESH_TOZERO value"+str(ret3),
              "THRESH_TOZERO_INV value"+str(ret4),"THRESH_OTSU value"+str(ret5)]

    threshold_list = [threshold0,threshold1,threshold2,threshold3,threshold4,threshold5]

    for i in range(0, len(titles)):
        cv2.imshow(titles[i],threshold_list[i])

    cv2.waitKey(0)
    cv2.destroyAllWindows()

 不同阈值类型的二值化效果为(代码中的阈值并不是最佳阈值,所以每个阈值类型的效果不一致)下图中可以看到OTSU自动计算出来的阈值为177,效果是最好的。

1.3 边缘检测

        边缘检测的目的是在保留原有图像属性的情况下,显著减少图像的数据规模。目前有多
种算法可以进行边缘检测,虽然Canny 算法年代久远,但可以说它是边缘检测的一种标准算
法,而且仍在研究中广泛使用。
        Canny 边缘检测是从不同视觉对象中提取有用的结构信息并大大减少要处理的数据量
的一种技术,目前已广泛应用于各种计算机视觉系统。Canny 发现,在不同视觉系统上对边
缘检测的要求较为类似,因此,可以实现一种具有广泛应用意义的边缘检测技术。

边缘检测的一般标准包括:
        以低的错误率检测边缘,也即意味着需要尽可能准确的捕获图像中尽可能多的边缘。
检测到的边缘应精确定位在真实边缘的中心。
图像中给定的边缘应只被标记一次,并且在可能的情况下,图像的噪声不应产生假的边
缘。

        为了满足这些要求,Canny 使用了变分法。Canny 检测器中的最优函数使用四个指数项
的和来描述,它可以由高斯函数的一阶导数来近似。
        在目前常用的边缘检测方法中,Canny 边缘检测算法是具有严格定义的,可以提供良好
可靠检测的方法之一。由于它具有满足边缘检测的三个标准和实现过程简单的优势,成为边
缘检测最流行的算法之一。
Canny 边缘检测算法可以分为以下5 个步骤:
        1、使用高斯滤波器,以平滑图像,滤除噪声。
        2、计算图像中每个像素点的梯度强度和方向。
        3、应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
        4、应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
        5、通过抑制孤立的弱边缘最终完成边缘检测。

OpenCV里面提供有Canny边缘检测算法,使用代码为:

    image_path = "./resource/robot.jpg"
    img_handler = cv2.imread(image_path,cv2.IMREAD_COLOR)
    imgCanny = cv2.Canny(img_handler, 50, 50)

    cv2.imshow("origin_image",img_handler)
    cv2.imshow("Canny_edge_detection",imgCanny)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

运行结果为:

 2. 绘图

2.1 绘制线段

        OpenCV 中使用line(dst,pt1,pt2,color,thickness=None,lineType=None,shift=None)函数进行线段的绘制。
参数说明:

  • dst:输出图像。

  • pt1,pt2:必选参数。线段的坐标点,分别表示起始点和终止点

  • color:必选参数。用于设置线段的颜色

  • thickness:可选参数。用于设置线段的宽度

  • lineType:可选参数。用于设置线段的类型,可选8(8 邻接连接线-默认)、4(4

邻接连接线)和cv2.LINE_AA 为抗锯齿。

    # 1. 绘制直线,可设置线段的颜色的粗细
        line(dst,pt1,pt2,color,thickness=None,lineType=None,shift=None)
        cv2.line(image,(100,100),(100,200),color=(0,255,255),thickness=cv2.LINE_8,lineType=cv2.LINE_AA) # yellow
        cv2.line(image, (200, 100), (200, 200), color=(0, 0, 255), thickness=cv2.LINE_4, lineType=cv2.LINE_AA) #red

运行结果:

2.2 绘制矩形

        矩形的确定规则:已知两个对角的顶点坐标,能确定唯一的矩形。

rectangle(img,pt1,pt2,color,thickness=None,lineType=None,shift=None)
参数说明:

  • img:画布或者载体图像

  • pt1,pt2:必选参数矩形的顶点,分别表示顶点与对角顶点,即矩形的左上角与

右下角(这两个顶点可以确定一个唯一的矩形)

  • color:必选参数。用于设置矩形的颜色

  • thickness:可选参数。用于设置矩形边的宽度,当值为负数时,表示对矩形进行

填充

  • lineType:可选参数。用于设置线段的类型,可选8(8 邻接连接线-默认)、4(4

邻接连接线)和cv2.LINE_AA 为抗锯齿

    # 2. 绘制矩形
    # rectangle(img,pt1,pt2,color,thickness=None,lineType=None,shift=None)
    cv2.rectangle(image,(200,400),(400,200),(0,255,0),1,8)

结果为:

2.3 绘制圆形

 圆形的确定规则:圆心坐标和半径可以确定唯一的圆。

cv2.circle(img, center, radius, color[,thickness[,lineType]])

参数说明:

  • img:画布或者载体图像
  • center:必选参数,为圆心坐标,格式: (50,50)
  • radius:必选参数,半径
  • color:必选参数,颜色
  • thickness: 线条粗细。默认为1.如果-1 则为填充实心。
  • lineType:线条类型。默认是8,连接类型。如下表格说明
参数     说明
cv2.FILLED填充
cv2.LINE_44连接类型
cv2.LINE_88连接类型
cv2.LINE_AA抗锯齿,该参数会让线段更平滑
    # 3. 绘制圆形
    # cv2.circle(img, center, radius, color[,thickness[,lineType]])
    cv2.circle(image,(300,300),300,(255,255,0))

运行结果:

2.4 绘制椭圆

cv2.ellipse(img, center, axes, angle, StartAngle, endAngle,color[,thickness[,lineType]])

参数介绍:

  • center:椭圆的中心点,(x,y)
  • axes:指的是短半径和长半径,(m,n)
  • angle:指的是逆时针旋转的角度
  • StartAngle:圆弧起始角的角度
  • endAngle:圆弧终结角的角度。90,180,360,分别表示1/4椭圆,1/2椭圆,完整椭圆
  • img、color 可以参考圆的说明

Note:第五个参数endAngle指的是逆时针开始画图的角度,第六个指的是逆时针结束画图的角度
四五六参数若加上符号,表示的反方向,即顺时针方向

# 4.绘制椭圆
    cv2.ellipse(image,center = (300,300),axes= (100,200),angle=0,startAngle=0,endAngle=360,color = (0,255,255),lineType=cv2.LINE_AA)

运行结果

2.5 绘制多边形

 cv2.polylines(img,[pts],isClosed, color[,thickness[,lineType]])

参数介绍:

  • pts:多边形的顶点
  • isClosed:是否闭合。(True/False)
  • 其他参数参照圆的绘制参数

 绘制多边形要先确定多边形的每一个顶点的坐标,将这些坐标传递给参数pts

    #5. 绘制多边形
    #point 中为多边形的所有顶点坐标   
    points = np.array([[150,100],[160,210],[200,300],[300,400],[500,500]],np.int32)
    points.reshape((-1,1,2))
    cv2.polylines(image,[points],True,color=(255,30,30))

结果为:

上面所有图形绘制的整体代码为:

运行结果:

2.6 绘制文字图片

在图片中标记时会用到文字,这里介绍一下如何在图片中绘制文字。

cv2.putText(img, str, origin, font, size,color,thickness)

各参数依次是:图片,添加的文字,左上角坐标(整数),字体,字体大小,颜色,字体粗细.

在坐标(250,50)处写上文字Test, 实现代码:

    # 6.绘制文字
    font = cv2.FONT_HERSHEY_SIMPLEX
    cv2.putText(image, 'Test', (250, 50), font, 1, (200, 200, 0), 2, cv2.LINE_AA)

运行结果:

上面所有图形绘制的整体代码为:

img_info = (600,600,3) #(height, width, deep)
    image = np.zeros(img_info,np.uint8)
    # 1. 绘制直线,可设置线段的颜色的粗细
    # line(dst,pt1,pt2,color,thickness=None,lineType=None,shift=None)
    cv2.line(image,(100,100),(100,200),color=(0,255,255),thickness=cv2.LINE_8,lineType=cv2.LINE_AA) # yellow
    cv2.line(image, (200, 100), (200, 200), color=(0, 0, 255), thickness=cv2.LINE_4, lineType=cv2.LINE_AA) #red
    # 2. 绘制矩形
    # rectangle(img,pt1,pt2,color,thickness=None,lineType=None,shift=None)
    cv2.rectangle(image,(200,400),(400,200),(0,255,0),1,8)
    # 3. 绘制圆形
    # cv2.circle(img, center, radius, color[,thickness[,lineType]])
    cv2.circle(image,(300,300),300,(255,255,0),lineType=cv2.LINE_AA)
    # # 4.绘制椭圆
    cv2.ellipse(image,center = (300,300),axes= (100,200),angle=0,startAngle=0,endAngle=360,color = (0,255,255),lineType=cv2.LINE_AA)
    #5. 绘制多边形
    points = np.array([[150,100],[160,210],[200,300],[300,400],[500,500]],np.int32)
    points.reshape((-1,1,2))
    cv2.polylines(image,[points],True,color = (255,30,30))
    # 6.绘制文字
    font = cv2.FONT_HERSHEY_SIMPLEX
    cv2.putText(image, 'Test', (250, 50), font, 1, (200, 200, 0), 2, cv2.LINE_AA)

    cv2.imshow("image_line",image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

运行结果:

 

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

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

相关文章

uniapp 城市选择插件

uniapp城市选择插件 如上图 地址 完整demo <template><view><city-selectcityClick"cityClick":formatName"formatName":activeCity"activeCity":hotCity"hotCity":obtainCitys"obtainCitys":isSearch&quo…

实验室资源调度系统:基于Spring Boot的创新

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

【Triton 教程】融合注意力 (Fused Attention)

Triton 是一种用于并行编程的语言和编译器。它旨在提供一个基于 Python 的编程环境&#xff0c;以高效编写自定义 DNN 计算内核&#xff0c;并能够在现代 GPU 硬件上以最大吞吐量运行。 更多 Triton 中文文档可访问 →https://triton.hyper.ai/ 这是根据 Tri Dao 的 Flash At…

近源渗透|HID ATTACK从0到1

前言 对于“近源渗透”这一术语&#xff0c;相信大家已经不再感到陌生。它涉及通过伪装、社会工程学等手段&#xff0c;实地侵入企业办公区域&#xff0c;利用内部潜在的攻击面——例如Wi-Fi网络、RFID门禁、暴露的有线网口、USB接口等——获取关键信息&#xff0c;并以隐蔽的…

大数据入门-什么是Flink

这里简单介绍Flink的概念、架构、特性等。至于比较详细的介绍&#xff0c;会单独针对这个组件进行详细介绍&#xff0c;可以关注博客后续阅读。 一、概念 Apache Flink 是一个框架和分布式处理引擎&#xff0c;用于在无边界和有边界数据流上进行有状态的计算。 Flink的四大基…

Excel如何批量导入图片

这篇文章将介绍在Excel中如何根据某列数据&#xff0c;批量的导入与之匹配的图片。 准备工作 如图&#xff0c;我们准备了一张员工信息表以及几张员工的照片 可以看到&#xff0c;照片名称是每个人的名字&#xff0c;与Excel表中的B列&#xff08;姓名&#xff09;对应 的卢易…

9个最佳WordPress PDF插件(查看器、嵌入和下载)

在过去的几年里&#xff0c;我们一直在使用不同的 PDF 插件在我们的网站上创建、编辑和嵌入文档。 然而&#xff0c;经过多次尝试和错误&#xff0c;我们意识到并不是每个插件都是相同的。事实上&#xff0c;为您的企业或电子商务网站选择合适的 PDF 插件可能是一项艰巨的任务…

java-贪心算法

1. 霍夫曼编码&#xff08;Huffman Coding&#xff09; 描述&#xff1a; 霍夫曼编码是一种使用变长编码表对数据进行编码的算法&#xff0c;由David A. Huffman在1952年发明。它是一种贪心算法&#xff0c;用于数据压缩。霍夫曼编码通过构建一个二叉树&#xff08;霍夫曼树&a…

Seatunnel运行时报错Caused by: java.lang.NoClassDefFoundError: com/mysql/cj/MysqlType

报错 [] 2024-11-21 16:46:27,526 ERROR org.apache.seatunnel.core.starter.SeaTunnel - Fatal Error, [] 2024-11-21 16:46:27,526 ERROR org.apache.seatunnel.core.starter.SeaTunnel - Please submit bug report in https://github.com/apache/seatunnel/issues[] 2024-11…

vue自定义指令--一键复制

vue项目中想要实现点击按钮一键复制&#xff0c;可以通过vue的自定义指令directive来实现。 一、新建directive.js文件 新建directive.js文件&#xff0c;用于定义所有的自定义指令。 import { Toast } from vant;const directive {// 一键复制copy:{bind (el, { value }) …

AI 大模型重塑软件开发的未来

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

python: generator model using sql server 2019

設計或生成好數據庫&#xff0c;可以生成自己設計好的框架項目 # encoding: utf-8 # 版权所有 &#xff1a;2024 ©涂聚文有限公司 # 许可信息查看 &#xff1a;言語成了邀功盡責的功臣&#xff0c;還需要行爲每日來值班嗎 # 描述&#xff1a; : 生成实体 # Author …

使用redis-shake工具进行redis的数据同步

前言&#xff1a; 工作中将常遇到测试环境和正式环境的数据同步或者需要进行数据迁移&#xff0c;对于mysql数据库的方案倒是不少&#xff0c;但是redis中如何快速便捷的迁移呢&#xff1f;答案是阿里云提供的:redis-shake RedisShake是阿里云基于豌豆荚开源的redis-port进行…

轻松实现文件远程传输:使用PicoShare搭建轻量级文件共享系统

文章目录 前言1. 本地安装Docker2. 本地部署PicoShare3. 如何使用PicoShare4. 公网远程访问本地 PicoShare4.1 内网穿透工具安装4.2 创建远程连接公网地址 5. 固定PicoShare公网地址 前言 什么是PicoShare&#xff1f; PicoShare 是一个由 Go 开发的轻量级开源共享文件系统。…

路由缓存后跳转到新路由时,上一路由中的tip信息框不销毁问题解决

上一路由tip信息框不销毁问题解决 路由缓存篇问题描述及截图解决思路关键代码 路由缓存篇 传送门 问题描述及截图 路由缓存后跳转新路由时&#xff0c;上一个路由的tip信息框没销毁。 解决思路 在全局路由守卫中获取DOM元素&#xff0c;通过css去控制 关键代码 修改文…

iOS 18.2 Beta 4开发者预览版发布,相机新增辅助功能

昨天刚连发iOS 18.1.1正式版、iOS 17.7.2正式版&#xff0c;今天凌晨&#xff0c;苹果就又发布iOS 18.2 Beta 4&#xff0c;据了解iOS18.2正式版将在 12 月初发布。那么这次的更新又有哪些变化呢&#xff1f;下面我们就来一起了解一下。 iOS 18.2 Beta 4的版本号为&#xff1a;…

PCB 间接雷击模拟

雷击是一种危险的静电放电事件&#xff0c;其中两个带电区域会瞬间释放高达 1 千兆焦耳的能量。雷击就像一个短暂而巨大的电流脉冲&#xff0c;会对建筑物和电子设备造成严重损坏。雷击可分为直接和间接两类&#xff0c;其中间接影响是由于感应能量耦合到靠近雷击位置的物体。间…

易语言学习-cnblog

易语言数据类型 数值转换命令&#xff08;自己学&#xff09; 数值到大写&#xff08;&#xff09;将一个数值转换到中文读法&#xff0c;第二个参数为是否为简体。 数值到大写&#xff08;123.44&#xff0c;假&#xff09; 猜测结果 数值到金额&#xff08;&#xff09;将双…

接口小练习

文章目录 1.字符串最后一个单词的长度2.字符串中的第一个唯一字符3.验证回文串 1.字符串最后一个单词的长度 计算字符串最后一个单词的长度&#xff0c;单词以空格隔开&#xff0c;字符串长度小于5000。&#xff08;注&#xff1a;字符串末尾不以空格为结尾&#xff09; 输入描…

26届JAVA 学习日记——Day14

2024.11.21周四 今天仍然在补充基础知识&#xff0c;项目进度较慢&#xff0c;明天再回顾一下Java8的新特性。 八股 操作系统 什么是缓冲区溢出&#xff1f; 缓冲区溢出是一种常见的计算机安全漏洞&#xff0c;它发生在程序试图将过多的数据写入缓冲区&#xff08;即一块用…