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…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
