当前位置: 首页 > news >正文

解锁豆瓣高清海报(二) 使用 OpenCV 拼接和压缩

解锁豆瓣高清海报(二): 使用 OpenCV 拼接和压缩

脚本地址:

项目地址: Gazer

PixelWeaver.py

pixel_squeezer_cv2.py

前瞻

继上一篇“解锁豆瓣高清海报(一) 深度爬虫与requests进阶之路”成功爬取豆瓣电影海报之后,本文将介绍如何使用 OpenCV 对这些海报进行智能拼接和压缩。我们将开发两个实用的 Python 脚本:PixelWeaver.pypixel_squeezer_cv2.py,前者可以根据指定的行列数和目标尺寸,智能地裁剪、调整并拼接多张图片,实现近似无损的拼接效果;后者则可以将大型图片压缩到指定大小,同时尽可能地保持图片质量。这两个脚本也可以作为通用的图片拼接/压缩工具使用。

使用方法

  1. 克隆或下载项目代码。
  2. 安装依赖: pip install opencv-python numpy ,或者克隆项目代码后 pip install -r requirements.txt

PixelWeaver.py

  • 指定 image_dirs,保存的图片文件夹路径, 支持填写多个文件夹。
  • 指定 output_path 保存路径, 一定要写文件名, 如r"E:\Gazer\DoubanGaze\data\poster\movie_2022.jpg"
  • 设置拼接的行和列 rowscols
  • 设置目标尺寸/分辨率(px) target_size

可选参数

  • 按照日期顺序排列: filenames.sort(key=extract_date, reverse=True) 改为 filenames.sort(key=extract_date, reverse=False)
  • 指定正则表达式: re.search(r"(\d{4}_\d{2}_\d{2})", filename) # 匹配2024_12_30, 不匹配的文件会按照文件名顺序排在后面

pixel_squeezer_cv2.py

  • 指定 image_dirs,输入图片路径
  • 指定 output_path 保存路径, 一定要写文件名, 如r"E:\Gazer\DoubanGaze\data\poster\movie_2022_compressed.jpg"
  • 指定压缩到多大和最大宽度 target_size_mb=10 max_width=1600, 这里目标大小为 10MB 以下, 最大宽度为1600

可选参数

  • 质量参数可选 0 到 100(包含 0 和 100) quality = 100

    说明
    经过测试, 合成图大小为 115MB, jpg 格式, quality = 100 可以压缩到 5.28MB. 所以脚本里默认是 100 了.

PixelWeaver.py

代码结构

  1. process_image 处理单张图片,进行智能裁剪或调整 (OpenCV)
  2. extract_date 从文件名中提取日期,用于排序 (regex)
  3. process_all_images 处理目录下的所有图片,返回处理后的图片列表
  4. create_collage 拼接海报并输出

说明和测试结果

上一篇中提到了仍有可能碰到 418 错误导致不能成功保存图片, 故建议按照日志中的链接保存图片并规范命名(只要以日期形式如 2024_12_31 开头即可), 以保证这个脚本中的正则表达式能愉快工作.

关于设置目标尺寸 target_size, 可以观察爬取的图片的分辨率, 我测试之后使用的数据是 1080 × 1600. 过大的图片会根据中心位置裁剪, 过小的图片使用插值缩放.
在这里插入图片描述

输入图片数量不足以填满拼接网格的处理

当输入的图片数量无法填满 rows * cols 的拼接网格时,create_collage 函数会在空白位置填充黑色。为了避免程序出错, 修改后的代码会在计算 rowcol 超出预设范围时,自动停止放置图片, 不会尝试访问不存在的图片元素。

原始的 create_collage 函数的核心循环部分:

  for i in range(num_images):row = i // colscol = i % colsx = col * target_wy = row * target_hcollage[y:y+target_h, x:x+target_w] = processed_images[i]

这段代码的逻辑是:依次取出 processed_images 列表中的每一张图片,计算它应该放置的行列位置 (row, col) 和坐标 (x, y),然后将图片复制到 collage 画布的相应位置。

问题出在哪里呢?

在拼接图片的过程中,如果遇到图片数量 num_images 少于预设的行列数 rows * cols 的情况,原始的代码逻辑可能会导致程序尝试访问 processed_images 列表中不存在的元素,从而引发错误。

为了解决这个问题,修改代码逻辑,加入安全检查机制。

这是修改后的代码:

for i in range(num_images):row = i // colscol = i % colsif row >= rows or col >= cols:break  # 超出预设的行列范围,停止放置图片x = col * target_wy = row * target_hcollage[y:y+target_h, x:x+target_w] = processed_images[i]

关键在于这行代码:

    if row >= rows or col >= cols:break  # 超出预设的行列范围,停止放置图片

它的作用是:在每次循环迭代中,除了根据 i 计算当前图片的 rowcol 之外,还增加了一个额外的判断:如果计算出来的 row 大于等于预设的 rows,或者 col 大于等于预设的 cols,就立即跳出循环,不再继续放置图片,并结束循环。这确保了循环不会尝试访问 processed_images 列表中不存在的元素,也不会在 collage 画布的错误位置放置图片。

为什么这样可以解决问题?

因为 for i in range(num_images) 循环只会执行 num_images 次,并且 rowcol 是基于 i 计算得出的,而 if row >= rows or col >= cols: break 这行代码可以确保,即使 num_images 小于 rows * cols,循环也不会尝试访问不存在的图片元素或在超出预设行列范围的位置放置图片。即使 num_images 小于 rows * cols,循环也会在 num_images 次之内结束, 提前结束循环, 避免访问不存在的元素或者在错误位置放置图片。

让我们通过一个例子来说明:

  • rows = 3 (预设 3 行)
  • cols = 3 (预设 3 列)
  • rows * cols = 9 (总共 9 个格子)
  • num_images = 7 (实际只有 7 张图片)

在这种情况下,for 循环会执行 7 次 (因为 num_images 是 7),i 的值依次为 0, 1, 2, 3, 4, 5, 6。

i 循环到 6 的时候 (放置第 7 张图片):

  • row = 6 // 3 = 2
  • col = 6 % 3 = 0
  • row (2) 小于 rows (3), col (0) 小于 cols (3),所以会放置第 7 张图片 (processed_images[6])

当循环结束时, 不会计算 i=7 时的 rowcol 了. 因为 num_images 是 7, 所以 for i in range(num_images) 最后一次循环 i 的值是 6.

由于循环在 i=6 时结束, 因此循环不会尝试访问 processed_images[7], 也不会计算 i=7 时的 rowcol

这样,即使只有 7 张图片,程序也不会出错,并且会正确地将 7 张图片放置到 collage 画布的前 7 个格子上,剩下的格子将保持空白(在代码中看起来是黑色,因为 collage 初始化为黑色背景)。

总结一下,if row >= rows or col >= cols: break 这行代码在这里起到了一个额外的保护作用。它确保了在 num_images 小于 rows * cols 的情况下,循环不会尝试访问不存在的图片元素或在超出预设行列范围的位置放置图片,从而避免了程序出错。即使我们确定 num_images 小于 rows * cols,这行代码也能增强程序的健壮性,使其能够处理更多不同的情况,并使代码的逻辑更加清晰。

近似无损拼接

PixelWeaver.py 脚本在拼接图片时,通过精心的裁剪和缩放策略,以及高质量的插值算法 (cv2.INTER_AREA 用于缩小, cv2.INTER_CUBIC 用于放大), 尽可能地保留了原始图片的细节, 实现了肉眼难以察觉损失的近似无损拼接。即使是 110 张海报拼接成一张大图,最终的图片质量依然非常出色。

原因:

  1. 图片处理过程(process_image 函数):
    • 在这个脚本中,每张图片都会经过 process_image 函数的处理。这个函数主要做了两件事:

      1. 裁剪: 当图片尺寸大于目标尺寸时,会裁剪图片中心区域。
      2. 缩放: 当图片尺寸不等于目标尺寸时, 会进行缩放, 确保所有图片尺寸一致。
    • 裁剪操作本身就是一种有损操作。因为它会直接丢弃图片边缘的部分像素信息。

    • 缩放操作虽然理论上有可能造成图像信息的损失, 但是, 如果使用高质量的插值算法, 可以将损失控制在肉眼几乎无法察觉的范围内.

  2. 拼接过程 (create_collage 函数):
    • 拼接过程本身并不会对图片数据进行修改, 可以看作是无损的. 它只是将所有图片数据按顺序拷贝到一张大的画布上。
  3. 图片保存 (cv2.imwrite 函数):
    • cv2.imwrite() 函数在保存图片时, 会根据你指定的文件格式 (例如 .jpg, .png) 进行编码压缩.
    • 如果保存为 .jpg 格式,那么这肯定是一个有损压缩的过程。JPEG 格式是一种有损压缩的图片格式,它通过牺牲一定的图片质量来换取较小的文件体积。
    • 如果保存为 .png 格式,那么可以认为是无损压缩, 或者损失极小。 PNG 格式是一种无损压缩的图片格式,它可以保留图片的原始信息,但文件体积通常比 JPEG 格式大.

