30min 的OpenCV learning Note

1.安装python和pycharm与环境搭配

打开Windows终端:(win+R)(一般使用清华镜像网站安装库比较快)

pip install opencv-contrib-python -i https://pypi.mirrors.ustc.edu.cn/simple

或者

python -m pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple

2.基础操作学习

库函数:import cv2;import numpy

代码解释:

ONE(打开,图像大小与窗口):

1. print(cv2.getVersionString())

  • 作用:打印当前安装的OpenCV库的版本号。这对于调试和确保你的代码与特定版本的OpenCV兼容非常有用。

  • 函数格式cv2.getVersionString() 是一个无参数的函数,它返回一个字符串,表示安装的OpenCV库的版本号。

2. image = cv2.imread("opencv_logo.jpg")

  • 作用:从指定路径加载图像文件。如果文件成功读取,图像数据将被存储在变量image中;如果文件不存在或无法读取,image将被设置为None

  • 函数格式cv2.imread(filepath, flags=cv2.IMREAD_COLOR)

    • filepath:图像文件的路径。

    • flags(可选):指定如何读取图像。常用的值有:

      • cv2.IMREAD_COLOR:加载彩色图像。任何图像的透明度都会被忽略(这是默认值)。

      • cv2.IMREAD_GRAYSCALE:以灰度模式加载图像。

      • cv2.IMREAD_UNCHANGED:包括alpha通道的加载图像。

3. print(image.shape)

  • 作用:打印图像的形状。对于彩色图像,这将是一个包含三个元素的元组,分别表示图像的高度、宽度和颜色通道数(对于BGR图像,通道数为3)。如果图像是灰度图,则只包含两个元素:高度和宽度。

  • 说明:这一步有助于了解图像的尺寸和是否成功加载(如果imageNone,尝试访问.shape会引发错误)。

4. cv2.imshow("image", image)

  • 作用:在一个窗口中显示图像。窗口的标题由第一个参数指定,图像数据由第二个参数提供。

  • 函数格式cv2.imshow(winname, mat)

    • winname:窗口的名称,是一个字符串。

    • mat:要显示的图像。它应该是uint8或float32类型的numpy数组。

5. cv2.waitKey()

  • 作用:等待用户按键。这个调用是必需的,以便cv2.imshow()创建的窗口能够保持打开状态,直到用户按下任意键。

  • 函数格式cv2.waitKey([delay])

    • delay(可选):等待键盘事件的时间(以毫秒为单位)。如果参数是0,则无限期等待键盘事件。

注意:在程序结束时,通常还需要调用cv2.destroyAllWindows()来关闭所有OpenCV创建的窗口。这虽然不是这段代码的一部分,但在实际应用中是一个好习惯。

TWO(图像RGB颜色通道与灰色转换):

首先使用cv2.imshow函数分别显示了图像image的蓝色、绿色和红色通道,然后使用cv2.cvtColor函数将图像从BGR颜色空间转换为灰度图像,并显示了转换后的灰度图像。

  1. 显示蓝色通道

    cv2.imshow("blue", image[:, :, 0])

    这行代码显示了图像image的蓝色通道。在BGR颜色空间中,蓝色通道是图像的第三个维度(索引为2,但由于Python索引从0开始,所以是索引0)。但是,这里直接访问image[:, :, 0]实际上是访问了第一个通道,即蓝色通道(这里OPENCV图像是以RGB格式加载的,这通常是正确的,因为OpenCV默认以BGR格式加载图像)。

  2. 显示绿色通道

    cv2.imshow("green", image[:, :, 1])
  3. 显示红色通道

    cv2.imshow("red", image[:, :, 2])
  4. 转换为灰度图像并显示

    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    cv2.imshow("gray", gray)

    这两行代码首先将图像image从BGR颜色空间转换为灰度图像,并将结果存储在变量gray中。cv2.cvtColor函数是OpenCV中用于颜色空间转换的函数,cv2.COLOR_BGR2GRAY是将其从BGR颜色空间转换为灰度颜色空间的转换代码。

THREE(图像截取):

使用Python的切片操作来从原始图像image中裁剪出一个区域,并将这个裁剪后的区域存储在变量crop中。然后使用cv2.imshow函数来显示这个裁剪后的图像。

