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

2024-06-15 09:44

本文主要是介绍摄像头校准之白平衡畸变坏点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

  • 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.chinasem.cn/article/1063104

相关文章

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

4-4.Andorid Camera 之简化编码模板(获取摄像头 ID、选择最优预览尺寸)

一、Camera 简化思路 在 Camera 的开发中,其实我们通常只关注打开相机、图像预览和关闭相机,其他的步骤我们不应该花费太多的精力 为此,应该提供一个工具类,它有处理相机的一些基本工具方法,包括获取摄像头 ID、选择最优预览尺寸以及打印相机参数信息 二、Camera 工具类 CameraIdResult.java public class CameraIdResult {

用了虚拟机后,本机摄像头打不开了(联想电脑thinkpad)

虚拟机有摄像头,我断开了连接,现在本机的摄像头打开就是一个锁 我先把虚拟机的摄像头关了 然后把本机的vm usb关闭了 Win+R),输入services.msc,找到VMware USB Arbitration Service,确保其状态为“关闭 然后打开桌面助手 开启 参考: 联想知识库

摄像头模组介绍和技术指标

1 手机摄像头概述 1.1 手机摄像头概述  手机的数码相机功能指的是手机是否可以通过内置或是外接的数码相机进行拍摄静态图片或短片拍摄,作为手机的一项新的附加功能,手机的数码相机功能得到了迅速的发展。 手机摄像头分为内置与外置,内置摄像头是指摄像头在手机内部,更方便。外置手机通过数据线或者手机下部接口与数码相机相连,来完成数码相机的一切拍摄功能。 外置数码相机的优点在于可以减轻手机的重

Nginx跨域运行案例:云台控制http请求,通过 http server 代理转发功能,实现跨域运行。(基于大华摄像头WEB无插件开发包)

文章目录 引言I 跨域运行案例开发资源测试/生产环境,Nginx代理转发,实现跨域运行本机开发运行 II nginx的location指令Nginx配置中, 获取自定义请求header头Nginx 配置中,获取URL参数 引言 背景:全景监控 需求:感知站点由于云台相关操作为 http 请求,http 请求受浏览器跨域限制,不能直接访问,因此需要进行 http 的代理,实

yolov5 +gui界面+单目测距 实现对图片视频摄像头的测距

可实现对图片,视频,摄像头的检测  项目概述 本项目旨在实现一个集成了YOLOv5目标检测算法、图形用户界面(GUI)以及单目测距功能的系统。该系统能够对图片、视频或实时摄像头输入进行目标检测,并估算目标的距离。通过结合YOLOv5的强大检测能力和单目测距技术,系统能够在多种应用场景中提供高效、准确的目标检测和测距功能。 技术栈 YOLOv5:用于目标检测的深度学习模型。Open

如何校准实验中振镜频率的漂移

在实验过程中,使用共振扫描振镜(如Cambridge Technology的8kHz振镜)时,频率漂移是一个常见问题,尤其是在温度变化或长期运行的情况下。为了确保实验的准确性和稳定性,我们需要采取有效的校准措施。本文将介绍如何监测、调节和校准振镜频率,以减少漂移对实验结果的影响。 1. 温度管理和稳定性控制 振镜的频率变化与温度密切相关,温度的升高会导致机械结构的变化,进而影响振镜的共

无人机之摄像头篇

无人机的摄像头是无人机系统中的一个重要组成部分,它承担着捕捉视频和图像的关键任务。随着技术的不断发展,无人机摄像头在分辨率、稳定性、视角、夜视能力、变焦功能以及数据传输等方面都有了显著的进步。以下是一些关于无人机摄像头的主要特点和类型:   分辨率:无人机摄像头的分辨率直接影响拍摄图像或视频的质量。高分辨率摄像头能够捕捉更多细节,使得图像和视频更加清晰。目前市场上常见的无人机摄像头分辨

选什么型号的摄像头

最近看到很多参加比赛的朋友询问选择什么型号的摄像头筹备比赛,demon就以模拟信号摄像头为例发表一下我的选择原则尽供大家参考,希望对大家在摄像头的选型方面有所帮助。 目前生产摄像头的厂家很多,型号也很复杂,我认为重要的是选择到参数适合比赛的摄像头: 1.摄像头的分辨率 这是我们选择摄像头的最重要的一个环节,摄像头的分辨率要适合我们参加比赛用的单片机的采集能力才能正确的识别出赛道。例如使用

无需更换摄像头,无需施工改造,降低智能化升级成本的智慧工业开源了。

智慧工业视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。 项目搭建地址 项目开源地址:yihecode-server 本项目基于ai场景而开发,提供算法模型管理、摄像头管