摄像头校准之白平衡畸变坏点
摄像头校准之白平衡&畸变&坏点
- 1. 源由
- 2. 校准内容
- 3. 畸变校准
- 一、畸变模型
- 二、校准步骤
- 1. 准备工作
- 2. 特征点检测
- 3. 计算内参数和畸变系数
- 4. 畸变校正
- 三、验证和优化
- 1. 视觉验证
- 2. 误差评估
- 3. 参数优化
- 4. 白平衡校准
- 一、白平衡基础
- 二、自动白平衡(AWB)
- 三、手动白平衡
- 四、验证和优化
- 5. 坏点校准
- 一、坏点检测
- 1. 确定坏点类型
- 2. 拍摄黑暗场图像
- 3. 阈值检测
- 二、坏点校正
- 1. 邻域平均法
- 2. 双边滤波法
- 三、验证和优化
- 1. 视觉验证
- 2. 自动化检测和校正
- 3. 重复拍摄和校准
- 6. 总结
- 7. 补充资料 - 光学校准
- 一、内参数(Intrinsic Parameters)
- 二、外参数(Extrinsic Parameters)
- 三、计算畸变校正矩阵
- 示例:内参数和外参数矩阵
1. 源由
昨天讨论了关于摄像头校准方面的问题,其实刚开始时工作的时候在相机、摄像机方面从事一段时间的开发,大体上还是应用类的研发工作。
当时是基于SDK方案,在其基础上做一些参数调整,但是总的逻辑大致是一致的。现在技术发展已经远超当年,尤其有强大的后端数据处理时,要处理这个校准问题的手段就更加多了。
回忆总结下,关于摄像头校准方面的一些校准内容,如果还有其他没有提及的,请各位路过的兄弟们指点下,我后续补充:
2. 校准内容
- 畸变校准
- 白平衡校准
- 坏点校准
- TBD … … (请各位路过、看过的兄弟评论留言指导,谢谢)
3. 畸变校准
摄像头畸变校准是指校正镜头引起的图像畸变,使图像中的直线和比例恢复正常。常见的畸变包括径向畸变和切向畸变。以下是摄像头畸变校准的详细步骤,包括畸变模型、参数计算和图像校正。
一、畸变模型
-
径向畸变(Radial Distortion):
- 描述图像中直线弯曲的现象。径向畸变分为桶形畸变(Barrel Distortion)和枕形畸变(Pincushion Distortion)。
- 典型的径向畸变系数: k 1 , k 2 , k 3 k_1, k_2, k_3 k1,k2,k3
-
切向畸变(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. 准备工作
-
棋盘格图案:
- 打印标准棋盘格图案,并确保其尺寸精确。
-
拍摄校准图像:
- 将棋盘格图案放置在不同的角度和位置,拍摄多张图像。确保棋盘格覆盖摄像头视野的不同部分。
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)
-
灰世界假设法:
- 假设图像中所有颜色的平均值是中性的灰色,通过调整图像的红色、绿色和蓝色通道,使其平均值相同。
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()
-
图像统计法:
- 利用图像直方图统计信息调整白平衡,算法会计算每个通道的统计量,并做相应的调整。
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()
三、手动白平衡
-
使用标准灰卡:
- 拍摄一张包含标准灰卡(18% 灰)的图像,调整图像的红、绿、蓝通道,使灰卡区域呈现中性灰色。
-
计算校正系数:
- 计算灰卡区域的平均颜色值,分别获取红、绿、蓝三个通道的校正系数。
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()
四、验证和优化
-
视觉验证:
- 观察校准后的图像,确保图像中的白色和中性灰色区域没有明显的颜色偏差。
-
误差评估:
- 使用色度计或标准颜色板测量校准后的颜色值,与预期值进行比较,评估校准误差。
-
重复调整:
- 根据误差评估结果,重复调整白平衡参数,直到达到满意的校准效果。
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)
-
焦距(Focal Length, f x , f y f_x, f_y fx,fy):
- 摄像头镜头的焦距,分别在x和y方向上的焦距。
- 通常表示为一个矩阵的对角元素。
f x , f y f_x, f_y fx,fy
-
光学中心(Principal Point, c x , c y c_x, c_y cx,cy):
- 图像平面上的光学中心(也称为主点),通常在图像的中心。
c x , c y c_x, c_y cx,cy
- 图像平面上的光学中心(也称为主点),通常在图像的中心。
-
畸变系数(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
-
内参数矩阵(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)
-
旋转矩阵(Rotation Matrix, R R R):
- 描述摄像头坐标系相对于世界坐标系的旋转关系。
-
平移向量(Translation Vector, t t t):
- 描述摄像头坐标系相对于世界坐标系的平移关系。
三、计算畸变校正矩阵
- 新相机矩阵(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] [R∣t]
外参数矩阵由旋转矩阵和平移向量组成:
[ 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} [R∣t]= r11r21r31r12r22r32r13r23r33txtytz
相关文章:
摄像头校准之白平衡畸变坏点
摄像头校准之白平衡&畸变&坏点 1. 源由2. 校准内容3. 畸变校准一、畸变模型二、校准步骤1. 准备工作2. 特征点检测3. 计算内参数和畸变系数4. 畸变校正 三、验证和优化1. 视觉验证2. 误差评估3. 参数优化 4. 白平衡校准一、白平衡基础二、自动白平衡(AWB&am…...

【C++进阶】模板进阶与仿函数:C++编程中的泛型与函数式编程思想
📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C “ 登神长阶 ” 🤡往期回顾🤡:栈和队列相关知识 🌹🌹期待您的关注 🌹🌹 ❀模板进阶 🧩<&…...
OpenCV之cv::Scalar
在 OpenCV 中,cv::Scalar 是一个模板类,用于表示多通道的值。常用来表示颜色或其他具有多个分量的数据。在图像处理中,cv::Scalar 经常用于指定颜色。 cv::Scalar(255, 255, 255) 具体如何理解,取决于图像的颜色空间:…...
智能合约与身份验证:区块链技术的创新应用
一、引言 区块链,一个近年来备受瞩目的技术名词,已经从最初的数字货币领域扩展到了众多行业。那么,究竟什么是区块链?它为何如此重要?本文将深入剖析区块链技术的原理、应用及未来发展。 二、区块链的基本概念 区块…...

浔川身份证号码查询——浔川python科技社
Python获取身份证信息 公民身份号码是每个公民唯一的、终身不变的身份代码,由公安机关按照公民身份号码国家标准编制。每一个居民只能拥有一个唯一的身份证,它是用于证明持有人身份的一种法定证件。 身份证包含了个人的一些重要信息,比如&am…...
C++的标准容器及其应用
C的标准容器及其应用 数组(array)数组的特征应用实列 前向列表(forward_list)前向列表的特征应用实列 列表(list)列表的特征应用实列 有序映射(map)有序映射的特征应用实列 队列&…...

linux如何部署前端项目和安装nginx
要在Linux上部署前端项目并安装Nginx,你可以按照以下步骤操作: 安装Nginx: sudo apt update sudo apt install nginx 启动Nginx服务: sudo systemctl start nginx 确保Nginx服务开机自启: sudo systemctl enable nginx 部署前端项目,假设前…...

Coolify:24.2K 星星!使用全新、开源免费且自托管的替代方案,部署应用程序的最佳工具(停止使用 Vercel)
✨点击这里✨:🚀原文链接:(更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号!) Coolify:24.2K 星星!使用全新、开源免费且自托管的替代方案,部…...
Dubbo入门
Dubbo,听名字好像有点高大上,但实际上它就是个让不同的计算机程序之间能够互相交流的工具,专业点说,它是一个分布式服务框架。想象一下,你有好几个小团队,每个团队负责开发一个部分,最后这些部分…...
从零学习es8
配置 编辑 elasticsearch.yml xpack.security.enabled: true 单节点 discovery.type: single-node设置账号: elasticsearch-reset-password -u elastic 如果要将密码设置为特定值,请使用交互式 (-i) 参数运行该命令。 elasticsearch-reset-password -i…...
String.compareTo()方法详解
Java 中的 String.compareTo() 方法用于按字典顺序比较两个字符串。这个方法实现了 Comparable 接口,返回一个整数,表示字符串的相对顺序。 方法签名 public int compareTo(String anotherString)返回值 一个负整数:如果当前字符串在字典顺…...

Nintex流程平台引入生成式人工智能,实现自动化革新
工作流自动化提供商Nintex宣布在其Nintex流程平台上推出一系列新的人工智能驱动改进。这些增强显著减少了文档化、管理和自动化业务流程所需的时间。这些新特性为Nintex流程平台不断扩展的人工智能能力增添了新的亮点。 Nintex首席产品官Niranjan Vijayaragavan表示:…...
永远不要做房间里“最聪明的人”(早懂早受益)
听好了,茶客,我要向你解释一些事情。 你的工作和职责是让客户认为他是房间里最聪明的人。 如果你完成了这项任务之后,还有多余的精力,应该用它来让你的高级合伙人显得像是房间里第二聪明的人。 只有履行了这两项义务之后ÿ…...
Leetcode 3177. Find the Maximum Length of a Good Subsequence II
Leetcode 3177. Find the Maximum Length of a Good Subsequence II 1. 解题思路2. 代码实现 题目链接:3177. Find the Maximum Length of a Good Subsequence II 1. 解题思路 这一题我一开始的思路是直接使用暴力的动态规划的方式进行实现,结果遇到了…...
程序员做电子书产品变现的复盘(2)
赚钱有多种,简单分为两类。 (1)手停口停型,这种工作在你积极从事时可能每天能带来数千甚至上万的收入,但一旦停止工作,收入就会大幅下降甚至归零,例如我们的日常工资。 (2…...
Java中的JVM是什么?如何调优JVM的性能?
Java中的JVM(Java Virtual Machine)是一个虚构出来的计算机,是一个规范,它在运行Java程序时扮演着核心角色。调优JVM的性能可以通过内存管理、垃圾回收、编译器优化等方法来提升Java应用程序的性能和稳定性。 Java中的JVM&#x…...

大型医院手术麻醉系统源码,前端采用Vue,Ant-Design开发,稳定成熟
医院手麻系统源码,手术麻醉信息系统,C#源码 医院手术麻醉信息系统包含了手术申请、排班、术前、术中、术后,直至出院的全过程。通过与相关医疗设备连接,与大屏幕显示公告相连接,实现了手术麻醉临床应用数据链全打通。…...

Linux安装Docker | 使用国内镜像
环境 CentOS7 先确认能够上网 curl www.baidu.com返回该输出说明网络OK 步骤一:安装gcc 和 gcc-c yum -y install gccyum -y install gcc-c步骤二:安装Docker仓库 yum install -y yum-utils接下来配置yum的国内镜像 yum-config-manager --add-re…...

redis易懂快速安装(linux)2024
1.首先打开虚拟机系统 2.打开终端,输入su - 输入管理员密码,进入管理员用户 3.输入inconfig查看ip地址 4.打开final shell 连接虚拟机,输入ip和root用户以及密码 5.连接成功 6.输入 cd /usr/local/src/ 进入要安装的文件夹 6.点击上传按钮…...
关于数据库存储【\】转义字符反斜杠丢失的问题
背景 开始的时候,发现一个很奇怪的现象 富文本编辑器,前端存储带有"的内容,回显的时候解析就会出问题 后来发现,其实是只要是需要带有\进行转义的内容就会有问题 排查 从前端提交数据,后端获取数据ÿ…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...