# 从原始图像中裁剪出一个区域
# image[y_start:y_end, x_start:x_end]
# 其中,y_start和x_start是裁剪区域左上角的坐标(包含),y_end和x_end是裁剪区域右下角的坐标(不包含)
crop = image[10:170, 40:200]
# 使用OpenCV的imshow函数显示裁剪后的图像
cv2.imshow("crop", crop)

FOUR(创建图形【方形圆形字体】):

使用了OpenCV库(通过import cv2)和NumPy库(通过import numpy as np)来创建一个黑色的图像,并在该图像上绘制了一条线、一个矩形、一个圆和一段文本。

  1. 创建黑色图像

    image = np.zeros([300, 300, 3], dtype=np.uint8)

    使用NumPy的zeros函数创建一个300x300像素的黑色图像(因为所有像素的RGB值都被初始化为0)。这是一个三维数组,其中前两个维度代表图像的高度和宽度,第三个维度代表颜色通道(RGB)。dtype=np.uint8指定了数组的数据类型为无符号8位整数,这是图像数据常用的数据类型。

  2. 绘制线条

    cv2.line(image, (100, 200), (250, 250), (255, 0, 0), 2)

    使用cv2.line函数在图像上绘制一条从点(100, 200)到点(250, 250)的红色(BGR格式中的(255, 0, 0))线条,线条的厚度为2。

  3. 绘制矩形

    cv2.rectangle(image, (30, 100), (60, 150), (0, 255, 0), 2)

    使用cv2.rectangle函数在图像上绘制一个左上角为(30, 100),右下角为(60, 150)的绿色(BGR格式中的(0, 255, 0))矩形,矩形的边框厚度为2。

  4. 绘制圆

    cv2.circle(image, (150, 100), 20, (0, 0, 255), 3)

    使用cv2.circle函数在图像上绘制一个圆心为(150, 100),半径为20的蓝色(BGR格式中的(0, 0, 255))圆,圆的边框厚度为3。

  5. 添加文本

    cv2.putText(image, "hello", (100, 50), 0, 1, (255, 255, 255), 2, 1)

    使用cv2.putText函数在图像上添加文本“hello”。文本的左下角位于点(100, 50),字体类型为0(OpenCV内置字体之一),字体缩放比例为1,颜色为白色(BGR格式中的(255, 255, 255)),线条厚度为2。最后一个参数1指定了线条类型(用于指定字体是否加粗等,但在这个上下文中,它主要影响文本的渲染方式。lineType线条的类型,如 cv2.LINE_8cv2.LINE_AA 等。对于文本来说,这个参数通常不重要,因为文本绘制有其自己的抗锯齿处理)。

FIVE(图像滤波):

分别应用高斯模糊(Gaussian Blur)和中值模糊(Median Blur)两种滤波技术,并显示原始图像和两种模糊处理后的图像。

有一点需要注意:在调用cv2.waitKey()时,最好指定一个参数(通常是0),这样程序就会等待用户按键后再继续执行。虽然不指定参数在某些环境中可能也能正常工作,但明确指定参数是一个好习惯,可以避免潜在的混淆。

# 检查图像是否成功读取
if image is None:
print("Error: Image could not be read.")
else:
# 应用高斯模糊,

(5, 5): 这是一个元组,指定了高斯核的大小。核的大小是模糊的主要参数之一,较大的核会导致更强烈的模糊效果。

0: 这个参数是高斯核在X和Y方向上的标准差。如果您将此参数设置为0,则函数会根据核的大小自动计算一个合适的标准差。标准差越大,模糊效果越明显。

gauss = cv2.GaussianBlur(image, (5, 5), 0)

# 应用中值模糊

5:这是一个整数,指定了中值滤波器的邻域大小。它必须是正奇数。在这个例子中,滤波器的大小是5x5。中值滤波器用邻域内像素的中位数来替换中心像素的值,这对于去除椒盐噪声(salt-and-pepper noise)特别有效。

median = cv2.medianBlur(image, 5)

SIX(检测角点):

