摄像头校准之白平衡畸变坏点

摄像头校准之白平衡&畸变&坏点

  • 1. 源由
  • 2. 校准内容
  • 3. 畸变校准
    • 一、畸变模型
    • 二、校准步骤
      • 1. 准备工作
      • 2. 特征点检测
      • 3. 计算内参数和畸变系数
      • 4. 畸变校正
    • 三、验证和优化
      • 1. 视觉验证
      • 2. 误差评估
      • 3. 参数优化
  • 4. 白平衡校准
    • 一、白平衡基础
    • 二、自动白平衡(AWB)
    • 三、手动白平衡
    • 四、验证和优化
  • 5. 坏点校准
    • 一、坏点检测
      • 1. 确定坏点类型
      • 2. 拍摄黑暗场图像
      • 3. 阈值检测
    • 二、坏点校正
      • 1. 邻域平均法
      • 2. 双边滤波法
    • 三、验证和优化
      • 1. 视觉验证
      • 2. 自动化检测和校正
      • 3. 重复拍摄和校准
  • 6. 总结
  • 7. 补充资料 - 光学校准

1. 源由

昨天讨论了关于摄像头校准方面的问题,其实刚开始时工作的时候在相机、摄像机方面从事一段时间的开发,大体上还是应用类的研发工作。

当时是基于SDK方案,在其基础上做一些参数调整,但是总的逻辑大致是一致的。现在技术发展已经远超当年,尤其有强大的后端数据处理时,要处理这个校准问题的手段就更加多了。

回忆总结下,关于摄像头校准方面的一些校准内容,如果还有其他没有提及的,请各位路过的兄弟们指点下,我后续补充:

2. 校准内容

  1. 畸变校准
  2. 白平衡校准
  3. 坏点校准
  4. TBD … … (请各位路过、看过的兄弟评论留言指导,谢谢)

3. 畸变校准

摄像头畸变校准是指校正镜头引起的图像畸变,使图像中的直线和比例恢复正常。常见的畸变包括径向畸变和切向畸变。以下是摄像头畸变校准的详细步骤,包括畸变模型、参数计算和图像校正。

一、畸变模型

  1. 径向畸变(Radial Distortion)

    • 描述图像中直线弯曲的现象。径向畸变分为桶形畸变(Barrel Distortion)和枕形畸变(Pincushion Distortion)。
    • 典型的径向畸变系数: k 1 , k 2 , k 3 k_1, k_2, k_3 k1,k2,k3
  2. 切向畸变(Tangential Distortion)

    • 由镜头与图像传感器不对齐引起,导致图像中的直线发生倾斜。
    • 典型的切向畸变系数: p 1 , p 2 p_1, p_2 p1,p2

畸变模型的数学表示如下:

x distorted = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) ] x_{\text{distorted}} = x(1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + 2p_1 xy + p_2 (r^2 + 2x^2)] xdistorted=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)]
y distorted = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y y_{\text{distorted}} = y(1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + p_1 (r^2 + 2y^2) + 2p_2 xy ydistorted=y(1+k1r2+k2r4+k3r6)+p1(r2+2y2)+2p2xy

其中, r 2 = x 2 + y 2 r^2 = x^2 + y^2 r2=x2+y2

二、校准步骤

1. 准备工作

  1. 棋盘格图案

    • 打印标准棋盘格图案,并确保其尺寸精确。
  2. 拍摄校准图像

    • 将棋盘格图案放置在不同的角度和位置,拍摄多张图像。确保棋盘格覆盖摄像头视野的不同部分。

2. 特征点检测

使用OpenCV库检测棋盘格的角点。

import cv2
import numpy as np
import glob# 设置棋盘格的尺寸
chessboard_size = (9, 6)
square_size = 1.0  # 设置棋盘格每个方块的实际尺寸# 准备棋盘格的世界坐标系点(3D点)
objp = np.zeros((chessboard_size[0]*chessboard_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2)
objp *= square_size# 用于存储所有图像的对象点和图像点
objpoints = []  # 3d point in real world space
imgpoints = []  # 2d points in image plane.# 读取所有校准图像
images = glob.glob('calibration_images/*.jpg')for fname in images:img = cv2.imread(fname)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 检测棋盘格角点ret, corners = cv2.findChessboardCorners(gray, chessboard_size, None)if ret:objpoints.append(objp)corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001))imgpoints.append(corners2)# 绘制并显示角点cv2.drawChessboardCorners(img, chessboard_size, corners2, ret)cv2.imshow('Chessboard corners', img)cv2.waitKey(500)cv2.destroyAllWindows()