所以, 110张海报拼接后得到59.2MB, 并且感觉质量特别棒, 这也印证了我们上面的分析. 因为之前使用的是 .jpg 格式来保存的, 所以图片有压缩, 但是这个压缩带来的损失, 从观感上来说, 是很小的, 几乎无法察觉.

插值算法的功劳:

如果要说哪个算法起到了最大的作用,那应该是在缩放操作中使用的 插值算法

在代码中,有两种情况会进行缩放:

  1. 图片尺寸大于目标尺寸,裁剪后如果尺寸仍然和目标尺寸不同, 则进行缩放:

    if (cropped_img.shape[1] != target_w) or (cropped_img.shape[0] != target_h) :cropped_img = cv2.resize(cropped_img, target_size, interpolation = cv2.INTER_AREA)
    

    这里使用了 cv2.INTER_AREA 插值算法。

  2. 图片尺寸小于目标尺寸:

        resized_img = cv2.resize(img, target_size, interpolation = cv2.INTER_CUBIC) # 使用 cv2.INTER_CUBIC
    

    这里使用了 cv2.INTER_CUBIC 插值算法。

  • cv2.INTER_AREA 基于局部像素的区域重采样。它适用于缩小图像。这个算法在进行图片缩小的时候, 能较好地保留图片的质量和细节.
  • cv2.INTER_CUBIC 基于 4x4 像素邻域的立方插值。它适用于放大图像。这个算法在图片放大的时候, 能获得一个相对平滑和清晰的结果.

这两个插值算法在 OpenCV 中都属于高质量的插值算法,能够在缩放过程中最大程度地保留图像的细节,减少失真。 因此,即使图片经过了缩放,最终的拼接结果仍然能够保持很好的质量。

process_image 函数详解

process_image 函数负责处理每一张输入图片,它的主要任务是根据目标尺寸 (target_size) 对图片进行智能裁剪或调整。

裁剪策略:

当图片尺寸大于目标尺寸时,为了尽可能保留图片的关键信息,process_image裁剪图片的中心区域。这是因为大多数海报的主体内容通常位于图片的中心位置。

缩放策略:

为了保证所有图片都能无缝拼接,process_image 会将所有图片都调整到相同的尺寸 (target_size)。在缩放过程中,根据不同的情况选择不同的插值算法:

# 代码摘自 PixelWeaver.py 的 process_image 函数
if (img.shape[1]  target_w) or (img.shape[0]  target_h):# 裁剪图片中心区域# ...if (cropped_img.shape[1] != target_w) or (cropped_img.shape[0] != target_h) :cropped_img = cv2.resize(cropped_img, target_size, interpolation = cv2.INTER_AREA) # 使用 cv2.INTER_AREA 进行缩小
elif (img.shape[1] != target_w) or (img.shape[0] != target_h):# 缩放图片以匹配目标尺寸resized_img = cv2.resize(img, target_size, interpolation = cv2.INTER_CUBIC) # 使用 cv2.INTER_CUBIC 进行放大

问题来了, 115MB 的图无法分享和上传到网上了, 所以还是使用pixel_squeezer_cv2.py压缩一下吧.

pixel_squeezer_cv2.py

说明和测试结果

使用 OpenCV 压缩 JPEG 图片的参数主要是 cv2.IMWRITE_JPEG_QUALITY,它的范围是 0-100,数值越小,压缩率越高,图片质量越差。

因为不同的图片内容(例如纹理复杂程度、颜色丰富程度)对压缩的敏感度不同。 有些图片可能压缩到 quality=40 还能接受,有些可能到 quality=50 就已经出现明显的失真了。

压缩效果示例 (压缩后为 5.28MB ):

海报压缩效果.jpg

compress_image_cv2 函数详解

compress_image_cv2 函数负责将图片压缩到指定大小 (MB) 以下,同时尽可能地保持图片质量。它接受以下几个关键参数:

  • target_size_mb: 目标文件大小,单位为 MB。
  • max_width: 图片的最大宽度。如果图片的宽度超过这个值,将会被等比例缩小。
  • max_height: 图片的最大高度。如果图片的高度超过这个值,将会被等比例缩小。

工作原理:

compress_image_cv2 函数使用一个 while 循环来不断尝试不同的 JPEG 压缩质量 (quality),直到压缩后的文件大小小于等于 target_size_mb

quality = 75  # 初始质量值
while True:# ...cv2.imwrite(temp_output_path, image, [cv2.IMWRITE_JPEG_QUALITY, quality]) # 使用当前 quality 值保存图片file_size_mb = os.path.getsize(temp_output_path) / (1024 * 1024) # 获取文件大小print(f"Quality: {quality}, Size: {file_size_mb:.2f} MB")if file_size_mb <= target_size_mb:# 文件大小已满足要求,跳出循环breakelif quality <= 5:# 质量已降至最低,仍然无法满足要求,发出警告并跳出循环print("警告:质量已降至极低,可能无法满足目标大小。")breakelse:quality -= 5  # 降低 quality 值,继续尝试

代码解释:

  1. 函数首先根据 max_widthmax_height 参数调整图片的尺寸。
  2. 然后,它从初始的 quality 值 (默认为 75) 开始,在一个 while 循环中不断尝试压缩图片。
  3. 每次循环中,它使用当前的 quality 值将图片保存为一个临时文件,并获取临时文件的大小。
  4. 如果文件大小小于等于 target_size_mb,则说明压缩成功,函数将临时文件重命名为最终的输出文件,并跳出循环。
  5. 如果文件大小仍然大于 target_size_mb,并且 quality 值已经降至 5 或以下,则说明无法在保持可接受质量的前提下将图片压缩到目标大小,函数会发出警告,并将当前质量下的临时文件作为最终输出。
  6. 否则,函数会将 quality 值降低 5,并继续循环尝试。
    环中,它使用当前的 quality 值将图片保存为一个临时文件,并获取临时文件的大小。
  7. 如果文件大小小于等于 target_size_mb,则说明压缩成功,函数将临时文件重命名为最终的输出文件,并跳出循环。
  8. 如果文件大小仍然大于 target_size_mb,并且 quality 值已经降至 5 或以下,则说明无法在保持可接受质量的前提下将图片压缩到目标大小,函数会发出警告,并将当前质量下的临时文件作为最终输出。
  9. 否则,函数会将 quality 值降低 5,并继续循环尝试。

相关文章:

解锁豆瓣高清海报(二) 使用 OpenCV 拼接和压缩

解锁豆瓣高清海报(二): 使用 OpenCV 拼接和压缩 脚本地址: 项目地址: Gazer PixelWeaver.py pixel_squeezer_cv2.py 前瞻 继上一篇“解锁豆瓣高清海报(一) 深度爬虫与requests进阶之路”成功爬取豆瓣电影海报之后&#xff0c;本文将介绍如何使用 OpenCV 对这些海报进行智…...

【C/C++】Windows SAPI自实现文字转语音

本文通过封装Windows SAPI&#xff08;Speech Application Programming Interface&#xff09;&#xff0c;提供了一个现代化的C接口实现文字转语音功能。主要特性包括支持同步/异步语音合成、可调节语速&#xff08;-10到10&#xff09;和音量控制&#xff08;0-100%&#xff…...

openmv的端口被拆分为两个 导致电脑无法访问openmv文件系统解决办法 openmv USB功能改动 openmv驱动被更改如何修复

我之前误打误撞遇到一次&#xff0c;直接把openmv的全部端口删除卸载然后重新插上就会自动重新装上一个openmv端口修复成功&#xff0c;大家可以先试试不行再用下面的方法 全部卸载再重新插拔openmv 要解决OpenMV IDE中出现的两个端口问题&#xff0c;可以尝试以下步骤&#x…...

8.攻防世界Web_php_wrong_nginx_config

进入题目页面如下 尝试弱口令密码登录 一直显示网站建设中&#xff0c;尝试无果&#xff0c;查看源码也没有什么特别漏洞存在 用Kali中的dirsearch扫描根目录试试 命令&#xff1a; dirsearch -u http://61.147.171.105:53736/ -e* 登录文件便是刚才登录的界面打开robots.txt…...

音叉模态分析

目录 0 序言 1 自由状态下模态求解 1.1 添加模态项目 1.2 生成网格 1.3 设置最大模态阶数 1.4 求解 1.5 结果查看 1.6 结果分析 2 音叉能否释放频率440Hz的音调 3 预应力模态求解 3.1 静态结构分析 3.1.1 添加静态结构项目 3.1.2生成网格 3.1.3添加边界条件 3.1…...