使用了OpenCV库来检测图像中的角点,并在原始图像上标记这些角点。

  1. 转换为灰度图像

    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    使用cv2.cvtColor()函数将原始图像从BGR颜色空间转换为灰度图像。这是因为角点检测通常在灰度图像上进行,以减少计算量并简化问题。

  2. 检测角点

    corners = cv2.goodFeaturesToTrack(gray, 500, 0.1, 10)

    使用cv2.goodFeaturesToTrack()函数在灰度图像上检测角点。这个函数的参数包括:

    corners是一个包含角点坐标的数组,每个角点是一个(x, y)坐标的浮点数对。

    • gray: 输入的灰度图像。
    • 500: 最多要返回的角点数量。注意,实际返回的角点数量可能少于这个值,具体取决于图像和其他参数。
    • 0.1: 角点检测的质量级别,一个介于0到1之间的值,值越低,检测到的角点越多。
    • 10: 最小角点之间的欧氏距离,以像素为单位。这有助于避免检测到的角点过于集中。
  3. 在图像上标记角点

    for corner in corners:
    x, y = corner.ravel()
    cv2.circle(image, (int(x), int(y)), 3, (255, 0, 255), -1)

    遍历检测到的角点,并使用cv2.circle()函数在原始图像上以每个角点为中心绘制一个圆。这里,corner.ravel()用于将角点坐标(通常是一个二维数组)转换为一维数组,从而可以分别访问xy坐标。圆的半径设置为3,颜色设置为粉红色((255, 0, 255)),-1表示圆将被填充。

SEVEN(匹配查找):

用于在一张图片中查找与给定模板相匹配的区域,并在原始图像上绘制这些区域的边界框。

  1. 模板匹配结果的索引:在np.where(match >= 0.9)中,返回的locations是一个元组,其中包含了满足条件的坐标的索引。由于match是一个二维数组,locations将有两个元素,分别对应yx坐标的索引。但是,由于OpenCV的坐标系统通常使用(x, y)格式,您可能需要调整这些索引以正确映射到图像坐标。

# 转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 定义模板
template = gray[75:105, 235:265]
if template.size == 0:
print("Error: Template has zero size.")
exit()
# 执行模板匹配
match = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED)
# 找到匹配位置
threshold = 0.9
locations = np.where(match >= threshold)
  1. w, h = template.shape[0:2]:
    • 这行代码从模板图像的shape属性中获取模板的宽度(w)和高度(h)。template.shape返回一个元组,通常包含三个元素(对于二维图像,第三个元素是颜色通道数,但在这里因为是灰度图,所以只有一个颜色通道,且我们不需要它)。通过[0:2]切片,我们选取了前两个元素,即图像的高度和宽度,并将它们分别赋值给hw
  2. for p in zip(*locations[::-1])::
    • locations = np.where(match >= threshold)这行代码生成了一个包含两个数组的元组,这两个数组分别表示满足匹配阈值条件的y(行索引)和x(列索引)坐标的索引。
    • locations[::-1]将这两个数组的顺序反转,因为np.where默认返回的是(y_indices, x_indices),而OpenCV中的坐标系统是(x, y)。通过反转,我们得到(x_indices, y_indices)
    • zip(*locations[::-1])将这两个索引数组“解包”并重新组合成元组的元组,每个内部元组包含一对(x, y)坐标。zip函数在这里实际上是在做“转置”的工作。
    • for p in ...遍历这些(x, y)坐标对。
  3. x1, y1 = p[0], p[1]:
    • 对于每个坐标对p,我们将其分解为x1y1,即矩形边界框的左上角坐标。
  4. x2, y2 = x1 + w, y1 + h:
    • 计算矩形边界框的右下角坐标。通过将左上角坐标x1y1分别加上模板的宽度w和高度h,我们得到边界框的右下角坐标x2y2
  5. cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2):
    • 使用cv2.rectangle函数在原始图像image上绘制一个矩形。参数(x1, y1)(x2, y2)定义了矩形的左上角和右下角坐标。
    • 参数(0, 255, 0)定义了矩形的颜色,这里是绿色(BGR格式)。
    • 最后一个参数2定义了矩形边界的线条粗细。

EIGHT(读取灰度图):

从同一张图像中读取灰度图,然后分别应用拉普拉斯边缘检测和Canny边缘检测。但是,有一点需要注意,当您使用 cv2.Laplacian() 函数时,如果图像是8位无符号整数(即 np.uint8 类型),并且您指定了 cv2.CV_64F 作为输出图像的深度,那么返回的 laplacian 图像将是一个浮点数数组,其值可能超出标准8位图像的显示范围(即0到255)。

为了正确显示 laplacian 图像,您可能需要将其数据类型转换回 np.uint8 并进行归一化或截断到适当的范围。然而,对于可视化目的,简单的归一化到0-255范围并转换为 np.uint8 通常就足够了。