3. 计算内参数和畸变系数

使用calibrateCamera函数计算摄像头的内参数矩阵和畸变系数。

# 进行摄像头校准
ret, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)print("Camera matrix:")
print(camera_matrix)
print("\nDistortion coefficients:")
print(dist_coeffs)

4. 畸变校正

使用计算得到的参数进行图像畸变校正。

# 示例:矫正一张图像
img = cv2.imread('calibration_images/example.jpg')
h, w = img.shape[:2]# 获取新的相机矩阵
new_camera_matrix, roi = cv2.getOptimalNewCameraMatrix(camera_matrix, dist_coeffs, (w, h), 1, (w, h))# 矫正图像
dst = cv2.undistort(img, camera_matrix, dist_coeffs, None, new_camera_matrix)# 裁剪图像
x, y, w, h = roi
dst = dst[y:y+h, x:x+w]cv2.imshow('Undistorted Image', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、验证和优化

1. 视觉验证

观察校正后的图像,确保直线恢复正常,图像畸变得到有效校正。

2. 误差评估

计算重投影误差,评估校准的精度。

mean_error = 0
for i in range(len(objpoints)):imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], camera_matrix, dist_coeffs)error = cv2.norm(imgpoints[i], imgpoints2, cv2.NORM_L2) / len(imgpoints2)mean_error += errorprint("Total error: ", mean_error / len(objpoints))

3. 参数优化

根据误差评估结果,调整拍摄方式或增加校准图像数量,优化校准参数。

4. 白平衡校准

摄像头的白平衡校准是为了确保在不同的光照条件下,摄像头拍摄的图像中的白色看起来是白色,从而使图像的颜色还原更准确。这对于计算机视觉应用和图像处理非常重要。下面是详细的白平衡校准步骤,包括自动白平衡和手动白平衡的方法。

一、白平衡基础

白平衡校准的目标是调整图像的色温,使得图像中中性的灰色或白色区域在不同光照条件下依然保持中性,即没有颜色偏差。