智慧园区系统集成解决方案引领未来城市管理的智能化转型

内容概要 在现代城市管理的背景下&#xff0c;“智慧园区系统集成解决方案”正扮演着越来越重要的角色。这种解决方案不仅仅是技术上的创新&#xff0c;更是一种全新的管理理念&#xff0c;它旨在通过高效的数据整合与分析&#xff0c;优化资源配置&#xff0c;提升运营效率。…...

(即插即用模块-特征处理部分) 二十、(TPAMI 2022) Permute-MLP 置换MLP模块

文章目录 1、Permute-MLP layer2、代码实现 paper&#xff1a;Vision Permutator: A Permutable MLP-Like Architecture for Visual Recognition Code&#xff1a;https://github.com/Andrew-Qibin/VisionPermutator 1、Permute-MLP layer 传统的 MLP-like 模型&#xff08;如…...

FBX SDK的使用:基础知识

Windows环境配置 FBX SDK安装后&#xff0c;目录下有三个文件夹&#xff1a; include 头文件lib 编译的二进制库&#xff0c;根据你项目的配置去包含相应的库samples 官方使用案列 动态链接 libfbxsdk.dll, libfbxsdk.lib是动态库&#xff0c;需要在配置属性->C/C->预…...

爬虫基础(二)Web网页的基本原理

一、网页的组成 网页由三部分构成&#xff1a;HTML、JavaScript、CSS。 &#xff08;1&#xff09;HTML HTML 相当于网页的骨架&#xff0c;它通过使用标签来定义网页内容的结构。 举个例子&#xff1a; 它把图片标签为img、把视频标签为video&#xff0c;然后组合到一个界面…...

1.4 Go 数组

一、数组 1、简介 数组是切片的基础 数组是一个固定长度、由相同类型元素组成的集合。在 Go 语言中&#xff0c;数组的长度是类型的一部分&#xff0c;因此 [5]int 和 [10]int 是两种不同的类型。数组的大小在声明时确定&#xff0c;且不可更改。 简单来说&#xff0c;数组…...

爬虫基础(三)Session和Cookie讲解

目录 一、前备知识点 &#xff08;1&#xff09;静态网页 &#xff08;2&#xff09;动态网页 &#xff08;3&#xff09;无状态HTTP 二、Session和Cookie 三、Session 四、Cookie &#xff08;1&#xff09;维持过程 &#xff08;2&#xff09;结构 正式开始说 Sessi…...

hive:基本数据类型,关于表和列语法

基本数据类型 Hive 的数据类型分为基本数据类型和复杂数据类型 加粗的是常用数据类型 BOOLEAN出现ture和false外的其他值会变成NULL值 没有number,decimal类似number 如果输入的数据不符合数据类型, 映射时会变成NULL, 但是数据本身并没有被修改 创建表 创建表的本质其实就是在…...

Maya软件安装步骤与百度网盘链接

软件简介&#xff1a; MAYA软件是Autodesk旗下的著名三维建模和动画软件。maya软件功能更为强大&#xff0c;体系更为完善&#xff0c;因此国内很多的三维动画制作人员都开始转向maya&#xff0c;maya软件已成为三维动画软件的主流。 百度网盘链接: https://pan.baidu.com/s…...

error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054

Descriptions&#xff1a; Solutions&#xff1a;...

PID算法的数学实现和参数确定方法

目录 概述 1 算法描述 1.1 PID算法模型 1.2 PID离散化的图形描述 1.3 PID算法的特点 2 离散化的PID算法 2.1 位置式PID算法 2.2 增量式PID算法 2.3 位置式PID与增量式PID比较 3 控制器参数整定 3.1 PID参数确定方法 3.1.1 凑试法 3.1.2 临界比例法 3.1.3 经验法…...

【已解决】ECharts 没有在页面生效

元素高度问题&#xff1a; ECharts 需要一个具有明确高度的容器来渲染图表&#xff0c;也就是说 echartsRef 元素需要一个明确的 div 高度。我项目中的问题就是在 .base-echarts&#xff08;我项目中的最外层元素&#xff09; 上设置了高度为 300px&#xff0c;但没有为 .echar…...

三角函数正交性应用--以信号分离为例

三角函数的正交性的应用 引言 在信号处理、通信等众多领域中&#xff0c;三角函数的正交性发挥着至关重要的作用。它不仅是理论分析的基础&#xff0c;更是实际应用中解决各种问题的有力工具。本文将详细介绍三角函数正交性的定义、证明&#xff0c;并通过一个具体的信号处理…...

ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务

