python学opencv|读取图像(二十一)使用cv2.circle()绘制圆形进阶
【1】引言
前序已经掌握了使用cv2.circle()绘制圆形的基本操作,相关链接为:
python学opencv|读取图像(二十)使用cv2.circle()绘制圆形-CSDN博客
由于圆形本身绘制起来比较简单,因此可以自由操作的空间也就大,我们今天就尝试多一些花样,做一次进阶探索。
【2】代码探索
【2.1】同心圆
绘制同心圆的基本思路是,确认好圆心以后,逐个修改半径,然后输出图像即可。
还是以之前的代码为基础,增加for循环逐个输出圆即可。此处先给出完整代码:
import numpy as np # 引入numpy模块
import cv2 as cv # 引入cv模块canvas = np.ones((580, 580, 3), np.uint8) * 225 # 绘制一个580*580大小的画布,3代表有3个通道,unit8为图像存储格式
# 第一个通道值
#for i in range(0, 580, 1):#for j in range(0, 580, 1):#canvas[i, j, 0] = 0.2 * (i + j) # 第一个通道值# 第二个通道值
#for i in range(0, 580, 1):#for j in range(0, 580, 1):#canvas[i, j, 1] = 50 * np.cos(i ^ j) + 55 * np.sin(j ^ i) + 150 * np.sin(j - i) # 第二个通道值# 第三个通道值
#for i in range(0, 580, 1):#for j in range(0, 580, 1):#canvas[i, j, 2] = 100 * np.tanh(i + j) + 100 * np.tanh(i - j) + 50 * np.cos(j - i) # 第三个通道值
x0=285 #圆心横坐标
y0=285 #圆心纵坐标
for i in range(1,6,1):canvas = cv.circle(canvas, (x0, y0), 50*i, (int(255*np.cos((np.sqrt(np.square(15-i))))), int(255*np.sin(i)), int(np.abs(i-3))^5), i) #输出同心圆#canvas = cv.circle(canvas, (285, 285), 80, (0, 0, 255), 3) # 第一个圆形
#canvas = cv.circle(canvas, (100, 285), 80, (0, 255, 255), -1) # 第二个圆形
#canvas = cv.circle(canvas, (470, 285), 80, (255, 0, 0), -1) # 第三个圆形
# canvas = cv.rectangle(canvas, (50, 30), (530, 550), (155, 120, 60), 5) # 矩形
# canvas = cv.rectangle(canvas, (80, 80), (500, 500), (55, 160, 230), 10) # 矩形
# canvas = cv.rectangle(canvas, (150, 150), (430, 430), (50, 120, 90), -1) # 矩形
# canvas = cv.line(canvas, (50, 550), (550, 550), (58, 50, 150), 15) # 线段
# canvas = cv.line(canvas, (300, 50), (300, 550), (120, 150, 25), 20) # 线段cv.imshow('rectangle', canvas) # 在屏幕展示绘制圆形的效果
cv.imwrite('circle50.png', canvas) # 保存图像
cv.waitKey() # 图像不会自动关闭
cv.destroyAllWindows() # 释放所有窗口
程序运行后的输出图像为:

图1 同心圆
创造同心圆的核心代码段落为:
x0=285 #圆心横坐标
y0=285 #圆心横坐标
for i in range(1,5,1):canvas = cv.circle(canvas, (x0, y0), 50*i, (int(255*np.cos((np.sqrt(np.square(15-i))))), int(255*np.sin(i)), int(np.abs(i-3))^5), i) #输出同心圆
首先用x0和y0确认了愿新的坐标点,然后用for循环输出5个圆形即可。
这五个圆的半径计算式为:r=50*i,i就是圆形的出现顺序;圆的颜色采用了函数的形式,不是此处重点;圆的线宽就是圆出现的顺序。
总体上,圆出现的顺序越晚,半径越大,线条越宽。
【2.2】疏密同心圆
绘制疏密同心圆的基本思路是,利用三角函数的斜率也是三角函数的原理,如果半径通过三角函数来取值,那同样的增量下,邻近半径值的差会周期性的时大时小,这样就会画出疏密同心圆。
以2π为周期,增量从0到7就可以覆盖一个周期内的所有圆。
在这个分析基础上,我们把核心代码换成:
x0=285 #圆心横坐标
y0=285 #圆心横坐标
for i in range(0,7,1):canvas = cv.circle(canvas, (x0, y0), np.abs(int(260*np.cos(i))), (200,180,55), 2) #输出同心圆
半径取值为np.abs(int(260*np.cos(i))),这里的np.abs()是取绝对值的意思,因为半径必须为正数。
此时获得的图形为:

图2 疏密同心圆
对应的完整代码为:
import numpy as np # 引入numpy模块
import cv2 as cv # 引入cv模块canvas = np.ones((580, 580, 3), np.uint8) * 225 # 绘制一个580*580大小的画布,3代表有3个通道,unit8为图像存储格式
# 第一个通道值
#for i in range(0, 580, 1):#for j in range(0, 580, 1):#canvas[i, j, 0] = 0.2 * (i + j) # 第一个通道值# 第二个通道值
#for i in range(0, 580, 1):#for j in range(0, 580, 1):#canvas[i, j, 1] = 50 * np.cos(i ^ j) + 55 * np.sin(j ^ i) + 150 * np.sin(j - i) # 第二个通道值# 第三个通道值
#for i in range(0, 580, 1):#for j in range(0, 580, 1):#canvas[i, j, 2] = 100 * np.tanh(i + j) + 100 * np.tanh(i - j) + 50 * np.cos(j - i) # 第三个通道值
x0=285 #圆心横坐标
y0=285 #圆心横坐标
for i in range(0,7,1):canvas = cv.circle(canvas, (x0, y0), np.abs(int(260*np.cos(i))), (200,180,55), 2) #输出同心圆#canvas = cv.circle(canvas, (285, 285), 80, (0, 0, 255), 3) # 第一个圆形
#canvas = cv.circle(canvas, (100, 285), 80, (0, 255, 255), -1) # 第二个圆形
#canvas = cv.circle(canvas, (470, 285), 80, (255, 0, 0), -1) # 第三个圆形
# canvas = cv.rectangle(canvas, (50, 30), (530, 550), (155, 120, 60), 5) # 矩形
# canvas = cv.rectangle(canvas, (80, 80), (500, 500), (55, 160, 230), 10) # 矩形
# canvas = cv.rectangle(canvas, (150, 150), (430, 430), (50, 120, 90), -1) # 矩形
# canvas = cv.line(canvas, (50, 550), (550, 550), (58, 50, 150), 15) # 线段
# canvas = cv.line(canvas, (300, 50), (300, 550), (120, 150, 25), 20) # 线段cv.imshow('rectangle', canvas) # 在屏幕展示绘制圆形的效果
cv.imwrite('circle50.png', canvas) # 保存图像
cv.waitKey() # 图像不会自动关闭
cv.destroyAllWindows() # 释放所有窗口
【2.3】变化圆心
既然圆的半径可以变化,圆形自然也可以变化,继续修改核心代码:
r=160 #半径
for i in range(0,10,1):canvas = cv.circle(canvas, ((i-5)*10+280, (i-5)*20+280), r, (200,180,55), 2) #输出同心圆
在这里,圆心坐标被更换为((i-5)*10+280, (i-5)*20+280),这几一个动态值,只有半径是恒定的160。代码运行获得的图像为:

图3 圆心变化
此时的完整代码为:
import numpy as np # 引入numpy模块
import cv2 as cv # 引入cv模块canvas = np.ones((580, 580, 3), np.uint8) * 225 # 绘制一个580*580大小的画布,3代表有3个通道,unit8为图像存储格式
# 第一个通道值
#for i in range(0, 580, 1):#for j in range(0, 580, 1):#canvas[i, j, 0] = 0.2 * (i + j) # 第一个通道值# 第二个通道值
#for i in range(0, 580, 1):#for j in range(0, 580, 1):#canvas[i, j, 1] = 50 * np.cos(i ^ j) + 55 * np.sin(j ^ i) + 150 * np.sin(j - i) # 第二个通道值# 第三个通道值
#for i in range(0, 580, 1):#for j in range(0, 580, 1):#canvas[i, j, 2] = 100 * np.tanh(i + j) + 100 * np.tanh(i - j) + 50 * np.cos(j - i) # 第三个通道值
#x0=285 #圆心横坐标
#y0=285 #圆心横坐标
r=160 #半径
for i in range(0,10,1):canvas = cv.circle(canvas, ((i-5)*10+280, (i-5)*20+280), r, (200,180,55), 2) #输出同心圆#canvas = cv.circle(canvas, (285, 285), 80, (0, 0, 255), 3) # 第一个圆形
#canvas = cv.circle(canvas, (100, 285), 80, (0, 255, 255), -1) # 第二个圆形
#canvas = cv.circle(canvas, (470, 285), 80, (255, 0, 0), -1) # 第三个圆形
# canvas = cv.rectangle(canvas, (50, 30), (530, 550), (155, 120, 60), 5) # 矩形
# canvas = cv.rectangle(canvas, (80, 80), (500, 500), (55, 160, 230), 10) # 矩形
# canvas = cv.rectangle(canvas, (150, 150), (430, 430), (50, 120, 90), -1) # 矩形
# canvas = cv.line(canvas, (50, 550), (550, 550), (58, 50, 150), 15) # 线段
# canvas = cv.line(canvas, (300, 50), (300, 550), (120, 150, 25), 20) # 线段cv.imshow('rectangle', canvas) # 在屏幕展示绘制圆形的效果
cv.imwrite('circle50.png', canvas) # 保存图像
cv.waitKey() # 图像不会自动关闭
cv.destroyAllWindows() # 释放所有窗口
【2.4】变化圆半径
在圆心变化的基础上,圆的半径可以变化,这样就会出现变化圆。
继续增添代码:
for i in range(0,10,1):canvas = cv.circle(canvas, ((i-5)*10+280, (i-5)*20+280), int(200*np.abs(np.sin(i))), (200,180,55), 2) #输出同心圆
在这里,半径值被修改为:int(200*np.abs(np.sin(i))),这是一个动态值。
运行后的图像为:

图4 变化圆
此时的完整代码为:
import numpy as np # 引入numpy模块
import cv2 as cv # 引入cv模块canvas = np.ones((580, 580, 3), np.uint8) * 225 # 绘制一个580*580大小的画布,3代表有3个通道,unit8为图像存储格式
# 第一个通道值
#for i in range(0, 580, 1):#for j in range(0, 580, 1):#canvas[i, j, 0] = 0.2 * (i + j) # 第一个通道值# 第二个通道值
#for i in range(0, 580, 1):#for j in range(0, 580, 1):#canvas[i, j, 1] = 50 * np.cos(i ^ j) + 55 * np.sin(j ^ i) + 150 * np.sin(j - i) # 第二个通道值# 第三个通道值
#for i in range(0, 580, 1):#for j in range(0, 580, 1):#canvas[i, j, 2] = 100 * np.tanh(i + j) + 100 * np.tanh(i - j) + 50 * np.cos(j - i) # 第三个通道值
#x0=285 #圆心横坐标
#y0=285 #圆心横坐标
#r=160 #半径
for i in range(0,10,1):canvas = cv.circle(canvas, ((i-5)*10+280, (i-5)*20+280), int(200*np.abs(np.sin(i))), (200,180,55), 2) #输出同心圆#canvas = cv.circle(canvas, (285, 285), 80, (0, 0, 255), 3) # 第一个圆形
#canvas = cv.circle(canvas, (100, 285), 80, (0, 255, 255), -1) # 第二个圆形
#canvas = cv.circle(canvas, (470, 285), 80, (255, 0, 0), -1) # 第三个圆形
# canvas = cv.rectangle(canvas, (50, 30), (530, 550), (155, 120, 60), 5) # 矩形
# canvas = cv.rectangle(canvas, (80, 80), (500, 500), (55, 160, 230), 10) # 矩形
# canvas = cv.rectangle(canvas, (150, 150), (430, 430), (50, 120, 90), -1) # 矩形
# canvas = cv.line(canvas, (50, 550), (550, 550), (58, 50, 150), 15) # 线段
# canvas = cv.line(canvas, (300, 50), (300, 550), (120, 150, 25), 20) # 线段cv.imshow('rectangle', canvas) # 在屏幕展示绘制圆形的效果
cv.imwrite('circle50.png', canvas) # 保存图像
cv.waitKey() # 图像不会自动关闭
cv.destroyAllWindows() # 释放所有窗口
【2.5】变化圆半径和颜色
在获得变化圆半径的基础上,继续修改代码,让圆的颜色变化:
for i in range(0,10,1):canvas = cv.circle(canvas, ((i-5)*10+280, (i-5)*20+280), int(200*np.abs(np.sin(i))), (int(abs(255*np.sin(i))),int(abs(255*np.cos(i))),int(255*np.tanh(i))), 2) #输出圆
在这里,颜色值被修改为:(int(abs(255*np.sin(i))),int(abs(255*np.cos(i))),int(255*np.tanh(i))),这是一个动态值。
运行后的图像为:

图5 变化圆半径和颜色
此时的完整代码为:
import numpy as np # 引入numpy模块
import cv2 as cv # 引入cv模块canvas = np.ones((580, 580, 3), np.uint8) * 225 # 绘制一个580*580大小的画布,3代表有3个通道,unit8为图像存储格式
# 第一个通道值
#for i in range(0, 580, 1):#for j in range(0, 580, 1):#canvas[i, j, 0] = 0.2 * (i + j) # 第一个通道值# 第二个通道值
#for i in range(0, 580, 1):#for j in range(0, 580, 1):#canvas[i, j, 1] = 50 * np.cos(i ^ j) + 55 * np.sin(j ^ i) + 150 * np.sin(j - i) # 第二个通道值# 第三个通道值
#for i in range(0, 580, 1):#for j in range(0, 580, 1):#canvas[i, j, 2] = 100 * np.tanh(i + j) + 100 * np.tanh(i - j) + 50 * np.cos(j - i) # 第三个通道值
#x0=285 #圆心横坐标
#y0=285 #圆心横坐标
#r=160 #半径
for i in range(0,10,1):canvas = cv.circle(canvas, ((i-5)*10+280, (i-5)*20+280), int(200*np.abs(np.sin(i))), (int(abs(255*np.sin(i))),int(abs(255*np.cos(i))),int(255*np.tanh(i))), 2) #输出同心圆#canvas = cv.circle(canvas, (285, 285), 80, (0, 0, 255), 3) # 第一个圆形
#canvas = cv.circle(canvas, (100, 285), 80, (0, 255, 255), -1) # 第二个圆形
#canvas = cv.circle(canvas, (470, 285), 80, (255, 0, 0), -1) # 第三个圆形
# canvas = cv.rectangle(canvas, (50, 30), (530, 550), (155, 120, 60), 5) # 矩形
# canvas = cv.rectangle(canvas, (80, 80), (500, 500), (55, 160, 230), 10) # 矩形
# canvas = cv.rectangle(canvas, (150, 150), (430, 430), (50, 120, 90), -1) # 矩形
# canvas = cv.line(canvas, (50, 550), (550, 550), (58, 50, 150), 15) # 线段
# canvas = cv.line(canvas, (300, 50), (300, 550), (120, 150, 25), 20) # 线段cv.imshow('rectangle', canvas) # 在屏幕展示绘制圆形的效果
cv.imwrite('circle50.png', canvas) # 保存图像
cv.waitKey() # 图像不会自动关闭
cv.destroyAllWindows() # 释放所有窗口
【2.6】变化背景
然后我们修改背景BGR值,获得颜色变化的背景画布:
# 第一个通道值
for i in range(0, 580, 1):for j in range(0, 580, 1):canvas[i, j, 0] = 0.2 * (i + j) # 第一个通道值# 第二个通道值
for i in range(0, 580, 1):for j in range(0, 580, 1):canvas[i, j, 1] = 150 * np.cos(i ^ j) + 55 * np.sin(j ^ i) + 50 * np.sin(j - i) # 第二个通道值# 第三个通道值
for i in range(0, 580, 1):for j in range(0, 580, 1):canvas[i, j, 2] = 50 * np.tanh(i + j) + 80 * np.tanh(i - j) + 120 * np.cos(j - i) # 第三个通道值
此时获得的图像为:

图6 变化圆和画布
此时的完整代码为:
import numpy as np # 引入numpy模块
import cv2 as cv # 引入cv模块canvas = np.ones((580, 580, 3), np.uint8) * 125 # 绘制一个580*580大小的画布,3代表有3个通道,unit8为图像存储格式
# 第一个通道值
for i in range(0, 580, 1):for j in range(0, 580, 1):canvas[i, j, 0] = 0.2 * (i + j) # 第一个通道值# 第二个通道值
for i in range(0, 580, 1):for j in range(0, 580, 1):canvas[i, j, 1] = 150 * np.cos(i ^ j) + 55 * np.sin(j ^ i) + 50 * np.sin(j - i) # 第二个通道值# 第三个通道值
for i in range(0, 580, 1):for j in range(0, 580, 1):canvas[i, j, 2] = 50 * np.tanh(i + j) + 80 * np.tanh(i - j) + 120 * np.cos(j - i) # 第三个通道值
#x0=285 #圆心横坐标
#y0=285 #圆心横坐标
#r=160 #半径
for i in range(0,10,1):canvas = cv.circle(canvas, ((i-5)*10+280, (i-5)*20+280), int(200*np.abs(np.sin(i))), (int(abs(255*np.sin(i))),int(abs(255*np.cos(i))),int(255*np.tanh(i))), 2) #输出同心圆#canvas = cv.circle(canvas, (285, 285), 80, (0, 0, 255), 3) # 第一个圆形
#canvas = cv.circle(canvas, (100, 285), 80, (0, 255, 255), -1) # 第二个圆形
#canvas = cv.circle(canvas, (470, 285), 80, (255, 0, 0), -1) # 第三个圆形
# canvas = cv.rectangle(canvas, (50, 30), (530, 550), (155, 120, 60), 5) # 矩形
# canvas = cv.rectangle(canvas, (80, 80), (500, 500), (55, 160, 230), 10) # 矩形
# canvas = cv.rectangle(canvas, (150, 150), (430, 430), (50, 120, 90), -1) # 矩形
# canvas = cv.line(canvas, (50, 550), (550, 550), (58, 50, 150), 15) # 线段
# canvas = cv.line(canvas, (300, 50), (300, 550), (120, 150, 25), 20) # 线段cv.imshow('rectangle', canvas) # 在屏幕展示绘制圆形的效果
cv.imwrite('circle50.png', canvas) # 保存图像
cv.waitKey() # 图像不会自动关闭
cv.destroyAllWindows() # 释放所有窗口
【3】总结
掌握了python+opencv灵活绘制圆形的技巧。
相关文章:
python学opencv|读取图像(二十一)使用cv2.circle()绘制圆形进阶
【1】引言 前序已经掌握了使用cv2.circle()绘制圆形的基本操作,相关链接为: python学opencv|读取图像(二十)使用cv2.circle()绘制圆形-CSDN博客 由于圆形本身绘制起来比较简单,因此可以自由操作的空间也就大&#x…...
CLIP:连接文本与图像, 从自然语言监督中学习可迁移的视觉模型
CLIP:连接文本与图像, 从自然语言监督中学习可迁移的视觉模型 flyfish Learning Transferable Visual Models From Natural Language Supervision https://github.com/OpenAI/CLIP 摘要 CLIP Contrastive Language-Image Pre-Training Contrastive&…...
Linux 硬盘扩容 分区 挂载
Linux 硬盘扩容 分区 & 挂载 1. 添加分区 1.1. 查看新添加的硬盘 fdisk -l假设当前未挂载的盘符是/dev/sdb,后文中所有操作都按挂载/dev/sdb 操作 1.2. 分区管理 小硬盘 fdisk /dev/sdb大硬盘(2TB以上) gdisk /dev/sdb1.3. 编辑分…...
基于 Slf4j 和 AOP 的自动化方法执行时间日志记录方案
前言 其实这个需求很简单,但是这个需求又是项目中必不可少的,尤其对于性能调优这块,但是使用哪种方式更加方便呢,这就是本篇博文需要讨论的重点 系统时间 可以通过 System.currentTimeMillis() 或 System.nanoTime() 来实现。 …...
关于 K8s 的一些基础概念整理-补充【k8s系列之二】
〇、前言 本文继续整理下 K8s 的一些基础概念,作为前一篇概念汇总的补充。 前一篇博文链接:关于 K8s 的一些基础概念整理【k8s系列之一】_集群 master节点 控制节点 宿主机-CSDN博客 一、详情 1.1 Label Label 在 k8s 中是一个非常核心的概念…...
FPGA的DMA应用——pcileech
硬件通过pcie总线,访存本机的内存,并进行修改,可以进行很多操作。 学习视频:乱讲DMA及TLP 1-pcileech项目简介和自定义模块介绍_哔哩哔哩_bilibili vivado2024.1的下载文章链接和地址:AMD-Xilinx Vivado™ 2024.1 现…...
信息安全管理:运行管理checklist
运行管理checklist内容包括日常操作与维护管理、变更管理、备份与故障恢复、应急与业务连续性管理等内容。 一、日常操作与维护管理 ▼▼制度与流程 是否建立日常运行操作制度与流程?包括网络、主机、应用等方面的操作制度与流程? 是否明确相关部门和人…...
Linux系统之stat命令的基本使用
Linux系统之stat命令的基本使用 一、stat命令 介绍二、stat命令帮助2.1 查询帮助信息2.2 stat命令的帮助解释 三、stat命令的基本使用3.1 查询文件信息3.2 查看文件系统状态3.3 使用格式化输出3.4 以简洁形式打印信息 四、注意事项 一、stat命令 介绍 stat 命令用于显示文件或文…...
云手机+Facebook:让科技与娱乐完美结合
移动互联网时代,Facebook作为全球最大的社交媒体平台之一,早已成为企业、品牌和组织竞相角逐的营销阵地。而云手机的出现,则为Facebook营销注入了新的活力,其独特的优势让营销活动更加高效、精准且灵活。本文将深入探讨云手机在Fa…...
为什么要在PHY芯片和RJ45网口中间加网络变压器
在PHY芯片和RJ45网口之间加入网络变压器是出于以下几个重要的考虑: 1. 电气隔离:网络变压器提供了电气隔离功能,有效阻断了PHY芯片与RJ45之间直流分量的直接连接。这样可以防止可能的电源冲突,降低系统故障的风险,并保…...
LeetCode 19:删除链表的倒数第N 个结点
题目: 地址:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/ 方法一: 方法二: 代码: package com.zy.leetcode.LeetCode_19;/*** Author: zy* Date: 2024-12-25-13:01* Description: 删除链表…...
RT-DETR融合[IJCV2024]LSKNet中的LSKBlock模块
RT-DETR使用教程: RT-DETR使用教程 RT-DETR改进汇总贴:RT-DETR更新汇总贴 《Large Selective Kernel Network for Remote Sensing Object Detection》 一、 模块介绍 论文链接:https://arxiv.org/pdf/2303.09030 代码链接:https:…...
C/C++ 数据结构与算法【树和森林】 树和森林 详细解析【日常学习,考研必备】带图+详细代码
一、树的存储结构 1)双亲表示法实现: 定义结构数组存放树的结点,每个结点含两个域: 数据域:存放结点本身信息。双亲域:指示本结点的双亲结点在数组中的位置。 特点:找双亲简单,找孩子难 C语…...
新浪微博大数据面试题及参考答案(数据开发和数据分析)
介绍一下你所掌握的计算机网络和操作系统相关知识 计算机网络:计算机网络是将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。我掌握了网络协议…...
OpenHarmony怎么修改DPI密度值?RK3566鸿蒙开发板演示
本文介绍在开源鸿蒙OpenHarmony系统下,修改DPI密度值的方法,触觉智能Purple Pi OH鸿蒙开发板演示,搭载了瑞芯微RK3566四核处理器,Laval鸿蒙社区推荐开发板,已适配全新开源鸿蒙OpenHarmony5.0 Release系统,适…...
SAP GUI Scripting - 如何判断组件是否存在
总体来说,SAP Scripting 与 BDC 类似,因为是屏幕录制,就可能碰到不同的情况,比如每个录入的数据不同,可能出现一个对话框,或者出现一个状态栏消息。这种任何有变化的情况,在 Scripting 中没有考…...
Go 计算Utf8字符串的长度 不要超过mysql字段的最大长度
背景: 我有一个mysql的字段,是utf8格式的,但有时候前端传的字符串会超长,为此我需要在后端接口,先判断是否超长,如果超长,则报错提示前端。 代码: // 计算utf8下,字符串…...
llamafactory报错:双卡4090GPU,训练qwen2.5:7B、14B时报错GPU显存不足(out of memory),轻松搞定~~~
实际问题场景: 使用llamafactory进行微调qwen2.5 7B和14B的大模型时,会出现out of memory的报错。尝试使用降低batch_size(原本是2,现在降到1)的方式,可以让qwen2.5:7B跑起来,但时不时会不稳定…...
全局webSocket 单个页面进行监听并移除单页面监听
之前全局封装的 webSocket 在某些特定的页面中使用会直接去调用 webSocket 的 onMessage 方法 已进入页面就会调,如果退出页面移除整个监听的话全局监听就会被移除 这是修改后的 全局封装 let token uni.getStorageSync(token) const HEARTBEAT_INTERVAL 1 *…...
JVM调优实践篇
理论篇 1多功能养鱼塘-JVM内存 大鱼塘O(可分配内存): JVM可以调度使用的总的内存数,这个数量受操作系统进程寻址范围、系统虚拟内存总数、系统物理内存总数、其他系统运行所占用的内存资源等因素的制约。 小池塘A&a…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
毫米波雷达基础理论(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 方…...