# 读取图像为灰度图
gray = cv2.imread("opencv_logo.jpg", cv2.IMREAD_GRAYSCALE)
# 应用拉普拉斯边缘检测
laplacian = cv2.Laplacian(gray, cv2.CV_64F)
# 将拉普拉斯图像归一化到0-255范围并转换为uint8
laplacian = np.uint8(np.absolute(laplacian / np.max(laplacian)) * 255)
# 应用Canny边缘检测
canny = cv2.Canny(gray, 100, 200)

注意关键点:

  1. 我使用了 np.absolute() 来确保所有值都是非负的,因为拉普拉斯算子可能会产生负值。
  2. 我使用了 np.max(laplacian) 来找到拉普拉斯图像中的最大值,并将其用作归一化的除数。这样,拉普拉斯图像中的所有值都将被缩放到0到255的范围内。

NiNE(阈值处理):

使用了全局阈值处理(固定阈值和Otsu阈值)、以及自适应阈值处理。

  1. 读取灰度图像

    gray = cv2.imread("bookpage.jpg", cv2.IMREAD_GRAYSCALE)

    这行代码读取名为"bookpage.jpg"的图像文件,并将其转换为灰度图像。

  2. 全局固定阈值处理

    ret, binary = cv2.threshold(gray, 10, 255, cv2.THRESH_BINARY)

    这里,您使用了一个固定的阈值(10)来将灰度图像转换为二值图像。所有灰度值大于10的像素点被设置为255(白色),其余被设置为0(黑色)。ret是实际使用的阈值(在这种情况下,它应该是您指定的10,但可能会因为图像数据类型或内部处理而略有不同)。

  3. 自适应阈值处理

    binary_adaptive = cv2.adaptiveThreshold(
    gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 115, 1)

    自适应阈值处理会根据图像中每个像素周围的局部区域来计算阈值。这里,您使用了高斯加权和(cv2.ADAPTIVE_THRESH_GAUSSIAN_C),这意味着在计算阈值时,每个像素的邻域将被高斯加权。115是常数,从每个像素的加权平均值中减去以得到最终的阈值。1表示邻域的大小(在这个例子中,它实际上指定了11x11的邻域大小,因为OpenCV中邻域大小是奇数且由参数值加1得到)。

  4. Otsu阈值处理

    ret1, binary_otsu = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

    Otsu阈值处理是一种自动选择最佳阈值的方法,用于将图像分割为前景和背景。这里,您通过添加cv2.THRESH_OTSU标志来告诉cv2.threshold函数自动计算最佳阈值。0作为阈值参数在这里被忽略,因为Otsu方法会覆盖它。ret1将包含计算出的最佳阈值。

TEN(腐蚀与膨胀):

import cv2 # 导入OpenCV库,这是一个用于图像处理和计算机视觉的强大库。
import numpy as np # 导入NumPy库,这是一个用于科学计算的基础库,提供了高性能的多维数组对象和相关工具。
# 使用OpenCV的imread函数读取名为"opencv_logo.jpg"的图像文件,并指定以灰度模式读取(cv2.IMREAD_GRAYSCALE)。
# 这将返回一个灰度图像,其中每个像素的亮度值范围是0到255。
gray = cv2.imread("opencv_logo.jpg", cv2.IMREAD_GRAYSCALE)
# 使用OpenCV的threshold函数对灰度图像进行二值化处理。
# 参数gray是源图像,200是阈值,255是当像素值超过阈值时应该赋予的新值(对于THRESH_BINARY_INV类型)。
# cv2.THRESH_BINARY_INV是阈值类型,表示进行反二值化操作,即大于阈值的像素被设置为0(黑色),小于或等于阈值的像素被设置为255(白色)。
# 函数返回两个值,第一个值(通常不关心)是实际使用的阈值(可能由于自动阈值选择算法而略有不同),第二个值是二值化后的图像。
_, binary = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY_INV)
# 使用NumPy的ones函数创建一个5x5的二维数组,数组中的每个元素都是1,数据类型为无符号8位整数(np.uint8)。
# 这个数组将用作形态学操作(如腐蚀和膨胀)中的结构元素或核。
kernel = np.ones((5, 5), np.uint8)
# 使用OpenCV的erode函数对二值图像进行腐蚀操作。
# 参数binary是输入图像,kernel是前面创建的结构元素。
# 腐蚀操作会使图像中的前景对象(白色区域)变小,通常用于去除小的噪点或分离连接的对象。
erosion = cv2.erode(binary, kernel)
# 使用OpenCV的dilate函数对二值图像进行膨胀操作。
# 参数和腐蚀操作相同,但膨胀操作会使图像中的前景对象(白色区域)变大,通常用于填补前景对象中的小洞或连接相邻的对象。
dilation = cv2.dilate(binary, kernel)

