【ISP】ISP pipeline(AI)
ISP Pipeline 全流程概览
ISP(Image Signal Processing,图像信号处理)流程通常从原始 Bayer 数据出发,经过一系列模块处理,逐步完成图像校正和增强,最终生成用于显示或编码的标准图像。常见处理模块包括:
DPC(Defect Pixel Correction) – 坏点检测与修复
BLC(Black Level Correction) – 黑电平校正
NR(Noise Reduction) – 降噪处理
LSC(Lens Shading Correction) – 镜头阴影校正
AWB(Auto White Balance) – 自动白平衡
Demosaic – 彩色插值
CCM(Color Correction Matrix) – 颜色校正矩阵
Gamma Correction – 伽马校正
EE(Edge Enhancement) – 边缘增强
YUV/CSC – 颜色空间转换(RGB→YUV)
MTK67/68 平台 ISP Pipeline 调试大纲
1. ISP Pipeline 总览
- 定义与流程
- 解释 ISP Pipeline 的基本概念,即如何从原始 Bayer 图像(Raw Image)经过逐级处理(如 DPC → BLC → NR → LSC → AWB → Demosaic → CCM → Gamma → EE → YUV/CSC)最终输出标准图像。
- 整体目标
- 保障图像质量、色彩还原、亮度调节与噪声控制。
2. 各模块详细参数说明
针对 MTK67/68 平台,列出常用的各模块及其调试参数:
2.1. DPC(Defect Pixel Correction,坏点修复)
- 常见参数:
DPC_Enable
:启用/禁用坏点修复。DPC_Threshold
:坏点检测的阈值。DPC_Mode
:修复模式(静态/动态)。
- 作用与场景:
- 自动检测传感器中的异常像素,修复后减少图像出现亮点或暗点。
- 适用于生产及后期图像质量提升。
- 预期效果:
- 图像整体更干净,无明显坏点。
2.2. BLC(Black Level Correction,黑电平校正)
- 常见参数:
BLC_Offset_R/G/B
:各通道黑电平偏移量。
- 作用与场景:
- 校正传感器输出的基准电平,确保暗部正确还原。
- 应用于低照度或暗场环境下的图像调优。
- 预期效果:
- 暗部细节更加丰富,无灰雾或色偏。
2.3. NR(Noise Reduction,降噪处理)
- 常见参数:
NR_Luma_Strength
:亮度降噪强度。NR_Chroma_Strength
:色度降噪强度。NR_Spatial_Weight
、NR_Temporal_Weight
:空间与时间降噪权重。
- 作用与场景:
- 抑制高 ISO 或低光环境下产生的噪点,保证图像清晰。
- 涉及多场景下的降噪调优。
- 预期效果:
- 图像噪点减少,细节保留更好。
2.4. LSC(Lens Shading Correction,镜头阴影校正)
- 常见参数:
LSC_Gain_Map
:增益映射表(例如 17×17 矩阵)。LSC_Center_X
、LSC_Center_Y
:镜头中心坐标。
- 作用与场景:
- 补偿因镜头结构造成的边缘暗角现象。
- 广角镜头、大光圈镜头典型应用。
- 预期效果:
- 图像中心与边缘亮度衔接自然,无明显暗角。
2.5. AWB(Auto White Balance,自动白平衡)
- 常见参数:
AWB_Gain_R/G/B
:各通道增益。AWB_Light_Source
:光源类型选项(如日光、阴天、白炽灯)。
- 作用与场景:
- 自动调节白平衡,确保在不同光照条件下色彩还原准确。
- 较为复杂的环境调整中尤为重要。
- 预期效果:
- 白色物体保持中性,整体色彩自然。
2.6. Demosaic(彩色插值)
- 常见参数:
Demosaic_Algorithm
:插值算法选择(线性、边缘感知等)。Demosaic_Threshold
:边缘检测阈值。
- 作用与场景:
- 将原始 Bayer 数据转换为全彩图像,减少伪色和摩尔纹。
- 特别需要在细节和边缘处理场景中调优。
- 预期效果:
- 图像细节恢复良好,伪色减少。
2.7. CCM(Color Correction Matrix,颜色校正矩阵)
- 常见参数:
CCM_Matrix[3][3]
:9元素颜色校正矩阵。CCM_Offset_R/G/B
:颜色偏移补偿。CCM_Scenario_Mode
:根据场景(如 Daylight、Fluorescent 等)切换矩阵。
- 作用与场景:
- 把传感器原始颜色转换为标准 RGB,确保色彩准确。
- 依赖于不同光源场景的色温调整。
- 预期效果:
- 色彩还原真实,减少颜色偏差。
2.8. Gamma(伽马校正)
- 常见参数:
Gamma_LUT[256]
:查找表实现输入到输出映射。Gamma_Segmented_Curve
:分段伽马曲线设置。Gamma_Scene_Mode
:场景模式切换(Night/Normal/Outdoor)。
- 作用与场景:
- 调整图像亮度分布,使视觉感受更自然。
- 针对不同场景设计不同的 gamma 曲线。
- 预期效果:
- 图像灰阶平滑过渡,细节表现更佳。
2.9. EE(Edge Enhancement,边缘增强)
- 常见参数:
EE_Strength
:增强强度(数值范围如 0-15)。EE_Threshold
:边缘触发门限。EE_HPF_Gain
:高频信号增益。
- 作用与场景:
- 强化图像边缘,使细节更加清晰。
- 应用于文字、轮廓清晰要求较高的场景,但避免过度引起伪影。
- 预期效果:
- 图像锐度提升,但避免 halo 效果。
2.10. YUV/CSC(YUV 数据格式与颜色空间转换)
- 常见参数:
YUV_Format
:格式选择(NV21、NV12、422 等)。CSC_Matrix
:RGB 到 YUV 的转换矩阵。UV_Swap_Enable
:是否交换 U/V 通道。Range_Mode
:全范围与限范围设定。
- 作用与场景:
- 将 RGB 数据转换为适合显示或编码的 YUV 格式。
- 在实时预览、视频编码中尤为关键。
- 预期效果:
- 色彩、亮度精准还原,格式符合输出要求。
3. 调试脚本示例(MTK67/68 平台案例)
3.1. MTK 平台配置示例(配置文件格式)
- 示例文件:
[ISP_DPC] Enable = 1 Threshold = 16 Mode = Dynamic[ISP_BLC] R_Offset = 64 G_Offset = 64 B_Offset = 64[ISP_NR] Luma_Strength = 5 Chroma_Strength = 3[ISP_AWB] Enable = 1 Mode = Auto R_Gain = 1.15 B_Gain = 0.98
- 说明:
- 通过修改配置文件来导入调试工具进行参数烧写与实时测试。
3.2. 高通平台配置示例(XML 格式)
- 示例文件:
<module name="DPC"><enable>1</enable><threshold>18</threshold> </module> <module name="BLC"><r_offset>64</r_offset><g_offset>64</g_offset><b_offset>64</b_offset> </module> <module name="AWB"><r_gain>1.2</r_gain><b_gain>1.1</b_gain><mode>gray_world</mode> </module> <module name="LSC"><table><!-- 17x17 表格数据 --></table> </module>
- 说明:
- 高通平台通常通过 XML 配置,结合专用调试工具(如 QXDM 或 Camera IQ Tuning Tool)进行调参。
4. 主观测试图模板建议
针对每个模块,在日常调试中可使用以下测试图模板评估效果:
-
DPC:
- 测试图: 暗场图(黑布或盖镜头)
- 作用: 检查坏点修复是否正常,是否仍有漏修或误修现象。
-
BLC:
- 测试图: 灰卡或黑场拍摄
- 作用: 检查各通道黑电平是否准确,避免暗部偏色。
-
NR:
- 测试图: 高 ISO 条件下的细节图(如书架、桌面)
- 作用: 检测降噪效果,比较细节保留与噪声抑制的平衡。
-
LSC:
- 测试图: 均匀白墙或灰卡图像
- 作用: 评估中心与边缘亮度补偿效果,检查是否存在明显暗角。
-
AWB:
- 测试图: 灰卡、色卡(如 X-Rite 标准色卡)
- 作用: 判断白平衡准确性,验证不同光源下的颜色还原。
-
Demosaic:
- 测试图: 梳子、报纸、线条图
- 作用: 检测伪色和摩尔纹情况,观察细节的完整性。
-
CCM:
- 测试图: X-Rite 24色卡
- 作用: 评估整体色彩还原准确性,量化 DeltaE 值。
-
Gamma:
- 测试图: 灰阶图、黑白对比图
- 作用: 检查图像亮度分布,确保灰阶过渡自然。
-
EE:
- 测试图: 高对比边缘图(如毛发、金属边缘)
- 作用: 判断细节锐化效果与副作用(如 halo 效应)。
-
YUV/CSC:
- 测试图: YUV 格式测试图
- 作用: 校验输出格式是否正确、颜色是否存在偏差或 UV 交换错误。
5. 总结与后续建议
-
整体调试流程:
- 先从基础模块(如 DPC、BLC)入手,再逐步调优细节(NR、AWB、CCM 等)。
- 结合主客观测试(测试图与量化指标)综合判断调参效果。
-
调试工具推荐:
- MTK 平台: 使用专用配置文件、CameraTool 与调试软件。
- 高通平台: 使用 XML 文件配合 QXDM、Camera IQ Tuning Tool 进行逐寄存器调试。
-
进阶需求:
- 根据不同传感器及场景,进一步优化各模块参数。
- 针对具体问题(如坏点漏检、色偏异常),调整对应参数并使用相应测试图进行验证。
6. 附录:关键术语释义
- Bayer 格式: 摄像头常用的颜色滤光片排列方式。
- DeltaE: 颜色差异的量化指标。
- LUT(查找表): 用于转换输入输出值的预设数据表。
- 动态与静态模式: 动态模式通常根据实时场景调整参数;静态模式则使用固定配置。
下面提供一份详细的 ISP Pipeline 每一部分算法原理解析,从整体流程、关键步骤讲解,到伪代码示例与详细注释,方便初学者从代码层面和理论原理上全面理解各模块的作用。
ISP Pipeline 全流程概览
ISP(Image Signal Processing,图像信号处理)流程通常从原始 Bayer 数据出发,经过一系列模块处理,逐步完成图像校正和增强,最终生成用于显示或编码的标准图像。常见处理模块包括:
- DPC(Defect Pixel Correction) – 坏点检测与修复
- BLC(Black Level Correction) – 黑电平校正
- NR(Noise Reduction) – 降噪处理
- LSC(Lens Shading Correction) – 镜头阴影校正
- AWB(Auto White Balance) – 自动白平衡
- Demosaic – 彩色插值
- CCM(Color Correction Matrix) – 颜色校正矩阵
- Gamma Correction – 伽马校正
- EE(Edge Enhancement) – 边缘增强
- YUV/CSC – 颜色空间转换(RGB→YUV)
各模块既有其独立的功能,又需要前后相互配合,下面按模块详细解析其算法原理并附上伪代码示例及注释说明。
1. DPC – Defect Pixel Correction(坏点修复)
算法原理
- 目标:检测并修复传感器中由于制造缺陷或老化导致的坏点,避免这些异常像素影响最终图像质量。
- 实现思路:对于每个像素,通过比较与其邻域像素的差异来判断其是否为坏点;一旦判定为坏点,则用邻域像素的中值或加权平均值替代。
伪代码示例(C-like 风格)
// 输入:raw_image[][] 为原始传感器数据,threshold 为坏点检测阈值
for (int i = 1; i < height - 1; i++) {for (int j = 1; j < width - 1; j++) {// 获取像素 (i,j) 周围3x3邻域数据(不包括自身也可包括)int neighbors[8];int idx = 0;for (int m = -1; m <= 1; m++) {for (int n = -1; n <= 1; n++) {if (m == 0 && n == 0)continue; // 排除自身neighbors[idx++] = raw_image[i + m][j + n];}}// 计算邻域中值int median = compute_median(neighbors, 8);// 如果当前像素与中值差异超过阈值,则认为是坏点if (abs(raw_image[i][j] - median) > threshold) {// 修复:用中值替换坏点raw_image[i][j] = median;}}
}
注释说明:
- compute_median:计算数组中值的函数(可用排序或者选择算法实现)。
- 通过比较当前像素值与邻域中值的差距判断是否异常,简单有效但实际算法可能会结合更多统计特性或动态阈值。
2. BLC – Black Level Correction(黑电平校正)
算法原理
- 目标:校正每个通道(R、G、B)的基准黑电平,消除传感器在暗部输出的偏置。
- 实现思路:从图像的每个像素中减去预先测量得到的黑电平偏移量,通常对不同颜色通道采用不同的偏移值。
伪代码示例
// 假设 black_offset_R, black_offset_G, black_offset_B 为各通道的校正值
for (int i = 0; i < height; i++) {for (int j = 0; j < width; j++) {// 读取当前像素的 Bayer 格式值,根据位置判定其颜色通道if (isRedPixel(i, j)) {raw_image[i][j] = max(raw_image[i][j] - black_offset_R, 0);} else if (isGreenPixel(i, j)) {raw_image[i][j] = max(raw_image[i][j] - black_offset_G, 0);} else if (isBluePixel(i, j)) {raw_image[i][j] = max(raw_image[i][j] - black_offset_B, 0);}}
}
注释说明:
- isRedPixel/isGreenPixel/isBluePixel:判断像素在 Bayer 格式下的颜色位置(如RGGB、BGGR等排列规则)。
- 使用
max
保障输出不为负数。
3. NR – Noise Reduction(降噪处理)
算法原理
- 目标:减少图像中由于高 ISO、低光等条件下产生的随机噪声,同时尽量保留细节。
- 实现思路:常见方法包括空间滤波(如均值、Gaussian或中值滤波)、时间滤波(帧间降噪)以及结合两者的混合方法。
伪代码示例(使用 3x3 高斯滤波)
// 定义一个简单的 3x3 Gaussian 模板
float kernel[3][3] = {{1/16.0, 2/16.0, 1/16.0},{2/16.0, 4/16.0, 2/16.0},{1/16.0, 2/16.0, 1/16.0}
};for (int i = 1; i < height - 1; i++) {for (int j = 1; j < width - 1; j++) {float sum = 0.0;// 对 3x3 邻域做卷积for (int m = -1; m <= 1; m++) {for (int n = -1; n <= 1; n++) {sum += raw_image[i + m][j + n] * kernel[m + 1][n + 1];}}// 将滤波结果存入降噪图像(可以直接覆盖或存到另一个缓冲区)denoised_image[i][j] = (int)sum;}
}
注释说明:
- 实际中会针对亮度(Luma)和色度(Chroma)分别设定不同的降噪强度。
- 空间滤波虽简单,但可能造成细节损失,故高端方案会采用自适应或多尺度方法。
4. LSC – Lens Shading Correction(镜头阴影校正)
算法原理
- 目标:补偿由于镜头光照不均(中心亮、边缘暗)产生的暗角现象。
- 实现思路:预先标定或计算得到一个增益表(Gain Map),每个位置对应一个增益因子,处理时将该因子与原始像素值相乘。
伪代码示例
// 假设 gain_map 是一个二维数组(例如 17x17),需通过插值映射到整幅图像上
for (int i = 0; i < height; i++) {for (int j = 0; j < width; j++) {// 根据 (i, j) 坐标计算在 Gain Map 中的对应位置,并进行双线性插值获取增益值float gain = interpolate_gain(gain_map, i, j, height, width);// 应用校正:乘以增益corrected_image[i][j] = raw_image[i][j] * gain;}
}
注释说明:
- interpolate_gain:将图像坐标映射到较小增益表,并通过双线性插值计算增益;该函数依赖于标定数据。
- 校正后注意边缘可能需裁剪或平滑处理。
5. AWB – Auto White Balance(自动白平衡)
算法原理
- 目标:在不同光照条件下自动调整各色通道增益,使得白色或中性区域呈现中性灰色。
- 实现思路:常用的方法有灰世界假设(所有颜色平均值应相等)、最大白补偿法等;计算各通道平均值后,确定增益补偿。
伪代码示例
// 统计图像中各通道的平均值
long sum_R = 0, sum_G = 0, sum_B = 0;
int count_R = 0, count_G = 0, count_B = 0;for (int i = 0; i < height; i++) {for (int j = 0; j < width; j++) {if (isRedPixel(i, j)) {sum_R += raw_image[i][j];count_R++;} else if (isGreenPixel(i, j)) {sum_G += raw_image[i][j];count_G++;} else if (isBluePixel(i, j)) {sum_B += raw_image[i][j];count_B++;}}
}// 计算平均值
float avg_R = (float)sum_R / count_R;
float avg_G = (float)sum_G / count_G;
float avg_B = (float)sum_B / count_B;// 根据灰世界假设,理想状态各通道平均值应相等,这里采用绿色作为参考
float gain_R = avg_G / avg_R;
float gain_B = avg_G / avg_B;// 对图像所有相应通道应用增益补偿
for (int i = 0; i < height; i++) {for (int j = 0; j < width; j++) {if (isRedPixel(i, j)) {awb_image[i][j] = raw_image[i][j] * gain_R;} else if (isGreenPixel(i, j)) {awb_image[i][j] = raw_image[i][j]; // 通常保持不变} else if (isBluePixel(i, j)) {awb_image[i][j] = raw_image[i][j] * gain_B;}}
}
注释说明:
- 此处采用简单灰世界算法,实际系统可能结合局部统计和区域分割对不同区域分别调节。
- 调整后的结果需进一步与色卡比对验证准确性。
6. Demosaic – 彩色插值
算法原理
- 目标:将拜耳格式的单色通道数据重建为全彩(RGB)图像。
- 实现思路:根据 Bayer 模式(如 RGGB),使用邻域插值方法(例如双线性插值、方向插值等)填充各像素缺失的颜色信息。
伪代码示例(简单双线性插值示例)
// 输出三通道图像 rgb_image[h][w][3]
for (int i = 1; i < height - 1; i++) {for (int j = 1; j < width - 1; j++) {// 根据 Bayer 排列判断当前像素类别if (isRedPixel(i, j)) {rgb_image[i][j][0] = raw_image[i][j]; // red// 绿色取左右或上下的平均rgb_image[i][j][1] = (raw_image[i][j - 1] + raw_image[i][j + 1] +raw_image[i - 1][j] + raw_image[i + 1][j]) / 4;// 蓝色取对角线平均rgb_image[i][j][2] = (raw_image[i - 1][j - 1] + raw_image[i - 1][j + 1] +raw_image[i + 1][j - 1] + raw_image[i + 1][j + 1]) / 4;} else if (isGreenPixel(i, j)) {// 类似算法,依据具体位置计算缺失通道//……} else if (isBluePixel(i, j)) {rgb_image[i][j][2] = raw_image[i][j]; // blue// 补充 red 和 green 通道同上操作//……}}
}
注释说明:
- 此示例仅展示一种简单的双线性插值方法,实际应用中可采用方向敏感插值以减少马赛克伪影。
- 分别对不同 Bayer 格式需要区分算法细节。
7. CCM – Color Correction Matrix(颜色校正矩阵)
算法原理
- 目标:使用颜色校正矩阵将传感器采集的原始 RGB 数据转换为标准颜色空间,以达到色彩还原的目的。
- 实现思路:对每个像素的 RGB 分量做线性变换,公式为:
伪代码示例
// 假设 ccm_matrix 为 3x3 浮点数组,ccm_offset 为 3 元素的偏移数组
for (int i = 0; i < height; i++) {for (int j = 0; j < width; j++) {float R = rgb_image[i][j][0];float G = rgb_image[i][j][1];float B = rgb_image[i][j][2];// 线性变换计算float new_R = ccm_matrix[0][0] * R + ccm_matrix[0][1] * G + ccm_matrix[0][2] * B + ccm_offset[0];float new_G = ccm_matrix[1][0] * R + ccm_matrix[1][1] * G + ccm_matrix[1][2] * B + ccm_offset[1];float new_B = ccm_matrix[2][0] * R + ccm_matrix[2][1] * G + ccm_matrix[2][2] * B + ccm_offset[2];// 限制输出范围在 [0,255]rgb_image[i][j][0] = clamp(new_R, 0, 255);rgb_image[i][j][1] = clamp(new_G, 0, 255);rgb_image[i][j][2] = clamp(new_B, 0, 255);}
}
注释说明:
- clamp 函数确保校正后数值在有效显示范围内。
- 校正矩阵和偏移值通常在标定阶段确定,并可能根据不同场景(如日光、荧光灯等)动态切换。
8. Gamma Correction(伽马校正)
算法原理
- 目标:调整图像的亮度分布,使图像更符合人眼对明暗非线性感知的特点。
- 实现思路:通过预先计算的 Gamma LUT(查找表)实现非线性映射,将输入像素映射到新的输出值上。
伪代码示例
// 假设 gamma_LUT 为 256 元素的查找表(预先根据所需 gamma 值生成)
for (int i = 0; i < height; i++) {for (int j = 0; j < width; j++) {// 对每个颜色通道应用 Gamma LUTrgb_image[i][j][0] = gamma_LUT[rgb_image[i][j][0]];rgb_image[i][j][1] = gamma_LUT[rgb_image[i][j][1]];rgb_image[i][j][2] = gamma_LUT[rgb_image[i][j][2]];}
}
注释说明:
- Gamma LUT 可通过公式生成,例如:
[
LUT[i] = \text{round}(255 \times (\frac{i}{255})^{\frac{1}{\gamma}})
]- 使用查找表比实时计算更高效。
9. EE – Edge Enhancement(边缘增强)
算法原理
- 目标:提高图像边缘的清晰度,使物体轮廓更明显。
- 实现思路:先提取图像中的细节信息(例如通过高通滤波),然后将细节信息按一定比例增强后加回原始图像,实现增强效果。
伪代码示例
// 采用简单的 unsharp mask 算法
// blurred 为对原始图像进行低通滤波后的结果(如使用 Gaussian 模糊)
for (int i = 0; i < height; i++) {for (int j = 0; j < width; j++) {// 细节 = 原图 - 模糊图int detail = original_image[i][j] - blurred_image[i][j];// 增强后的图像 = 原图 + 增强因子 * 细节enhanced_image[i][j] = original_image[i][j] + EE_Strength * detail;// 限制范围,防止溢出enhanced_image[i][j] = clamp(enhanced_image[i][j], 0, 255);}
}
注释说明:
- 关键参数 EE_Strength 控制增强幅度,过高会产生 halo 效果。
- 低通滤波的选择(如 Gaussian、均值滤波)直接影响最终效果。
10. YUV/CSC – 颜色空间转换(RGB to YUV)
算法原理
- 目标:将 RGB 图像转换为 YUV 格式,便于后续视频编码或显示。
- 实现思路:使用线性转换公式将 RGB 分量转换为 Y(亮度)、U/V(色度)分量。
伪代码示例
for (int i = 0; i < height; i++) {for (int j = 0; j < width; j++) {int R = rgb_image[i][j][0];int G = rgb_image[i][j][1];int B = rgb_image[i][j][2];// 根据 BT.601 标准的常用转换公式int Y = ( 66 * R + 129 * G + 25 * B + 128) >> 8; // 右移8相当于除以256int U = (-38 * R - 74 * G + 112 * B + 128) >> 8;int V = (112 * R - 94 * G - 18 * B + 128) >> 8;// 在输出时加上偏移量(通常 Y: 16-235, U/V: 16-240)或直接根据 Full Range 映射处理yuv_image[i][j][0] = clamp(Y + 16, 0, 255);yuv_image[i][j][1] = clamp(U + 128, 0, 255);yuv_image[i][j][2] = clamp(V + 128, 0, 255);}
}
注释说明:
- 上述转换公式中权重系数依 BT.601 标准,可根据不同标准(BT.709、BT.2020)调整。
- “clamp” 用于防止数据超出 0~255 的范围。
- 在实际运用中还要考虑 UV 通道是否需要交换顺序(例如 NV12 与 NV21 的差异)。
总结
- 每个模块在 ISP Pipeline 中均承担着特定的任务,从基础的坏点修复、黑电平校正,到颜色调整、图像增强与格式转换。
- 所有步骤可以串联形成一条完整的图像处理流水线,每步均可对输出图像质量产生显著影响。
- 上述伪代码均为简化示例,实际代码中会涉及更复杂的边界处理、动态参数调整以及硬件寄存器的配置。
希望这份详细的解释和代码示例能帮助初学者从理论和实战两个角度掌握 ISP Pipeline 的各个算法原理及其实现方式。如果需要更具体的平台驱动代码或针对特定芯片(如 MTK67/68)的寄存器配置细节
相关文章:
【ISP】ISP pipeline(AI)
ISP Pipeline 全流程概览 ISP(Image Signal Processing,图像信号处理)流程通常从原始 Bayer 数据出发,经过一系列模块处理,逐步完成图像校正和增强,最终生成用于显示或编码的标准图像。常见处理模块包括&a…...
【设计模式】模板模式
简介 假设你要冲泡咖啡和茶,两者的流程相似但部分步骤不同: 烧水(公共步骤)加入主材料(咖啡粉/茶叶)添加调料(糖/牛奶)→ 可选步骤倒进杯子(公共步骤) 模板…...
GDB调试程序的基本命令和用法(Qt程序为例)
1. 引言 GDB(GNU Debugger)是一个强大的命令行调试工具,它可以帮助开发者在程序运行时查找和修复错误。当调试Qt程序时,GDB同样适用,并且能够帮助开发者定位诸如数组越界挂死等复杂问题。 2. 基本命令 2.1 启动GDB …...
vue3腾讯云直播 前端推流
1、在index.html文件中引入(在body体中) <script src"https://video.sdk.qcloudecdn.com/web/TXLivePusher-2.1.1.min.js" charset"utf-8"></script> 2、vue文件中,添加video推流(我用的推流地…...
DP_AUX辅助通道介绍
DisplayPort(简称DP)是一个由PC及芯片制造商联盟开发,视频电子标准协会(VESA)标准化的数字式视频接口标准。该接口免认证、免授权金,主要用于视频源与显示器等设备的连接,并也支持携带音频、USB…...
【微机及接口技术】- 第九章 串行通信与串行接口(下)
文章目录 第二节 串行通信协议一、异步串行通信协议二、同步串行通信协议 第三节 串行接口标准RS-232C一、RS-232C信号线定义二、电气特性 第四节 可编程串行接口芯片8251A一、基本性能二、内部结构三、外部引脚功能1. 同CPU的连接信号2. MODEM控制信号(4个…...
人形机器人制造—3D打印推动微型化与轻量化设计
在人形机器人仿生架构的构建中,多模态传感器集群与仿生关节矩阵的拓扑融合,正催生第三代具身智能的力学革命。通过分布式触觉薄膜、双目视觉惯性测量单元(200Hz采样率)与肌电模拟传感器的三重耦合,机器人获得了超越人类…...
前端性能优化高频面试题解析与实战指南(2025版)
一、前端性能优化核心面试题汇总 1. 浏览器加载优化相关问题 Q1:浏览器从输入URL到页面渲染的完整流程中,有哪些关键性能节点? 核心流程:DNS解析 → TCP连接(TLS握手)→ HTTP请求 → 资源下载 → 解析HT…...
【教程】xrdp修改远程桌面环境为xfce4
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 xfce4 vs GNOME对比 配置教程 1. 安装 xfce4 桌面环境 2. 安装 xrdp 3. 配置 xrdp 使用 xfce4 4. 重启 xrdp 服务 5. 配置防火墙ÿ…...
递增子序列
递增子序列 难点: 结果集如何加:每次进入递归都判断是否sub中的个数>2;不允许对数组排序,如何在每层去重:不可以再用nums[i] nums[i-1](没有意义,重复的元素不一定挨着)&#x…...
Linux磁盘管理双雄:lsblk与df深度解析
在Linux系统管理的日常工作里,磁盘管理占据着极为重要的地位,这里重点介绍lsblk和df这两个命令。 一、lsblk命令:呈现磁盘物理架构 lsblk是用于罗列块设备信息的实用命令,它以直观的树状结构呈现系统中的块设备,帮助…...
C#里设计Modbus-RTU(Remote Terminal Unit)协议
Modbus-RTU(Remote Terminal Unit)是一种串行通信协议,广泛用于工业自动化领域,支持主从式(Master-Slave)通信架构。它是Modbus协议的两种传输模式之一(另一种是ASCII模式),具有高效、简洁、可靠性强的特点,常用于RS-485或RS-232物理层通信。 核心特性 物理层 通常基…...
spark学习内容总结
Spark运行架构总结 一、核心结构 Spark框架的核心是一个计算引擎,整体采用标准的master-slave结构。其中,Driver作为master,负责管理整个集群中的作业任务调度;Executor作为slave,负责实际执行任务。 二、核心组件 …...
MySQL多表查询、事务与索引的实践与应用
摘要:本文围绕MySQL数据库操作展开,通过构建部门与员工管理、餐饮业务相关的数据库表,并填充测试数据,系统地阐述了多表查询的多种方式,包括内连接、外连接和不同类型的子查询,同时介绍了事务的处理以及索引…...
MySQL【8.0.41版】安装详细教程--无需手动配置环境
一、MySQL 介绍 1. 概述 MySQL 是一个开源的关系型数据库管理系统,由瑞典公司 MySQL AB 开发,现属于 Oracle 旗下。它基于 SQL(结构化查询语言)进行数据管理,支持多用户、多线程操作,广泛应用于 Web 应用、…...
FRP练手:hello,world实现
方案一:使用 Flask(推荐) from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return "你好啊世界"if __name__ __main__:# 监听所有网络接口(0.0.0.0),端口 3344app.…...
Mysql | 主从复制的工作机制
主从复制的工作机制 Mysql的主从复制 从库主要是读取主库的binlog日志来完成数据同步的, binlog中存储了对数据库所有修改SQL的语句。 首先Master开启BinLog二进制的写入。Slave从库通过ip、port、账号、密码链接到Master主数据库,链接成功后从库会向主数据库获取B…...
清明之后叙
经历了漫长的冬季,春天的脚步近了,要说讲这一年的开始,绝大数人说是从春季,但是我说应该是从冬季开始,中国传统讲冬至是一阳生,冬季收藏好了,开始收敛精气,养精蓄锐,好好…...
Docker新型容器镜像构建技术,如何正确高效的编写Dockerfile
一、容器与容器镜像之间的关系 说到Docker管理的容器不得不说容器镜像,主要因为容器镜像是容器模板,通过容器镜像我们才能快速创建容器。 如下图所示: Docker Daemon通过容器镜像创建容器。 二、容器镜像分类 操作系统类 CentOSUbuntu在do…...
Starrocks的Bitmap索引和Bloom filter索引以及全局字典
写这个的主要作用是梳理一下Starrocks的索引效率以及使用场景。 Starrocks Bitmap索引 原理: Bitmap 索引是一种使用 bitmap 的特殊数据库索引。bitmap 即为一个 bit 数组,一个 bit 的取值有两种:0 或 1。 每一个 bit 对应数据表中的一行&…...
从 0 到上线:Java 项目打包 Docker 镜像全流程实战
📖 摘要 本文是一份超详细的Java项目Docker化实战手册,从环境准备到最终上线,手把手带你完成整个容器化部署流程。你将学会: Docker基础概念与核心原理如何为Java项目编写高效的Dockerfile多阶段构建优化镜像体积镜像推送与容器…...
【符号引用和直接引用是什么?有什么作用?什么场景下使用?为什么符号引用和直接引用在常量池里?】
符号引用与直接引用详解 1. 符号引用(Symbolic Reference) 定义: 符号引用是编译阶段使用的抽象标识符,通过全限定名、方法签名等符号描述目标(如类、方法、字段)。它不涉及具体内存地址,仅作为…...
ESModule和CommonJS在Node中的区别
ESModule console.log(require);//>errorconsole.log(module);//>errorconsole.log(exports);//>errorconsole.log(__filename);//>errorconsole.log(__dirname);//>error全部报错commonjs console.log(require);console.log(module);console.log(exports);co…...
阿里发布实时数字人项目OmniTalker,实时驱动技术再突破~
简介 OmniTalker 是一个由 阿里巴巴集团 Tongyi Lab(通义实验室) 开发的研究项目,专注于实时文本驱动的说话头像生成技术。该项目旨在通过文本输入生成同步的语音和视频内容,同时保留参考视频中的音视频风格。以下是关于 OmniTalk…...
Kubernetes-如何进入某POD中
Kubernetes 如何进入某POD中 工作中需要进入pod中查询比如pod 网络等问题 步骤: 1、 查询某pod, 比如该pod 为namespace test 下的 ip 为 192.168.1.100 #查询namespace 列表 #kubectl get ns #查询该ns下ip 为 192.168.1.100的pod # kubectl -n test get pods …...
java导出postgis空间数据几何对象shapefile文件
项目开发中,需要java后端实现导出postgis空间数据几何对象shapefile文件,以便能直观查看数据详情。注意事项Shapefile 默认的几何字段名为 the_geom,若导出时未显式指定或字段名被修改,部分软件(如 ArcGIS、QGI&#x…...
蓝桥杯嵌入式按键长按双击
直接上代码这个代码里面我们简单实现了如果按键按下时间超过0.8秒K1的值增加,短按只增加一次,按键2长按K2值增加,按键3双击K1的值减1,按键4双击K2的值减1 #include "fun.h" #define long_press_time 800//定义长按时间…...
深入解析Java中的栈:从JVM原理到开发实践
一、栈的双重身份:JVM运行时数据区 vs 数据结构 1. JVM层面的栈 线程私有:每个线程独立拥有自己的栈 LIFO结构:后进先出的方法调用模型 栈帧存储:每个方法对应一个栈帧(Stack Frame) 2. 数据结构中的栈…...
408 计算机网络 知识点记忆(6)
前言 本文基于王道考研课程与湖科大计算机网络课程教学内容,系统梳理核心知识记忆点和框架,既为个人复习沉淀思考,亦希望能与同行者互助共进。(PS:后续将持续迭代优化细节) 往期内容 408 计算机网络 知识…...
从ETL到ELT:大数据时代下两者的选型建议及优势
随着大数据时代的到来,数据量呈爆炸式增长,数据类型日益复杂,ETL与ELT两种技术路径的抉择直接影响着数据处理效率。我们这次来深入解析下两种模式的本质差异与应用场景,为企业提供选型建议。 一、ETL架构的优势 ETL架构遵循“提…...
Java蓝桥杯习题一:for循环和字符串的应用
知道循环次数用for循环 练习题1 小明对数位中含有2.0.1.9的数字很感兴趣,在1到40中这样的数包含1.2.9.10至32.39.40,共28个,他们的和是574.请问,在1到2019中,所有这样的数的和是多少?(2019Jav…...
Windows 图形显示驱动开发-WDDM 2.0功能_分配用法跟踪
随着分配列表的消失,视频内存管理器 (VidMm) 不再能够查看特定命令缓冲区中引用的分配。 因此,VidMm 不再能够跟踪分配使用情况和处理相关同步。 此责任现在由用户模式驱动程序 (UMD) 承担。 具体而言,UMD 需要处理与直接 CPU 访问分配和重命…...
SpringMVC的请求-文件上传
文件上传客户端三要素 1. 表单项type“file” 2. 表单的提交方式是post 3. 表单的enctype属性是多部分表单形式,及enctype“multipart/form-data” <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <he…...
MySQL表的增删查改(基础)
一.插入数据 数据准备 create table student(id INT,sn INT comment 学号,name VARCHAR(20) comment 姓名,qq_mail VARCHAR(20) comment QQ邮箱 ); 1.单行数据全列插入 INSERT INTO student VALUES (100, 10000, 唐三藏, NULL); INSERT INTO student VALUES (101, 10001, …...
C++初阶-C++的讲解1
目录 1.缺省(sheng)参数 2.函数重载 3.引用 3.1引用的概念和定义 3.2引用的特性 3.3引用的使用 3.4const引用 3.5.指针和引用的关系 4.nullptr 5.总结 1.缺省(sheng)参数 (1)缺省参数是声明或定义是为函数的参数指定一个缺省值。在调用该函数是…...
【NLP 面经 9.逐层分解Transformer】
如果我能给你短暂的开心 —— 25.4.7 一、Transformer 整体结构 1.Tranformer的整体结构 Transformer 的整体结构,左图Encoder和右图Decoder,下图是Transformer用于中英文翻译的整体结构: 可以看到 Transformer 由 Encoder 和 Decoder 两个…...
Diffusion Policy Visuomotor Policy Learning via Action Diffusion官方项目解读(二)(5)
运行官方代码库中提供的Colab代码:vision-based environment(二)(5) Network十八、类SinusoidalPosEmb,继承自nn.Module十八.1 def __init__()十八.2 def forward()总体说明 十九、类Downsample1dÿ…...
西门子S7-1200PLC 工艺指令PID_Temp进行控温
1.硬件需求: 西门子PLC:CPU 1215C DC/DC/DC PLC模块:SM 1231 TC模块 个人电脑:已安装TIA Portal V17软件 加热套:带加热电源线以及K型热电偶插头 固态继电器:恩爵 RT-SSK4A2032-08S-F 其他࿱…...
【深度学习:理论篇】--Pytorch进阶教程
目录 1.神经网络 1.1.torch.nn 核心模块 1.2.定义神经网络 1.3.损失函数 1.4.反向传播 1.5.梯度更新 2.图片分类器 2.1.数据加载 2.2.卷积神经网络 2.3.优化器和损失 2.4.训练网络 2.5.测试网络 2.6.GPU上训练 3.数据并行训练--多块GPU 3.1.导入和参数 3.2.构造…...
卷积神经网络(CNN)基础
目录 一、应用场景 二、卷积神经网络的结构 1. 输入层(Input Layer) 2. 卷积层(Convolutional Layer) 3. 池化层(Pooling Layer) 最大池化(max_pooling)或平均池化(…...
第 28 场 蓝桥入门赛 JAVA 完整题解
前言 本文总结了六个编程题目的解题思路与核心考点,涵盖基础语法、逻辑分析、贪心算法、数学推导等知识点。每个题目均从问题本质出发,通过巧妙的算法设计或数学优化降低复杂度,展现了不同场景下的编程思维与解题技巧。以下为各题的详细考点解…...
Python 网络请求利器:requests 包详解与实战
诸神缄默不语-个人技术博文与视频目录 文章目录 一、前言二、安装方式三、基本使用1. 发起 GET 请求2. 发起 POST 请求 四、requests请求调用常用参数1. URL2. 数据data3. 请求头 headers4. 参数 params5. 超时时间 timeout6. 文件上传 file:上传纯文本文件流7. jso…...
聊透多线程编程-线程基础-1.进程、线程基础概念
目录 一、进程 二、线程 三、进程与线程的关系 四、进程与线程的比较 注:本文多张图片来源于网络,如有侵权,请联系删除 一、进程 1. 进程的定义 进程是指在系统中正在运行的一个应用程序的实例,是操作系统进行资源分配和调…...
Android:Android Studio右侧Gradle没有assembleRelease等选项
旧版as是“Do not build Gradle task list during Gradle sync” 操作这个选项。 参考这篇文章:Android Studio Gradle中没有Task任务,没有Assemble任务,不能方便导出aar包_gradle 没有task-CSDN博客 在as2024版本中,打开Setting…...
LeetcodeBST2JAVA
235.二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大&…...
如何创建单独的城市活码?活码能永久使用吗?
如何创建单独的城市活码 创建单独的城市活码通常需要借助专业的第三方工具,以下是具体步骤: 1.选择合适的工具 推荐使用专业的活码生成工具。 2.注册并登录 访问官网,完成注册并登录。 3.创建活码 在首页点击“创建活码”按钮。输入活码…...
用户画像(https://github.com/memodb-io/memobase)应用
1.下载项目的源代码,我们要先启动后端,用docker启动 cd src/server cp .env.example .env cp ./api/config.yaml.example ./api/config.yaml 这里我的配置内容如下config.yaml(因为我是调用的符合openai格式的大模型,所以我没改,如果要是别的大模型的话,需要自己再做兼容…...
基于形状补全和形态测量描述符的腓骨游离皮瓣下颌骨重建自动规划|文献速递-深度学习医疗AI最新文献
Title 题目 Automated planning of mandible reconstruction with fibula free flap basedon shape completion and morphometric descriptors 基于形状补全和形态测量描述符的腓骨游离皮瓣下颌骨重建自动规划 01 文献速递介绍 因创伤、骨髓炎和肿瘤而接受下颌骨节段切除术…...
Python3笔记之号称替代pip的uv包管理器
uv是什么? uv,这是一个由 Astral 团队开发的极快速的Python包和项目管理工具,用Rust语言编写。它集成了多种功能,旨在替代pip、pip-tools、pipx、poetry、pyenv、twine、virtualenv等多个工具,提供更高效、更全面的Py…...
面试如何应用大模型
在面试中,如果被问及如何应用大模型,尤其是面向政务、国有企业或大型传统企业的数字化转型场景,你可以从以下几个角度进行思考和回答: 1. 确定应用大模型的目标与痛点 首先,明确应用大模型的业务目标,并结合企业的实际需求分析可能面临的痛点。这些企业通常会关注如何提…...