python学opencv|读取图像(四十九)原理探究:使用cv2.bitwise()系列函数实现图像按位运算
【0】基础定义
按位与运算:两个等长度二进制数上下对齐,全1取1,其余取0。
按位或运算:两个等长度二进制数上下对齐,有1取1,其余取0。
按位异或运算: 两个等长度二进制数上下对齐,相同取0,其余取1。
按位取反运算:一个二进制数,0变1,1变0。
【2】引言
在前序学习进程中,调用cv2.bitwise()系列函数实现了图像的按位与计算,相关文章链接包括且不限于:
python学opencv|读取图像(四十三)使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客
python学opencv|读取图像(四十五)增加掩模:使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客
python学opencv|读取图像(四十六)使用cv2.bitwise_or()函数实现图像按位或运算-CSDN博客
python学opencv|读取图像(四十七)使用cv2.bitwise_not()函数实现图像按位取反运算-CSDN博客
python学opencv|读取图像(四十八)使用cv2.bitwise_xor()函数实现图像按位异或运算-CSDN博客
图像的按位与计算,是通过对各个像素点上的BGR值进行操作:先把十进制数转化为二进制数,再进行按位计算,然后再转回十进制数输出。
由于前序文章的重点是对比按位计算前后图像的色彩变化,除按位与计算外,没有详细深究二进制按位计算过程。因此本文以之前按位与计算为基础,对此展开专题探索。
按位与计算的原理探索文章链接为:
python学opencv|读取图像(四十三)使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客
【3】项目可行性分析
以输入的外部图像为基础,调用cv2.bitwise()系列函数让图像进行按位计算后,读取相关点的BGR值,使用np.bitwise()系列函数对cv2.bitwise()系列函数按位计算进行原理呈现。
【4】代码测试
首先引入相关模块和图像:
import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块# 读取图片-直接转化灰度图
src = cv.imread('srcx.png') #读取图像
dst=src #输出图像
gray_src=cv.cvtColor(src,cv.COLOR_BGR2GRAY) #转化为灰度图
dstg=gray_src #输出图像
print('初始图像像素大小为',src.shape)
print('初始图像灰度图像素大小为',gray_src.shape)
除了按位取反操作之外,其他按位操作均需要在引入一张图像:
# 定义第二个图像
image = np.zeros(src.shape, np.uint8) # 定义一个竖直和水平像素与初始图像等大的全0矩阵
print('第二个图像像素大小为',image.shape)
image[50:350, :, :] = 180 # 行掩模
image[:,120:200,: ] = 255 # 列掩模
image[:, :, 2] = 120 # 第二个通道值
然后要引入一个8位单通道的二维矩阵定义掩模:
#定义掩模矩阵
mask = np.zeros((gray_src.shape), np.uint8) # 定义一个竖直和水平像素与初始图像等大的全0矩阵
mask[280:350, :] = 155 # 水平区域
mask[:,150:350] = 100 # 竖直区域
之后就调用cv2.bitwise()系列函数执行按位计算:
#执行位运算
#按位与运算
img_and=cv.bitwise_and(src,image) #按位与运算
img_and_mask=cv.bitwise_and(src,image,mask=mask) #按位与运算
#按位或运算
img_or=cv.bitwise_or(src,image) #按位或运算
img_or_mask=cv.bitwise_or(src,image,mask=mask) #按位或运算
#按位异或运算
img_xor=cv.bitwise_xor(src,image) #按位异或运算
img_xor_mask=cv.bitwise_xor(src,image,mask=mask) #按位异或计算
#按位取反运算
img_not=cv.bitwise_not(src) #按位取反运算
img_not_mask=cv.bitwise_not(src,mask=mask) #按位异或计算
按位计算执行以后,图像的BGR值发生变化,这时候使用np.bitwise()系列函数图像的BGR值进行按位计算,以对cv2.bitwise()系列函数按位计算进行原理呈现:
#显示BGR值
print("初始图像dst像素数为[300,180]位置处的BGR=", dst[300,180],'=a') # 获取像素数为[100,100]位置处的BGR
print("第二个图像image像素数为[300,180]位置处的BGR=", image[300,180],'=b') # 获取像素数为[100,100]位置处的BGR
print("img_and像素数为[300,180]位置处的BGR=", img_and[300,180],'=c') # 获取像素数为[100,100]位置处的BGR
print("img_and_mask像素数为[300,180]位置处的BGR=", img_and_mask[300,180]) # 获取像素数为[100,100]位置处的BGR
print("img_or像素数为[300,180]位置处的BGR=", img_or[300,180],'=d') # 获取像素数为[100,100]位置处的BGR
print("img_or_mask像素数为[300,180]位置处的BGR=", img_or_mask[300,180]) # 获取像素数为[100,100]位置处的BGR
print("img_xor像素数为[300,180]位置处的BGR=", img_xor[300,180],'=e') # 获取像素数为[100,100]位置处的BGR
print("img_xor_mask像素数为[300,180]位置处的BGR=", img_xor_mask[300,180]) # 获取像素数为[100,100]位置处的BGR
print("img_not像素数为[300,180]位置处的BGR=", img_not[300,180],'=f') # 获取像素数为[100,100]位置处的BGR
print("img_not_mask像素数为[300,180]位置处的BGR=", img_not_mask[300,180]) # 获取像素数为[100,100]位置处的BGRa=np.zeros((1,3),np.uint8) #定义矩阵
a=dst[300,180] #将像素点BGR直接赋值给矩阵-初始图像
b=np.zeros((1,3),np.uint8) #定义矩阵
b=image[300,180] #将像素点BGR直接赋值给矩阵-第二个图像
c=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_and
d=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_or
e=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_xor
f=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_not# 二进制按位与计算
for i in range(3): # 计数print('a', '[0,', i, ']=', a[i], '的二进制转化值=',bin(a[i])) # 输出二进制转化值print('b', '[0,', i, ']=', b[i], '的二进制转化值=',bin(b[i])) # 输出二进制转化值c[0, i] = np.bitwise_and(a[i], b[i]) # 赋值按位与计算值print('c', '[0,', i, ']=', c[0,i], '的二进制转化值=', bin(c[0,i])) # 输出二进制转化值d[0, i] = np.bitwise_or(a[i], b[i]) # 赋值按位或计算值print('d', '[0,', i, ']=', d[0,i], '的二进制转化值=', bin(d[0,i])) # 输出二进制转化值e[0, i] = np.bitwise_xor(a[i], b[i]) # 赋值按位或计算值print('e', '[0,', i, ']=', e[0, i], '的二进制转化值=', bin(e[0, i])) # 输出二进制转化值f[0, i] = np.bitwise_not(a[i]) # 赋值按位或计算值print('f', '[0,', i, ']=', e[0, i], '的二进制转化值=', bin(f[0, i])) # 输出二进制转化值print('c', [0, i], '是a[0,', i, ']和b[0', i, ']按位与的值=np.bitwise_and(a[0,',i, '],b[0,',i,'])=', c[0, i]) # 输出按位与计算值print('d', [0, i], '是a[0,', i, ']和b[0', i, ']按位或的值=np.bitwise_or(a[0,',i, '],b[0,',i,'])=', d[0, i]) # 输出按位或计算值print('e', [0, i], '是a[0,', i, ']和b[0', i, ']按位异或的值=np.bitwise_xor(a[0,',i, '],b[0,',i,'])=', e[0, i]) # 输出按位异或计算值print('f', [0, i], '是a[0,', i, ' ]按位取反的值=np.bitwise_not(a[0,',i, '])=', f[0, i]) # 输出按位取反计算值# 输出矩阵结果
print('a=', a) # 输出矩阵
print('b=', b) # 输出矩阵
print('c=', c) # 输出矩阵
print('d=', d) # 输出矩阵
print('e=', e) # 输出矩阵
print('f=', f) # 输出矩阵
由于主要关注数值变化,因此未直接显示相关图像,其余代码可作为辅助学习使用:
#合并图像
himg_and_andmask = np.hstack((img_and,img_and_mask))
himg_or_ormask = np.hstack((img_or,img_or_mask))
himg_xor_xormask = np.hstack((img_xor,img_xor_mask))
himg_not_notmask = np.hstack((img_not,img_not_mask))# 显示和保存定义的图像
#cv.imshow('dst', dst) # 显示图像
#cv.imshow('image', image) # 显示图像
#cv.imshow('mask', mask) # 显示图像
#cv.imshow('himg_and_andmask', himg_and_andmask) # 显示图像
#cv.imshow('himg_or_ormask', himg_or_ormask) # 显示图像
#cv.imshow('himg_xor_xormask', himg_xor_xormask) # 显示图像
#cv.imshow('himg_not_notmask', himg_not_notmask) # 显示图像cv.waitKey() # 图像不关闭
cv.destroyAllWindows() # 释放所有窗口
代码运行使用的相关图像有:
图1 初始图像srcx.png
图2 第二张图像image.png
图3 掩模mask.png
代码运行后,获得的相关文字输出为:
图4 图像基本属性
图5 特定像素点BGR值读取
读取到特定像素点[300,180]处的BGR之后,首先需要关注:
初始图像在此处的BGR值为:[132 80 121]
第二张图像在此处的BGR值为:[255 255 120]
其余位置的数据,其实是通过cv2.bitwise()系列函数按位计算之后获得的。为追溯这个计算过程,继续获得了输出文字:

图6 特定像素点BGR值-按位计算第一个点
需要注意的是 ,e[0,0]和f[0,0]在0b后面只有7位数字,这是因为0b01111011在0b之后的0确实没有用处,只有占位的作用,所以python就直接省略了。

图7 特定像素点BGR值-按位计算第二个点
a[0,1]和c[0,1]在0b后面只有7位数字,也是因为在0b之后的0确实没有用处,只有占位的作用,所以python就直接省略了。

图8 特定像素点BGR值-按位计算第二个点
e[0,2]是异或计算的结果,两个二进制数上下对齐,相同取0,其余取1,只有最右侧的位置不同,其余均相同,所以最后的结果是1。
f[0,2]是按位取反的结果,虽然a[0,2]只有7位,但首位的0取反之后就是1,所以f[0,2]有8位数字。
此时的完整代码为:
import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块# 读取图片-直接转化灰度图
src = cv.imread('srcx.png') #读取图像
dst=src #输出图像
gray_src=cv.cvtColor(src,cv.COLOR_BGR2GRAY) #转化为灰度图
dstg=gray_src #输出图像
print('初始图像像素大小为',src.shape)
print('初始图像灰度图像素大小为',gray_src.shape)# 定义第二个图像
image = np.zeros(src.shape, np.uint8) # 定义一个竖直和水平像素与初始图像等大的全0矩阵
print('第二个图像像素大小为',image.shape)
image[50:350, :, :] = 180 # 行掩模
image[:,120:200,: ] = 255 # 列掩模
image[:, :, 2] = 120 # 第二个通道值#定义掩模矩阵
mask = np.zeros((gray_src.shape), np.uint8) # 定义一个竖直和水平像素与初始图像等大的全0矩阵
mask[280:350, :] = 155 # 水平区域
mask[:,150:350] = 100 # 竖直区域#执行位运算
#按位与运算
img_and=cv.bitwise_and(src,image) #按位与运算
img_and_mask=cv.bitwise_and(src,image,mask=mask) #按位与运算
#按位或运算
img_or=cv.bitwise_or(src,image) #按位或运算
img_or_mask=cv.bitwise_or(src,image,mask=mask) #按位或运算
#按位异或运算
img_xor=cv.bitwise_xor(src,image) #按位异或运算
img_xor_mask=cv.bitwise_xor(src,image,mask=mask) #按位异或计算
#按位取反运算
img_not=cv.bitwise_not(src) #按位取反运算
img_not_mask=cv.bitwise_not(src,mask=mask) #按位异或计算#显示BGR值
print("初始图像dst像素数为[300,180]位置处的BGR=", dst[300,180],'=a') # 获取像素数为[100,100]位置处的BGR
print("第二个图像image像素数为[300,180]位置处的BGR=", image[300,180],'=b') # 获取像素数为[100,100]位置处的BGR
print("img_and像素数为[300,180]位置处的BGR=", img_and[300,180],'=c') # 获取像素数为[100,100]位置处的BGR
print("img_and_mask像素数为[300,180]位置处的BGR=", img_and_mask[300,180]) # 获取像素数为[100,100]位置处的BGR
print("img_or像素数为[300,180]位置处的BGR=", img_or[300,180],'=d') # 获取像素数为[100,100]位置处的BGR
print("img_or_mask像素数为[300,180]位置处的BGR=", img_or_mask[300,180]) # 获取像素数为[100,100]位置处的BGR
print("img_xor像素数为[300,180]位置处的BGR=", img_xor[300,180],'=e') # 获取像素数为[100,100]位置处的BGR
print("img_xor_mask像素数为[300,180]位置处的BGR=", img_xor_mask[300,180]) # 获取像素数为[100,100]位置处的BGR
print("img_not像素数为[300,180]位置处的BGR=", img_not[300,180],'=f') # 获取像素数为[100,100]位置处的BGR
print("img_not_mask像素数为[300,180]位置处的BGR=", img_not_mask[300,180]) # 获取像素数为[100,100]位置处的BGRa=np.zeros((1,3),np.uint8) #定义矩阵
a=dst[300,180] #将像素点BGR直接赋值给矩阵-初始图像
b=np.zeros((1,3),np.uint8) #定义矩阵
b=image[300,180] #将像素点BGR直接赋值给矩阵-第二个图像
c=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_and
d=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_or
e=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_xor
f=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_not# 二进制按位与计算
for i in range(3): # 计数print('a', '[0,', i, ']=', a[i], '的二进制转化值=',bin(a[i])) # 输出二进制转化值print('b', '[0,', i, ']=', b[i], '的二进制转化值=',bin(b[i])) # 输出二进制转化值c[0, i] = np.bitwise_and(a[i], b[i]) # 赋值按位与计算值print('c', '[0,', i, ']=', c[0,i], '的二进制转化值=', bin(c[0,i])) # 输出二进制转化值d[0, i] = np.bitwise_or(a[i], b[i]) # 赋值按位或计算值print('d', '[0,', i, ']=', d[0,i], '的二进制转化值=', bin(d[0,i])) # 输出二进制转化值e[0, i] = np.bitwise_xor(a[i], b[i]) # 赋值按位或计算值print('e', '[0,', i, ']=', e[0, i], '的二进制转化值=', bin(e[0, i])) # 输出二进制转化值f[0, i] = np.bitwise_not(a[i]) # 赋值按位或计算值print('f', '[0,', i, ']=', e[0, i], '的二进制转化值=', bin(f[0, i])) # 输出二进制转化值print('c', [0, i], '是a[0,', i, ']和b[0', i, ']按位与的值=np.bitwise_and(a[0,',i, '],b[0,',i,'])=', c[0, i]) # 输出按位与计算值print('d', [0, i], '是a[0,', i, ']和b[0', i, ']按位或的值=np.bitwise_or(a[0,',i, '],b[0,',i,'])=', d[0, i]) # 输出按位或计算值print('e', [0, i], '是a[0,', i, ']和b[0', i, ']按位异或的值=np.bitwise_xor(a[0,',i, '],b[0,',i,'])=', e[0, i]) # 输出按位异或计算值print('f', [0, i], '是a[0,', i, ' ]按位取反的值=np.bitwise_not(a[0,',i, '])=', f[0, i]) # 输出按位取反计算值# 输出矩阵结果
print('a=', a) # 输出矩阵
print('b=', b) # 输出矩阵
print('c=', c) # 输出矩阵
print('d=', d) # 输出矩阵
print('e=', e) # 输出矩阵
print('f=', f) # 输出矩阵#合并图像
himg_and_andmask = np.hstack((img_and,img_and_mask))
himg_or_ormask = np.hstack((img_or,img_or_mask))
himg_xor_xormask = np.hstack((img_xor,img_xor_mask))
himg_not_notmask = np.hstack((img_not,img_not_mask))# 显示和保存定义的图像
#cv.imshow('dst', dst) # 显示图像
#cv.imshow('image', image) # 显示图像
#cv.imshow('mask', mask) # 显示图像
#cv.imshow('himg_and_andmask', himg_and_andmask) # 显示图像
#cv.imshow('himg_or_ormask', himg_or_ormask) # 显示图像
#cv.imshow('himg_xor_xormask', himg_xor_xormask) # 显示图像
#cv.imshow('himg_not_notmask', himg_not_notmask) # 显示图像cv.waitKey() # 图像不关闭
cv.destroyAllWindows() # 释放所有窗口
综上所述:
a.图像的按位与计算,是通过对各个像素点上的BGR值进行操作:先把十进制数转化为二进制数,再进行按位计算,然后再转回十进制数输出。
b.使用np.bitwise()系列函数对cv2.bitwise()系列函数按位计算进行原理呈现中继续发现,python在输出二进制的过程中,会省略0b之后紧跟的0。
【5】总结
专题探索了cv2.bitwise()系列函数按位计算时的BGR值二进制转化和按位计算过程。
相关文章:
python学opencv|读取图像(四十九)原理探究:使用cv2.bitwise()系列函数实现图像按位运算
【0】基础定义 按位与运算:两个等长度二进制数上下对齐,全1取1,其余取0。 按位或运算:两个等长度二进制数上下对齐,有1取1,其余取0。 按位异或运算: 两个等长度二进制数上下对齐,相…...
【面试】【编程范式总结】面向对象编程(OOP)、函数式编程(FP)和响应式编程(RP)
一、编程范式总结 编程范式是指开发软件时采用的一种方法论或思维方式,主要包括面向对象编程(OOP)、**函数式编程(FP)和响应式编程(RP)**等。这些范式的不同特性和适用场景,帮助开发…...
创建要素图层和表视图
操作方法: 下面按照步骤学习如何使用Make Feature Layer和Make Table View工具 1.在arcmap中打开活动地图文档 2.导入arcpy模块 3.设置工作空间 arcpy.env.workspace "<>" 4.使用try语句,使用Make Feature Layer工具创建内存副本 try:flayer arcpy.Ma…...
51单片机入门_01_单片机(MCU)概述(使用STC89C52芯片;使用到的硬件及课程安排)
文章目录 1. 什么是单片机1.1 微型计算机的组成1.2 微型计算机的应用形态1.3 单板微型计算机1.4 单片机(MCU)1.4.1 单片机内部结构1.4.2 单片机应用系统的组成 1.5 80C51单片机系列1.5.1 STC公司的51单片机1.5.1 STC公司单片机的命名规则 2. 单片机的特点及应用领域2.1 单片机的…...
万物皆有联系:驼鸟和布什
布什?一块布十块钱吗?不是,大家都知道,美国有两个总统,叫老布什和小布什,因为两个布什总统(父子俩),大家就这么叫来着,目的是为了好区分。 布什总统的布什&a…...
【最后203篇系列】007 使用APS搭建本地定时任务
说明 最大的好处是方便。 其实所有任务的源头,应该都是通过定时的方式,在每个时隙发起轮询。当然在任务的后续传递中,可以通过CallBack或者WebHook的方式,以事件的形态进行。这样可以避免长任务执行的过程中进行等待和轮询。 总结…...
go gin配置air
一、依赖下载 安装最新,且在你工作区下进行安装,我的是D:/GO是我的工作区,所有项目都在目录下的src, go install github.com/air-verse/airlatest 如果出现类似报错: 将图中第三行 github.com/air-verse/air 替换最…...
Java定时任务实现方案(五)——时间轮
时间轮 这篇笔记,我们要来介绍实现Java定时任务的第五个方案,使用时间轮,以及该方案的优点和缺点。 时间轮是一种高效的定时任务调度算法,特别适用于大量定时任务的场景。时间轮的定时任务实现,可以使用DelayQueue…...
【事务管理】
目录 一. 介绍与操作二. Spring事务管理三. 事务四大特性 \quad 一. 介绍与操作 \quad \quad 二. Spring事务管理 \quad 推荐加在经常进行增删改的方法上 \quad 三. 事务四大特性 \quad ctrlaltt...
Highcharts 柱形图:深入解析与最佳实践
Highcharts 柱形图:深入解析与最佳实践 引言 Highcharts 是一个功能强大的图表库,它允许用户轻松地在网页上创建各种类型的图表。其中,柱形图因其直观的展示方式,在数据分析、业务报告等领域得到了广泛应用。本文将深入解析 Highcharts 柱形图,包括其基本用法、高级特性…...
js笔记(黑马程序员)
js(day2) 一、运算符 1.赋值运算符 运算符作用加法赋值-减法赋值*乘法复制/除法赋值%取余赋值 2.一元运算符 符号作用说明自增变量自身的值加1,如X--自减变量自身的值减1,如X-- 3.比较运算符 运算符作用>左边是否大于右…...
Mac m1,m2,m3芯片使用nvm安装node14报错
使用nvm安装了node 12/16/18都没有问题,到14就报错了。第一次看到这个报错有点懵,查询资料发现是Mac芯片的问题。 Issue上提供了两个方案: 1、为了在arm64的Mac上安装node 14,需要使用Rosseta,可以通过以下命令安装 …...
LeetCode:63. 不同路径 II
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:63. 不同路径 II 给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0]…...
安装zsh并美化
0 Zsh 是一种功能强大的 shell,通常用于替代默认的 Bash shell。它为命令行提供了更多的功能,例如自动补全、强大的模式匹配和主题支持等。 Oh My Zsh 是用于管理 Zsh 配置的框架。 powerlevel10k是样式,通过p10k configure脚本可以调节自己…...
读量子霸权18读后总结与感想兼导读
1. 基本信息 量子霸权 【美】加来道雄 著 中信出版集团股份有限公司,2024年4月出版 1.1. 读薄率 书籍总字数281千字,笔记总字数65977字。 读薄率65977281000≈23.48% 1.2. 读厚方向 量子宇宙 从掷骰子到阿尔法狗:趣谈概率 上帝掷骰子吗…...
统计学中的样本概率论中的样本
不知道当初谁想的把概率论和数理统计合并,作为一门课。这本身是可以合并,完整的一条线,看这里。但是,作为任课老师应该从整体上交代清楚,毕竟是两个学科,不同的学科合并必然会有各种不协调的问题。 举个最…...
HTML 符号详解
HTML 符号详解 引言 HTML(超文本标记语言)符号是HTML文档中用来表示特殊字符的标记。这些符号在日常网页设计和开发中扮演着重要角色,特别是在需要显示版权、商标、货币符号等特殊字符时。本文将详细介绍HTML符号的用法、类型以及如何在HTML文档中插入这些符号。 HTML符号…...
蓝桥杯练习日常|c/c++竞赛常用库函数(下)
书接上回......蓝桥杯算法日常|c\c常用竞赛函数总结备用-CSDN博客 目录 书接上回......https://blog.csdn.net/weixin_47011416/article/details/145290017 1、二分查找 2、lower_bound uper_bound 3、memset() 函数原型 参数说明 返回值 常见用…...
Python vLLM 实战应用指南
文章目录 1. vLLM 简介2. 安装 vLLM3. 快速开始3.1 加载模型并生成文本3.2 参数说明 4. 实战应用场景4.1 构建聊天机器人示例对话: 4.2 文本补全输出示例: 4.3 自定义模型服务启动服务调用服务 5. 性能优化5.1 GPU 加速5.2 动态批处理 6. 总结 vLLM 是一…...
.NET MAUI 入门学习指南
引言 在当今移动应用和跨平台开发的热潮中,.NET MAUI(Multi - platform App UI)应运而生,为开发者提供了一种高效、统一的方式来构建跨多个平台(如 iOS、Android、Windows 等)的原生应用。它整合了 Xamarin.Forms 的优点,并在此基础上进行了诸多改进和创新,使得开发者…...
NCM格式解密技术深度解析:如何实现网易云音乐无损音频转换
NCM格式解密技术深度解析:如何实现网易云音乐无损音频转换 【免费下载链接】ncmdump ncmdump - 网易云音乐NCM转换 项目地址: https://gitcode.com/gh_mirrors/ncmdu/ncmdump ncmdump是一款专业的网易云音乐NCM格式解密工具,它通过Java实现完整的…...
从供热管道泄漏模拟出发,聊聊Fluent中那些容易被忽略的‘粘性模型’选择细节
从供热管道泄漏模拟看Fluent粘性模型选择的工程智慧 供热管道泄漏事故的数值模拟一直是市政工程中的难点——当高温高压流体从破损处喷涌而出时,流动形态会经历从管道内湍流到自由射流的复杂转变。这种多尺度流动对湍流模型的选择提出了严苛考验,而大多数…...
实战避坑!从WMS视角看Android UI线程优化:为什么主线程耗时必掉帧?
从WMS到Choreographer:Android主线程耗时操作导致丢帧的底层原理与实战优化 当你在Android应用中滑动列表时突然出现卡顿,或是界面渲染出现明显延迟,这背后往往隐藏着主线程耗时操作与WMS(WindowManagerService)、Chor…...
Qwen3-ASR-0.6B与LaTeX集成:学术语音笔记系统
Qwen3-ASR-0.6B与LaTeX集成:学术语音笔记系统 1. 引言 学术研究工作中,记录和整理笔记是每个研究者都要面对的重要任务。无论是参加学术会议、听讲座,还是记录自己的研究思路,传统的手写或打字方式往往效率不高,特别…...
如何快速掌握React Email Editor:深入理解拖拽邮件编辑器的实现原理
如何快速掌握React Email Editor:深入理解拖拽邮件编辑器的实现原理 【免费下载链接】react-email-editor Drag-n-Drop Email Editor Component for React.js 项目地址: https://gitcode.com/gh_mirrors/re/react-email-editor React Email Editor是一个功能…...
部署开源的Minecraft服务器智能运维管理系统 Minecraft-Rcon-Manage 自存简易教程
项目地址:Minecraft-Rcon-Manage 前言 笔者最近寻找一款能实现Minecraft服务器RCON远程访问的工具,找到了这个目前正在持续更新、功能丰富的开源项目Minecraft-Rcon-Manage,但实际部署过程中发现作者提供的教程博客无法正常访问,…...
nRF51822 RTC1深度睡眠唤醒与80μA低功耗优化
1. nRF51822低功耗唤醒系统深度解析:RTC1驱动的深度睡眠唤醒机制与80μA电流优化实践1.1 项目背景与工程痛点定位nRF51_WakeUp项目聚焦于nRF51822 SoC在超低功耗场景下的精准唤醒能力构建,其核心目标是通过RTC1(Real-Time Counter 1ÿ…...
基于训练RBF神经网络的车速信息时序预测Matlab模型
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...
开源项目国际化:多语言配置全流程指南
开源项目国际化:多语言配置全流程指南 【免费下载链接】pivottable Open-source Javascript Pivot Table (aka Pivot Grid, Pivot Chart, Cross-Tab) implementation with dragndrop. 项目地址: https://gitcode.com/gh_mirrors/pi/pivottable 跨国团队如何让…...
手把手教你用ROS2和ZED2 SDK搭建3D视觉开发环境(Ubuntu 20.04版)
手把手教你用ROS2和ZED2 SDK搭建3D视觉开发环境(Ubuntu 20.04版) 在自动驾驶、增强现实和机器人导航等领域,3D视觉感知已成为核心技术之一。ZED2相机凭借其双目深度感知能力和高精度SLAM算法,成为开发者构建空间智能系统的首选传感…...