ELEVEN(图像捕获):

用于从计算机的默认摄像头捕获视频流,并在一个窗口中实时显示这些视频帧。

# 初始化视频捕获对象,参数0通常代表计算机的默认摄像头
capture = cv2.VideoCapture(0)
# 使用一个无限循环来持续捕获视频帧
while True:
# capture.read()方法捕获视频帧
# 它返回两个值:
# ret是一个布尔值,如果读取帧成功则为True,如果文件结束或发生错误则为False
# frame是捕获的帧图像
ret, frame = capture.read()
# 如果正确读取了帧,ret为True
if ret:
# 显示捕获的帧
cv2.imshow("camera", frame)
# cv2.waitKey(1)等待1毫秒,检查是否有键盘事件
# 如果用户按下了键,则返回按键的ASCII码;如果没有按键,则返回-1
key = cv2.waitKey(1)
# 如果用户按下了任意键(key不等于-1),则退出循环
if key != -1:
break
# 释放视频捕获对象
capture.release()

注意,我在代码中添加了对ret的检查。这是一个好习惯,因为它可以防止在无法从摄像头读取帧(例如,如果摄像头被断开)时显示空窗口或引发错误。

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

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

相关文章

rabbitMQ 简单使用

安装 rabbitMQ 下载地址:rabbitmq-3.12.0 安装 windows rabbitMQ 需要的命令 进入 rabbitMQ 的 sbin 目录后 cmd (需要管理员权限) rabbitmq-plugins.bat enable rabbitmq_management随后重启 rabbitMQ #关闭服务 net stop rabbitmq #开…

openpnp - juki吸嘴尺寸

文章目录 openpnp - juki吸嘴尺寸概述笔记吸嘴可以对应的最小元件尺寸END openpnp - juki吸嘴尺寸 概述 在网上买的juki吸嘴的商品页面,并没有具体的吸嘴尺寸。 现在贴片时,要根据吸嘴外径大小来决定具体元件要用哪种吸嘴,先自己量一下。 …

2024 uniapp入门教程 01:含有vue3基础 我的第一个uniapp页面

uni-app官网uni-app,uniCloud,serverless,快速体验,看视频,10分钟了解uni-app,为什么要选择uni-app?,功能框架图,一套代码,运行到多个平台https://uniapp.dcloud.net.cn/ 准备工作:HBuilder X 软件 HBuilder X 官网下载&#xf…

迁移学习案例-python代码

大白话 迁移学习就是用不太相同但又有一些联系的A和B数据,训练同一个网络。比如,先用A数据训练一下网络,然后再用B数据训练一下网络,那么就说最后的模型是从A迁移到B的。 迁移学习的具体形式是多种多样的,比如先用A训练…

LeetCode讲解篇之300. 最长递增子序列

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 这题我们可以通过动态规划求解&#xff0c;使用一个数组f&#xff0c;数组f的i号元素表示[0, i]范围内最长递增子序列的长度 状态转移方程&#xff1a;f[i] max(f[j] 1)&#xff0c;其中 0 < j < i 题…

docker快速安装ELK

一、创建elk目录 创建/elk/elasticsearch/data/目录 mkdir -p /usr/local/share/elk/elasticsearch/data/ 创建/elk/logstash/pipeline/目录 mkdir -p /usr/local/share/elk/logstash/pipeline/ 创建/elk/kibana/conf/目录 mkdir -p /usr/local/share/elk/kibana/conf/ 二、创建…

大模型应用新领域:探寻终端侧 AI 竞争核心|智于终端

2024年过去2/3&#xff0c;大模型领域的一个共识开始愈加清晰&#xff1a; AI技术的真正价值在于其普惠性。没有应用&#xff0c;基础模型将无法发挥其价值。 于是乎&#xff0c;回顾这大半年&#xff0c;从互联网大厂到手机厂商&#xff0c;各路人马都在探索AI时代Killer AP…

【超级详细解释】力扣每日一题 134.加油站 48. 旋转图像

134.加油站 力扣 这是一个很好的问题。这个思路其实基于一种贪心策略。我们从整个路径的油量变化来理解它&#xff0c;结合一个直观的“最低点法则”&#xff0c;来确保找到正确的起点。 问题的核心&#xff1a;油量差值的累积 对于每个加油站&#xff0c;我们有两个数组&…