目录 一、ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务 1. app.Services 2. GetRequiredService() 3. Init() 二、应用场景 三、依赖注入使用拓展 1、使用场景 2、使用步骤 1. 定义服务接口和实现类 2. 注册服务到依赖注入容器 3. 使用依赖注入获取并…...

一个数如果恰好等于他的因子之和,这是就成为“完数“,例如6=1+2+3.编程找出1000以内的所有完数

from sys import stdoutfor i in range(2,1001):k[] #用于存储因子si #初始化s为当前数字ifor j in range(1,i):if i%j0: #如果j是i的因子s-j #从s中减去银子jk.append(j) #将因子j加入列表kif s0:#如果s最终为0,说明i是一个完数print(i)for j in range(len(k)): #遍历银子列表…...

理解 InnoDB 如何处理崩溃恢复

在数据库领域&#xff0c;数据的一致性与可靠性至关重要。InnoDB 存储引擎的崩溃恢复机制是保障数据安全的核心&#xff0c;其中 Doublewrite Buffer 和 Redo Log 发挥着关键作用。下面&#xff0c;我们将详细探讨 InnoDB 从写入到崩溃恢复的全过程。 一、写入流程 修改页面&…...

Linux-CentOS的yum源

1、什么是yum yum是CentOS的软件仓库管理工具。 2、yum的仓库 2.1、yum的远程仓库源 2.1.1、国内仓库 国内较知名的网络源(aliyun源&#xff0c;163源&#xff0c;sohu源&#xff0c;知名大学开源镜像等) 阿里源:https://opsx.alibaba.com/mirror 网易源:http://mirrors.1…...

Redis复制

一、Redis复制&#xff1a; 1.为了解决分布式中单点故障问题&#xff0c;通常会把数据复制多个副本部署到其他机器上来解决故障恢复和负载均衡等需求。 2.建立复制 参与复制的redis实例划分为主节点&#xff08;master&#xff09;和从节点&#xff08;slave&#xff09;,每个从…...

小白怎样部署和使用本地大模型DeepSeek ?

1 安装Ollama &#xff08;1&#xff09; 下载Ollama 从https://ollama.com/download 下载, 根据你的系统下载对应的版本&#xff0c;支持Win, Mac ,Linux&#xff1a; 如果下载不了&#xff0c;右键复制链接地址&#xff0c;贴到迅雷&#xff0c;指定可以下载下来。 (2) 安…...

ECharts 样式设置

ECharts 样式设置 引言 ECharts 是一款功能强大的可视化库&#xff0c;广泛用于数据可视化。样式设置是 ECharts 中的重要一环&#xff0c;它能够帮助开发者根据需求调整图表的视觉效果&#xff0c;使其更加美观和易于理解。本文将详细介绍 ECharts 的样式设置&#xff0c;包…...

Java synchronized关键字和锁分类

专栏系列文章地址&#xff1a;https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标&#xff1a; 关于synchronized已经有很多博主很细致的讲解了&#xff0c;本文主要是通过代码例子再次理解下&#xff0c;并要求能头脑反射出相关知识点主要是锁分类的知识…...

Vue.js 新的生命周期钩子:`onMounted`, `onUpdated` 等

Vue.js 新的生命周期钩子&#xff1a;onMounted, onUpdated 等 今天我们来聊聊 Vue 3 中的生命周期钩子&#xff0c;特别是 onMounted、onUpdated 等。如果你对如何在 Vue 3 的组合式 API&#xff08;Composition API&#xff09;中使用这些钩子感到困惑&#xff0c;那么这篇文…...

OpenCV:闭运算

目录 1. 简述 2. 用膨胀和腐蚀实现闭运算 2.1 代码示例 2.2 运行结果 3. 闭运算接口 3.1 参数详解 3.2 代码示例 3.3 运行结果 4. 闭运算的应用场景 5. 注意事项 相关阅读 OpenCV&#xff1a;图像的腐蚀与膨胀-CSDN博客 OpenCV&#xff1a;开运算-CSDN博客 1. 简述…...

Android 音视频编解码 -- MediaCodec

引言 如果我们只是简单玩一下音频、视频播放&#xff0c;那么使用 MediaPlayer SurfaceView 播放就可以了&#xff0c;但如果想加个水印&#xff0c;加点其他特效什么的&#xff0c;那就不行了&#xff1b; 学习 Android 自带的硬件码类 – MediaCodec。 MediaCodec 介绍 Med…...

移动互联网用户行为习惯哪些变化,对小程序的发展有哪些积极影响

一、碎片化时间利用增加 随着生活节奏的加快&#xff0c;移动互联网用户的碎片化时间越来越多。在等公交、排队、乘坐地铁等间隙&#xff0c;用户更倾向于使用便捷、快速启动的应用来满足即时需求。小程序正好满足了这一需求&#xff0c;无需下载安装&#xff0c;随时可用&…...

数据分析系列--②RapidMiner导入数据和存储过程

一、下载数据 二、导入数据 1. 在本地计算机中创建3个文件夹 2. 从本地选择.csv或.xlsx 三、界面说明 四、存储过程 1.保存 Congratulations, you are done. 一、下载数据 点击下载AssociationAnalysisData.xlsx数据集 二、导入数据 1. 在本地计算机中创建3个文件夹 2. 从…...

Prometheus 中的 Exporter

在 Prometheus 生态系统中,Exporter 扮演着至关重要的角色,它们负责从不同的服务或系统中收集和暴露度量数据。本文将详细介绍 Exporter 的概念、类型以及如何有效使用它们将 Prometheus 集成到各种系统中进行监控。 什么是 Exporter? Exporter 是一段软件,它从应用程序或…...

从 HTTP/1.1 到 HTTP/3:如何影响网页加载速度与性能

一、前言 在最近使用Apipost时&#xff0c;突然注意到了http/1.1和http/2&#xff0c;如下图&#xff1a; 在我根深蒂固的记忆中&#xff0c;对于http的理解还停留在TCP协议、三次握手。由于我的好奇心&#xff0c;于是触发了我被动“开卷”&#xff0c;所以有了这篇文章&…...

GenAI 在金融服务领域的应用:2025 年的重点是什么

作者&#xff1a;来自 Elastic Karen Mcdermott GenAI 不是魔法 我最近参加了 ElasticON&#xff0c;我们与纽约 Elastic 社区一起度过了一天&#xff0c;讨论了使用检索增强生成 (retrieval augmented generation - RAG) 为大型语言模型 (large language models - LLMs) 提供…...

小红书文案生成器(基于openai API和streamlit)

prompt_text.py&#xff1a; # 专门用来放提示文本&#xff08;系统提示、用户提示&#xff09;system_prompt_text """ 你是小红书爆款写作专家&#xff0c;请你遵循以下步骤进行创作&#xff1a;首先产出5个标题&#xff08;包含适当的emoji表情&#xff09…...

Spring AOP 入门教程:基础概念与实现

目录 第一章&#xff1a;AOP概念的引入 第二章&#xff1a;AOP相关的概念 1. AOP概述 2. AOP的优势 3. AOP的底层原理 第三章&#xff1a;Spring的AOP技术 - 配置文件方式 1. AOP相关的术语 2. AOP配置文件方式入门 3. 切入点的表达式 4. AOP的通知类型 第四章&#x…...

力扣面试150 快乐数 循环链表找环 链表抽象 哈希

Problem: 202. 快乐数 &#x1f469;‍&#x1f3eb; 参考题解 Code public class Solution {public int squareSum(int n) {int sum 0;while(n > 0){int digit n % 10;sum digit * digit;n / 10;}return sum;}public boolean isHappy(int n) {int slow n, fast squa…...

【实战篇章】深入探讨:服务器如何响应前端请求及后端如何查看前端提交的数据

文章目录 深入探讨&#xff1a;服务器如何响应前端请求及后端如何查看前端提交的数据一、服务器如何响应前端请求HTTP 请求生命周期全解析1.前端发起 HTTP 请求&#xff08;关键细节强化版&#xff09;2. 服务器接收请求&#xff08;深度优化版&#xff09; 二、后端如何查看前…...

《AI大模型开发笔记》DeepSeek技术创新点

一、DeepSeek横空出世 DeepSeek V3 以颠覆性技术架构创新强势破局&#xff01;革命性的上下文处理机制实现长文本推理成本断崖式下降&#xff0c;综合算力需求锐减90%&#xff0c;开启高效 AI 新纪元&#xff01; 最新开源的 DeepSeek V3模型不仅以顶尖基准测试成绩比肩业界 …...

【大模型LLM面试合集】大语言模型架构_MHA_MQA_GQA

MHA_MQA_GQA 1.总结 在 MHA&#xff08;Multi Head Attention&#xff09; 中&#xff0c;每个头有自己单独的 key-value 对&#xff1b;标准的多头注意力机制&#xff0c;h个Query、Key 和 Value 矩阵。在 MQA&#xff08;Multi Query Attention&#xff09; 中只会有一组 k…...

实战技巧:如何快速增加网站的收录页面?

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/43.html 要快速增加网站的收录页面&#xff0c;可以从以下几个方面进行实战优化&#xff1a; 一、内容优化 高质量原创内容 确保网站内容具备高质量与原创性&#xff0c;满足搜索引擎对独…...

20-30 五子棋游戏

20-分析五子棋的实现思路_哔哩哔哩_bilibili20-分析五子棋的实现思路是一次性学会 Canvas 动画绘图&#xff08;核心精讲50个案例&#xff09;2023最新教程的第21集视频&#xff0c;该合集共计53集&#xff0c;视频收藏或关注UP主&#xff0c;及时了解更多相关视频内容。https:…...

PYH与MAC的桥梁MII/MIIM

在学习车载互联网时&#xff0c;看到了一句话&#xff0c;Processor通过DMA直接存储访问与MAC之间进行数据的交互&#xff0c;MAC通过MII介质无关接口与PHY之间进行数据的交互。常见的以太网硬件结构是&#xff0c;将MAC集成进Processor芯片&#xff0c;将PHY留在Processor片外…...

pytorch基于 Transformer 预训练模型的方法实现词嵌入(tiansz/bert-base-chinese)

以下是一个完整的词嵌入&#xff08;Word Embedding&#xff09;示例代码&#xff0c;使用 modelscope 下载 tiansz/bert-base-chinese 模型&#xff0c;并通过 transformers 加载模型&#xff0c;获取中文句子的词嵌入。 from modelscope.hub.snapshot_download import snaps…...

探秘 TCP TLP:从背景到实现

回家的路上还讨论了个关于 TCP TLP 的问题&#xff0c;闲着无事缕一缕。本文内容参考自 Tail Loss Probe (TLP): An Algorithm for Fast Recovery of Tail Losses 以及 Linux 内核源码。 TLP&#xff0c;先说缘由。自 TCP 引入 Fast retrans 机制就是为了尽力避免 RTO&#xf…...

MCU内部ADC模块误差如何校准

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时&#xff0c;也能帮助其他需要参考的朋友。如有谬误&#xff0c;欢迎大家进行指正。 一、ADC误差校准引言 MCU 片内 ADC 模块的误差总包括了 5 个静态参数 (静态失调&#xff0c;增益误差&#xff0c;微分非线性…...

国产之光DeepSeek架构理解与应用分析

目录 初步探索DeepSeek的设计 一、核心架构设计 二、核心原理与优化 三、关键创新点 四、典型应用场景 五、与同类模型的对比优势 六、未来演进方向 从投入行业生产的角度看 一、DeepSeek的核心功能扩展 二、机械电子工程产业中的具体案例 1. 预测性维护&#xff08;Predictive…...

群晖NAS安卓Calibre 个人图书馆

docker 下载镜像johngong/calibre-web&#xff0c;安装之 我是本地的/docker/xxx/metadata目录 映射到 /usr/local/calibre-web/app/cps/metadata_provider CALIBREDB_OTHER_OPTION 删除 CALIBRE_SERVER_USER calibre_server_user 缺省用户名口令 admin admin123 另外有个N…...

openRv1126 AI算法部署实战之——Tensorflow模型部署实战

在RV1126开发板上部署Tensorflow算法&#xff0c;实时目标检测RTSP传输。视频演示地址 rv1126 yolov5 实时目标检测 rtsp传输_哔哩哔哩_bilibili ​ 一、准备工作 从官网下载tensorflow模型和数据集 手动在线下载&#xff1a; https://github.com/tensorflow/models/b…...

HTML特殊符号的使用示例

目录 一、基本特殊符号的使用 1、空格符号&#xff1a; 2、小于号 和 大于号&#xff1a; 3、引号&#xff1a; 二、版权、注册商标符号的使用 1、版权符号&#xff1a;© 2、注册商标符号&#xff1a; 三、数学符号的使用 四、箭头符号的使用 五、货币符号的使用…...

如何对系统调用进行扩展?

扩展系统调用是操作系统开发中的一个重要任务。系统调用是用户程序与操作系统内核之间的接口,允许用户程序执行内核级操作(如文件操作、进程管理、内存管理等)。扩展系统调用通常包括以下几个步骤: 一、定义新系统调用 扩展系统调用首先需要定义新的系统调用的功能。系统…...