二、自动白平衡(AWB)

  1. 灰世界假设法

    • 假设图像中所有颜色的平均值是中性的灰色,通过调整图像的红色、绿色和蓝色通道,使其平均值相同。
    import cv2
    import numpy as npdef gray_world_awb(img):b, g, r = cv2.split(img)avg_b = np.mean(b)avg_g = np.mean(g)avg_r = np.mean(r)avg_gray = (avg_b + avg_g + avg_r) / 3b = cv2.addWeighted(b, avg_gray / avg_b, 0, 0, 0)g = cv2.addWeighted(g, avg_gray / avg_g, 0, 0, 0)r = cv2.addWeighted(r, avg_gray / avg_r, 0, 0, 0)return cv2.merge([b, g, r])img = cv2.imread('test_image.jpg')
    awb_img = gray_world_awb(img)
    cv2.imshow('AWB Image', awb_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
  2. 图像统计法

    • 利用图像直方图统计信息调整白平衡,算法会计算每个通道的统计量,并做相应的调整。
    def simple_color_balance(img, percent):half_percent = percent / 200.0channels = cv2.split(img)out_channels = []for channel in channels:assert len(channel.shape) == 2flat = channel.flatten()flat = np.sort(flat)n_cols = flat.shape[0]low_val = flat[int(n_cols * half_percent)]high_val = flat[int(n_cols * (1.0 - half_percent))]thresholded = np.clip(channel, low_val, high_val)thresholded = ((thresholded - low_val) / (high_val - low_val) * 255.0).astype(np.uint8)out_channels.append(thresholded)return cv2.merge(out_channels)img = cv2.imread('test_image.jpg')
    balanced_img = simple_color_balance(img, 1)
    cv2.imshow('Balanced Image', balanced_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

三、手动白平衡

  1. 使用标准灰卡

    • 拍摄一张包含标准灰卡(18% 灰)的图像,调整图像的红、绿、蓝通道,使灰卡区域呈现中性灰色。
  2. 计算校正系数

    • 计算灰卡区域的平均颜色值,分别获取红、绿、蓝三个通道的校正系数。
    def manual_white_balance(img, gray_card_region):x, y, w, h = gray_card_regiongray_card = img[y:y+h, x:x+w]avg_b = np.mean(gray_card[:, :, 0])avg_g = np.mean(gray_card[:, :, 1])avg_r = np.mean(gray_card[:, :, 2])avg_gray = (avg_b + avg_g + avg_r) / 3b, g, r = cv2.split(img)b = cv2.addWeighted(b, avg_gray / avg_b, 0, 0, 0)g = cv2.addWeighted(g, avg_gray / avg_g, 0, 0, 0)r = cv2.addWeighted(r, avg_gray / avg_r, 0, 0, 0)return cv2.merge([b, g, r])img = cv2.imread('test_image.jpg')
    gray_card_region = (50, 50, 100, 100)  # 假设灰卡位于这个区域
    wb_img = manual_white_balance(img, gray_card_region)
    cv2.imshow('Manual WB Image', wb_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

四、验证和优化

  1. 视觉验证

    • 观察校准后的图像,确保图像中的白色和中性灰色区域没有明显的颜色偏差。
  2. 误差评估

    • 使用色度计或标准颜色板测量校准后的颜色值,与预期值进行比较,评估校准误差。
  3. 重复调整

    • 根据误差评估结果,重复调整白平衡参数,直到达到满意的校准效果。

5. 坏点校准

CMOS传感器的坏点(dead pixels)校准是指检测和校正图像传感器上失效的像素,以提高图像质量。坏点通常表现为图像上的黑点、白点或固定的彩色点。坏点校准的目的是通过替换坏点的像素值,使图像看起来更自然。以下是详细的CMOS坏点校准步骤:

一、坏点检测

1. 确定坏点类型

坏点通常分为三类:

  • 热像素(Hot Pixels):在低曝光时间下表现正常,但在长曝光时间下表现为亮点。
  • 暗像素(Dead Pixels):无论曝光时间多长,都表现为黑点。
  • 呆滞像素(Stuck Pixels):在所有曝光时间下都保持恒定的亮度,通常是白点或彩色点。

2. 拍摄黑暗场图像

将摄像头盖住或在完全黑暗的环境中拍摄多张图像,坏点在这些图像中通常表现得很明显。

3. 阈值检测

使用阈值法检测坏点。阈值可以基于像素值的统计特性来设置。

import cv2
import numpy as np# 读取一张黑暗场图像
dark_frame = cv2.imread('dark_frame.jpg', cv2.IMREAD_GRAYSCALE)# 设定阈值,假设超过200的像素为坏点
threshold = 200
_, bad_pixel_map = cv2.threshold(dark_frame, threshold, 255, cv2.THRESH_BINARY)cv2.imshow('Bad Pixel Map', bad_pixel_map)
cv2.waitKey(0)
cv2.destroyAllWindows()

二、坏点校正

1. 邻域平均法

用坏点周围的有效像素的平均值替换坏点值。

def correct_bad_pixels(image, bad_pixel_map):corrected_image = image.copy()bad_pixels = np.argwhere(bad_pixel_map == 255)for y, x in bad_pixels:neighbors = []for dy in [-1, 0, 1]:for dx in [-1, 0, 1]:ny, nx = y + dy, x + dxif 0 <= ny < image.shape[0] and 0 <= nx < image.shape[1] and not (dy == 0 and dx == 0):neighbors.append(image[ny, nx])corrected_image[y, x] = np.mean(neighbors)return corrected_image# 读取一张包含坏点的图像
image_with_bad_pixels = cv2.imread('image_with_bad_pixels.jpg', cv2.IMREAD_GRAYSCALE)
corrected_image = correct_bad_pixels(image_with_bad_pixels, bad_pixel_map)cv2.imshow('Corrected Image', corrected_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. 双边滤波法

使用双边滤波保留图像边缘的同时平滑坏点。

corrected_image = cv2.bilateralFilter(image_with_bad_pixels, d=9, sigmaColor=75, sigmaSpace=75)cv2.imshow('Corrected Image with Bilateral Filter', corrected_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、验证和优化

1. 视觉验证

检查校正后的图像,确保坏点被有效校正,图像质量明显提升。

2. 自动化检测和校正

将坏点检测和校正步骤集成到图像处理管道中,实现自动化处理。

3. 重复拍摄和校准

定期拍摄黑暗场图像,更新坏点地图,并进行校正,确保图像质量稳定。

6. 总结

必须从校准的原理、方法的角度彻底的了解来龙去脉,才能在实际应用中更好的达成应用目的。

  • 摄像头畸变校准

摄像头畸变校准通过检测特征点、计算内参数和畸变系数,以及进行图像校正,能够有效地减少图像中的畸变,提高图像的精度和质量。通过定期校准和优化,可以确保摄像头在各种应用场景中的性能稳定。

  • 摄像头白平衡校准

通过自动白平衡和手动白平衡的方法,可以有效地对摄像头进行白平衡校准,从而保证在不同光照条件下,摄像头拍摄的图像颜色准确性。根据具体应用场景和需求,可以选择适合的方法进行白平衡校准。

  • 摄像头CMOS校准

CMOS坏点校准是通过检测坏点并用邻域平均或双边滤波等方法进行校正,以提高图像质量的过程。通过自动化的检测和校正,可以有效地减少图像中的坏点影响,提升整体图像效果。根据应用需求和实际情况,选择合适的坏点校正方法,确保摄像头的性能和图像质量达到最佳。

7. 补充资料 - 光学校准

摄像头校准的主要目的是确定摄像头的内参数和外参数。这些参数在计算机视觉和图像处理任务用于将现实世界中的三维坐标映射到二维图像平面上。

通过校准,可以精确地得到摄像头的内参数和外参数,从而能够进行图像校正、3D重建、姿态估计等计算机视觉任务。这些参数的准确性对于很多应用场景来说至关重要,比如机器人导航、增强现实、测量和监控等。

具体来说,摄像头校准需要确定以下参数:

一、内参数(Intrinsic Parameters)

  1. 焦距(Focal Length, f x , f y f_x, f_y fx,fy):

    • 摄像头镜头的焦距,分别在x和y方向上的焦距。
    • 通常表示为一个矩阵的对角元素。
      f x , f y f_x, f_y fx,fy
  2. 光学中心(Principal Point, c x , c y c_x, c_y cx,cy):

    • 图像平面上的光学中心(也称为主点),通常在图像的中心。
      c x , c y c_x, c_y cx,cy
  3. 畸变系数(Distortion Coefficients)

    • 描述镜头的畸变情况,包括径向畸变和切向畸变。
    • 典型的畸变系数有五个参数:
      • 径向畸变: k 1 , k 2 , k 3 k_1, k_2, k_3 k1,k2,k3
      • 切向畸变: p 1 , p 2 p_1, p_2 p1,p2
  4. 内参数矩阵(Intrinsic Matrix, K K K):

    • 包含焦距和光学中心的3x3矩阵:

K = [ f x 0 c x 0 f y c y 0 0 1 ] K = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} K= fx000fy0cxcy1

二、外参数(Extrinsic Parameters)

  1. 旋转矩阵(Rotation Matrix, R R R):

    • 描述摄像头坐标系相对于世界坐标系的旋转关系。
  2. 平移向量(Translation Vector, t t t):

    • 描述摄像头坐标系相对于世界坐标系的平移关系。

三、计算畸变校正矩阵

  1. 新相机矩阵(Optimal New Camera Matrix)
    • 在进行图像矫正时,通过计算得到一个新的相机矩阵,可以使图像中的畸变尽量减少,并保留最大的有效像素区域。

示例:内参数和外参数矩阵

内参数矩阵 K K K

K = [ f x 0 c x 0 f y c y 0 0 1 ] K = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} K= fx000fy0cxcy1

外参数矩阵 [ R ∣ t ] [R|t] [Rt]

外参数矩阵由旋转矩阵和平移向量组成:

[ R ∣ t ] = [ r 11 r 12 r 13 t x r 21 r 22 r 23 t y r 31 r 32 r 33 t z ] [R|t] = \begin{bmatrix} r_{11} & r_{12} & r_{13} & t_x \\ r_{21} & r_{22} & r_{23} & t_y \\ r_{31} & r_{32} & r_{33} & t_z \end{bmatrix} [Rt]= r11r21r31r12r22r32r13r23r33txtytz

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/27292.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI 客服定制:LangChain集成订单能力

为了提高AI客服的问题解决能力&#xff0c;我们引入了LangChain自定义能力&#xff0c;并集成了订单能力。这使得AI客服可以根据用户提出的问题&#xff0c;自动调用订单接口&#xff0c;获取订单信息&#xff0c;并结合文本知识库内容进行回答。这种能力的应用&#xff0c;使得…

使用powershell筛选AD域控不能自主更改的用户并变更

# 查询“用户不能更改密码”为勾选状态的所有域用户&#xff0c;将域账户、姓名、勾选状态作为结果保存到C:\result\result.csvGet-ADUser -Filter * -Properties CannotChangePassword | Where-Object { $_.CannotChangePassword -eq $true } | Select SamAccountName, Name, …

班子考核评价的重要性与实施方法

在组织管理领域&#xff0c;班子考核评价是一项至关重要的工作&#xff0c;它不仅关系到组织的发展方向和速度&#xff0c;更直接影响到组织的凝聚力和战斗力。一个科学、公正、有效的班子考核评价体系&#xff0c;能够准确反映班子的工作成效&#xff0c;激励班子成员积极作为…

QML学习及实战

QML学习及实战&#xff08;更多内容&#xff09; 创建项目 3. 剩下的就是一路下一步即可 添加静态资源——图片 添加之后完成之后的路径 案列 || demo 可以参考的资料&#xff1a;https://github.com/gongjianbo/MyTestCode/blob/master/README.md 1. 文本省略号 Text {wi…

第二十三节:带你梳理Vue2:Vue插槽的认识和基本使用

前言: 通过上一节的学习,我们知道了如何将数据从父组件中传递到子组件中, 除了除了将数据作为props传入到组件中,Vue还允许传入HTML, Vue 实现了一套内容分发的 API&#xff0c;这套 API 的设计灵感源自 Web Components 规范草案&#xff0c;将 <slot> 元素作为承载分发…

java面试:Redis事务的相关命令

MULTI:标记一个事务块的开始。 EXEC:执行所有在 MULTI 开始之后&#xff0c;EXEC 执行之前添加到队列中的命令。 DISCARD:取消事务&#xff0c;清空事务队列中已入队的所有命令。 WATCH:监视一个或多个键&#xff0c;一旦其中任何一个键被修改&#xff0c;服务器将拒绝执行事务…

从零开始! jupyter notebook的安装教程

Jupyter Notebook 是一个开源的 web 应用程序&#xff0c;可以创建和共享包含代码、方程、可视化和文本的文档。它广泛用于数据清理和转换、数值模拟、统计建模、机器学习等数据科学领域。以下是从零开始安装 Jupyter Notebook 的详细步骤。 ### 步骤 1: 安装 Python Jupyter…

系统思考与创新解决

结束了为期两天的《系统思考与创新解决》课程&#xff0c;专为上市公司中后台管理者设计。这次课程让我深刻感受到中后端管理者与前端管理者在心智模式上的显著差异。通过使用系统环路图&#xff0c;不仅揭示了这些差异&#xff0c;还探讨了如何利用这些见解来增强团队间的对话…

13. 第十三章 案例研究-选择数据结构

13. 案例研究-选择数据结构 到这里尼应该已经学会了Python的核心数据结构, 也见过了一些使用它们的算法. 如果你想要更多地了解算个发可以阅读第21章. 本章配合联系介绍一个案例分析, 帮你思考如何选择数据结构并如何使用它们.13.1 单词频率分析 1. 练习1 编写一个程序, 读入…

《站在2024年的十字路口:计算机专业是否仍是高考生的明智之选?》

文章目录 每日一句正能量前言行业竞争现状行业饱和度和竞争激烈程度[^3^]新兴技术的影响[^3^]人才需求的变化[^3^]行业创新动态如何保持竞争力 专业与个人的匹配度判断专业所需的技术能力专业核心课程对学生的要求个人兴趣和性格特点专业对口的职业发展要求实践和经验个人价值观…

vue+intro.js实现引导功能

前言&#xff1a; 使用 intro.js这个插件&#xff0c;来实现一个引导性的效果&#xff0c;适用场景&#xff0c;比如&#xff1a;新手引导页&#xff0c;操作说明等等 效果图&#xff1a; 官网地址&#xff1a;点我 实现步骤&#xff1a; 1、安装 npm install intro.js --sa…

【AnimateAnyone】姿态可控视频生成模型训推,让图片里的人物动起来!

1. 模型简介 Animate Anyone是一项角色动画视频生成技术&#xff0c;能将静态图像依据指定动作生成动态的角色动画视频。该技术利用扩散模型&#xff0c;以保持图像到视频转换中的时间一致性和内容细节。训练由两阶段组成&#xff0c;对不同组网成分进行微调。具体实现借鉴于M…

【架构之路】聊聊什么是微服务

如何让大模型更聪明&#xff1f; 引言 微服务&#xff08;Microservices&#xff09;是一种软件架构风格&#xff0c;它将单一的应用程序拆分为多个小的服务&#xff0c;每个服务都是独立运行和部署的。每个微服务通常只专注于一个业务功能&#xff0c;具有自己的数据存储&…

JavaScript 实现数字计数器的动画效果

写JavaScript 实现数字递增的效果 在HTML页面实现数字计数器的动画效果&#xff0c;类似于页面上的计数器功能&#xff0c;可以控制递增速度和效果的流畅度。主要是显示数字时流畅度更好&#xff0c;页面没那么僵硬 1、第一种 设置每次增加的数量&#xff0c;我这里演示的是…

【UIDynamic-动力学-UIGravityBehavior-重力行为 Objective-C语言】

一、UIGravityBehavior,重力行为, 1.接下来啊,我们一个一个来做, 新建一个项目,叫做:01-重力, 接下来,我们在这个ViewController里边, ViewDidLoad:里边,先写一段简单的代码, 我们写这么一段简单的代码,新建一个红色的UIView,把它显示在屏幕上, UIView *redVie…

《征服数据结构》双端栈

摘要&#xff1a; 1&#xff0c;双端栈的介绍 2&#xff0c;双端栈的代码实现 1&#xff0c;双端栈的介绍 双端栈主要利用了“栈底位置不变&#xff0c;栈顶位置动态变化” 的特点&#xff0c;可以让两个栈共享一块存储空间。在前面我们讲到用数组实现栈的时候&#xff0c;如果…

memcached介绍和详解

Memcached 是一种高性能、分布式内存缓存系统&#xff0c;常用于加速动态 web 应用程序的性能&#xff0c;通过缓存数据库查询结果、对象等数据&#xff0c;减少对数据库的访问压力&#xff0c;从而提高响应速度和系统吞吐量。 ### Memcached 的特点和工作原理 #### 特点 1. …

2024最新流媒体在线音乐系统网站源码 音乐社区 多语言开心版

本文来自&#xff1a;2024最新流媒体在线音乐系统网站源码 音乐社区 多语言开心版 - 源码1688 应用介绍 简介&#xff1a; 2024最新流媒体在线音乐系统网站源码| 音乐社区 | 多语言 | 开心版 图片&#xff1a;

Hyper-V如何将文件复制到虚拟机?教您3个简单的方法!

需要将文件复制到虚拟机&#xff01; “大家好&#xff0c;有谁知道Hyper-V怎么将文件复制到虚拟机吗&#xff1f;我有一些文件&#xff0c;想要从主机中复制进虚拟机中&#xff0c;但是我不知道该怎么操作&#xff0c;有谁可以帮帮我吗&#xff1f;谢谢。” Hyper-V虚拟机可…

Python 使用 Tkinter库 设置 tkinter ttk 框架的背景颜色

Tkinter 设置 tkinter ttk 框架的背景颜色 在本文中&#xff0c;我们将介绍如何使用 Tkinter 在 tkinter ttk 框架中设置背景颜色。Tkinter 是 Python 中常用的 GUI 工具包&#xff0c;ttk 则是 Tkinter 中的一个模块&#xff0c;提供了一套更加现代化的控件。 Tkinter 简介 …