1、如何查看电脑已经连接上的wifi的密码?

在电脑桌面右下角的如下位置&#xff1a;双击打开查看当前连接上的wifi的名字&#xff1a;ZTE-kfdGYX-5G 按一下键盘上的win R 键, 输入【cmd】 然后&#xff0c;按一下【回车】。 输入netsh wlan show profile ”wifi名称” keyclear : 输入完成后&#xff0c;按一下回车&…

51单片机的水质检测系统【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器ph传感器浑浊度传感器蓝牙继电器LED、按键和蜂鸣器等模块构成。适用于水质监测系统&#xff0c;含检测和调整水温、浑浊度、ph等相似项目。 可实现功能: 1、LCD1602实时显示水温、水体ph和浑浊度 2、温…

Studying-多线程学习Part3 - condition_variable与其使用场景、C++11实现跨平台线程池

来源&#xff1a;多线程学习 目录 condition_variable与其使用场景 生产者与消费者模型 C11实现跨平台线程池 condition_variable与其使用场景 生产者与消费者模型 生产者-消费者模式是一种经典的多线程设计模式&#xff0c;用于解决多个线程之间的数据共享和协作问题。…

基于PHP的校园二手书交易管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的校园二手书交易管理系统 一 介绍 此二手书交易管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈&#xff1a;phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注…

k8s中pod的管理

一、资源管理 1.概述 说到k8s中的pod&#xff0c;即荚的意思&#xff0c;就不得不先提到k8s中的资源管理&#xff0c;k8s中可以用以下命令查看我们的资源&#xff1a; kubectl api-resources 比如我们现在需要使用k8s开启一个东西&#xff0c;那么k8s通过apiserver去对比etc…

《从零开始大模型开发与微调》真的把大模型说透了!零基础入门一定要看!

2022年底&#xff0c;ChatGPT震撼上线&#xff0c;大语言模型技术迅速“席卷”了整个社会&#xff0c;人工智能技术因此迎来了一次重要进展。与大语言模型相关的研发岗薪资更是水涨船高&#xff0c;基本都是5w月薪起。很多程序员也想跟上ChatGPT脚步&#xff0c;今天给大家带来…

51单片机系列-串口(UART)通信技术

&#x1f308;个人主页&#xff1a; 羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 并行通信和串行通信 并行方式 并行方式&#xff1a;数据的各位用多条数据线同时发送或者同时接收 并行通信特点&#xff1a;传送速度快&#xff0c;但因需要多根传输线&#xf…

免杀对抗—GOC#反VT沙盒资源分离混淆加密

前言 今天的主要内容是反VT沙盒&#xff0c;我们都知道生成的后门会被杀软上穿到沙盒中去运行&#xff0c;去逆向。如此一来我们的后门就很容易被查杀掉&#xff0c;但如果我们对后门进行一些操作&#xff0c;让它在被逆向的时候&#xff0c;反编译出一堆乱码&#xff0c;或者…

【大语言模型-论文精读】用于医疗领域摘要任务的大型语言模型评估综述

【大语言模型-论文精读】用于医疗领域摘要任务的大型语言模型评估综述 论文信息&#xff1a; 用于医疗领域摘要任务的大型语言模型评估&#xff1a;一篇叙述性综述&#xff0c; 文章是由 Emma Croxford , Yanjun Gao 博士 , Nicholas Pellegrino , Karen K. Wong 等人近期合作…

STM32PWM应用

目录 一、输出比较(OC) 二、PWM&#xff1a; 1、简介 2、基本结构 3、参数计算 三、PWM驱动LED呼吸灯 1、代码 四、PWM驱动Sg90舵机 1、工作原理 2、完整代码 五、PWM驱动直流电机 1、TB6612芯片模块 2、完整代码&#xff1a; 一、输出比较(OC) OC&#xff08;Outp…

智能医疗:Spring Boot医院管理系统开发

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

【Python】PDFMiner.six:高效处理PDF文档的Python工具

PDF是一种广泛使用的文件格式&#xff0c;特别适用于呈现固定布局的文档。然而&#xff0c;提取PDF文件中的文本和信息并不总是那么简单。幸好有许多Python库可以帮助我们&#xff0c;其中&#xff0c;PDFMiner.six 是一个功能强大、专门用于PDF文档解析的库。 ⭕️宇宙起点 &a…