如何通过黑白棋盘进行定位配准融合?(前后安装的两个相机)

一.总结:

完整流程 :硬件准备 → 数据采集 → 空间统一 → 相机标定(内参+畸变) → 外参求解 → 定位配准融合 → 校验 → 生成映射表 → 上线remap验证

我们场景流程 :硬件准备 → 数据采集 → 空间统一 → 定位配准融合 → 校验 → 生成映射表 → 上线remap验证 (少了内参标定和外参求解,根据自己的项目来定,如果要求的精度可以不是很高,内参和外参不是必要项)

我们算法流程:两个相机成像空间统一 → 定位配准融合(黑白棋盘) → 生成映射表 → 上线remap验证。


二.拆解:

1. 硬件准备

黑白棋盘格的板子,安装前后两个相机,传送带。
(1)使用两台分辨率的线扫描相机,同时拍摄带有黑白棋盘格的移动载物平台,确保所有图像都含有棋盘格背景,便于后续定位和配准。

2.数据采集

两个相机前后安装,等传送带速度稳定后,放上黑白棋盘和目标物,采集数据。
在这里插入图片描述


3.空间统一

3.1两相机空间分辨率统一

调节传送带移动速度,目标物在传送带经过两个相机后,计算黑白棋盘方格长宽比 scale=H/W (H为棋盘格高度,W为棋盘格宽度),直到 scale≈1(像素在扫描与列方向上等距),这样使两相机均达到统一的空间分辨率。

3.1.1 棋盘格角点作为空间基准
通过 Harris 角点检测识别棋盘格角点,排序后计算长宽比(scale=H/W≈1),排列角点序号和角点坐标,保存成json文件,方便后面 6. 定位配准融合加载分析。
在这里插入图片描述

下面是 原始黑白棋盘图像 和 空间分辨率统一后的黑白棋盘图像。
在这里插入图片描述
在这里插入图片描述

(运行代码:black_white_chessboard_corner_point_detect_sorting_save_json.py)
核心代码:

# 下面自己调整参数
# quality_level: goodFeaturesToTrack 会把角点响应值低于 maxResponse × qualityLevel 的点直接丢弃
# min_distance:非极大值抑制阶段会把相邻角点“合并”掉
max_corners = 200        # 500
quality_level = 0.0001     # 0.01
min_distance = 5          # 20
corners = cv2.goodFeaturesToTrack(gray,maxCorners=max_corners,qualityLevel=quality_level,minDistance=min_distance,useHarrisDetector=True,k=0.04
)# 3. 亚像素角点优化
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 40, 0.001)
if corners is not None:corners = cv2.cornerSubPix(gray, np.float32(corners), winSize=(5, 5), zeroZone=(-1, -1), criteria=criteria)

4. 相机标定(两个相机内参+畸变求解)(暂不用)

每个单目相机标定,确定内参。
主要的内参:焦距 fx​​、fy​,主点 cx​、cy​;再配合内参矩阵 K1​​(相机1)、K2(相机2)和​​光学畸变系数D1​​(相机1)、D2(相机2)。

内参:从相机坐标系转换到像素坐标系中。
外参:从世界坐标系转换到相机坐标系中(用于有深度的重投影)。
里面的参数一般都是相机出厂就定下来的,可以通过相机标定的方式人为计算出来。

K1/K2​​:可见光/近红外相机的内参矩阵,决定成像几何映射。
D1/D2​​:可见光/近红外相机的畸变系数,描述光学形变。

内参求解暂时没用到,等以后实验再分析)


5. 外参求解(暂不用)

暂时用不到外参:
我们使用的两个相机都不是深度相机,而且也没有高度传感器/双目/结构光等,不能获取深度和高度。(外参求解结合以后实验再分析)


6. 定位配准融合

图像配准与融合技术:透视变换和RANSAC迭代​​
基于棋盘格关键角点进行匹配配准,使用透视变换统一不同波段图像的视角差异,然后融合生成最终高光谱图像。该方法确保光谱和空间统一后的图像在几何上对齐, 最后通过感兴趣区域(ROI)裁剪后叠加,得到融合图像。

(运行代码register_hyperspectral_to_rgb.py)
核心代码:

# 黑白棋盘角点位置坐标(手动给或json里面加载)if args.pts_json:src_pts, dst_pts, names = load_points_from_json(args.pts_json)else:src_pts, dst_pts, names = default_points()# 估计单应(相机1(低分辨率) -> 相机2(高分辨率))H, inlier_mask = cv2.findHomography(src_pts, dst_pts, method=cv2.RANSAC, ransacReprojThreshold=3.0)if H is None:raise RuntimeError("单应性矩阵估计失败,请检查点位。")# 透视变换到可见光坐标系(用于可视化验证)hs_warp = cv2.warpPerspective(hs, H, (w_rgb, h_rgb), flags=cv2.INTER_LINEAR)# 重投影误差(errors保存到文件中,用于分析哪些点pix匹配差异大)proj = cv2.perspectiveTransform(src_pts, H)errors = np.linalg.norm(dst_pts.reshape(-1,2) - proj.reshape(-1,2), axis=1)

下面2副图是两个相机定位配准融合后的图,两个图像几乎匹配上。
在这里插入图片描述
在这里插入图片描述


7. 检验

(1)用cv2.addWeighted 把两路图实时叠加,观察匹配后的物体是否有飘移。
(2)分析 errors = np.linalg.norm(dst_pts.reshape(-1,2) - proj.reshape(-1,2), axis=1)得到的errors,查看平均误差,中位误差,最大误差,进而消除一些异常点,使匹配精度得到提升。


8. 生成查找表

把映射矩阵通过LUT 打包成lut.npy,实际生产的时候,随软件升级同步。
生成这几个打包文件: lut.npy(包含mapx.npy和mapy.npy) 或者 单个mapx.npy 和 单独mapy.npy

def build_lut_from_H(H: np.ndarray, out_w: int, out_h: int):"""生成 remap 查找表 mapx/mapy:生成映射矩阵。remap 时:dst = remap(src=相机1(低分辨率), mapx, mapy) -> 输出尺寸与( out_w, out_h )一致。"""Hinv = np.linalg.inv(H).astype(np.float64)xs = np.arange(out_w, dtype=np.float32)ys = np.arange(out_h, dtype=np.float32)xg, yg = np.meshgrid(xs, ys)   # (H,W)ones = np.ones_like(xg, dtype=np.float32)grid = np.stack([xg, yg, ones], axis=-1).reshape(-1,3).T  # (3, H*W)src_h = (Hinv @ grid)    # @是矩阵乘法,等同于np.dot()(在二维数组上)或np.matmul()src_h /= (src_h[2:3, :] + 1e-12)mapx = src_h[0, :].reshape(out_h, out_w).astype(np.float32)mapy = src_h[1, :].reshape(out_h, out_w).astype(np.float32)return mapx, mapy

最后remap映射矩阵文件即可:
(运行代码remap_hyper_to_rgb.py)
加载lut.npy进行remap映射。

import cv2, numpy as np
import osroot_path = "xxxxxx"
hs   = cv2.imread(os.path.join(root_path, "5.bmp"))    # camera1图映射到camera2图# 加载映射矩阵文件
# mapx = np.load(os.path.join(root_path, "校准文件npy","mapx_20250731_142541.npy"))
# mapy = np.load(os.path.join(root_path, "校准文件npy","mapy_20250731_142541.npy"))with np.load(os.path.join(root_path, "校准文件npy","lut_20250731_142541.npz")) as d:mapx = d["mapx"]mapy = d["mapy"]hs_to_rgb = cv2.remap(hs, mapx, mapy, interpolation=cv2.INTER_LINEAR,borderMode=cv2.BORDER_CONSTANT, borderValue=0)
cv2.imwrite(os.path.join(root_path, "output","camera1_to_camera2_remap.png"), hs_to_rgb)

还存在的问题

1. 图像畸变问题:
即使做了6. 定位配准融合,但由于没有做4. 相机标定(两个相机内参+畸变求解),所以相机1和相机2的成像图的畸变问题依旧存在。接下来要做4. 相机标定(两个相机内参+畸变求解),减少畸变对像素匹配的影响,提升像素匹配精度。
(生成 H 时只用背景平面点(例如 0–39 号),并先去畸变(单目标定一次即可),一般可把中位误差压到 ~2 px 以内。)

2. 实际产线目标物高度影响成像,影响像素匹配:
在实际产线上,由于相机1和相机2焦距不一样,视场角不一样,导致一些有高度的目标物在两个相机下成像不一样,最终导致两个相机的物体的像素不能完全匹配上,造成误差。这需要5. 外参求解求解出目标物高度或者深度。

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

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

相关文章

【node】token的生成与解析配置

在用户登录成功之后为了记录用户的登录状态通常会将用户信息编写为一个token,通过解析token判断用户是否登录。 token的生成 JSON Web Token(JWT) 是一种基于JSON的轻量级身份验证和授权机制。它是一种开放标准(RFC 7519&#xff…

yolo 、Pytorch (5)IOU

一、简介 IOU的全称为交并比(Intersection over Union),是目标检测中使用的一个概念,IoU计算的是“预测的边框”和“真实的边框”的交叠率,即它们的交集和并集的比值。最理想情况是完全重叠,即比值为1。 …

【银河麒麟服务器系统】自定义ISO镜像更新内核版本

自定义ISO镜像更新内核版本 镜像制作流程 环境 更新仓库 准备新版本内核包 内核清单简介 已下载软件包版本 更新内核包 更新镜像源 制作自动化镜像 修改引导 修改UEFI引导 传统引导 修改ks文件内容 打包镜像 mkisofs参数说明 封装镜像命令 常见问题解决方案 镜像制作流程 #merm…

JVM 调优中JVM的参数如何起到调优动作?具体案例,G1GC垃圾收集器参数调整建议

JVM调优参数 在JVM调优过程中,通过调整JVM参数可以优化Java应用程序的性能。不同的应用场景可能需要不同的调优策略和参数配置。下面将介绍几个常见的调优场景以及相应的JVM参数设置,并给出具体案例说明。 1. 堆内存大小调整 问题描述:应用程…

TGD第十一篇:卷积神经网络中的TGD特征

文章目录一、直觉上重要的视觉特征二、视觉神经网络首层试图自主学习 TGD 算子权重2.1 AlexNet2.2 Vision Transformer2.3 MLPMixer三、针对直觉的验证试验3.1 小样本集自然图像分类任务3.2 小样本集医学图像分割任务四、结语早在 2012 年,卷积神经网络 AlexNet 就已…

【源力觉醒 创作者计划】文心大模型开源:从封闭研发到生态共建的转折点

前言 人工智能的浪潮在近几年席卷全球,不仅颠覆了传统技术路径与行业习惯,更在大模型领域掀起了一场激烈的生态争夺战。自去年起,"百模大战"的硝烟弥漫,微软、谷歌、百度、阿里等科技巨头纷纷入局,在大模型的…

思科 UCS Fabric Interconnect 和 UCS Manager 简介

UCS Manager(UCSM)安装在 Fabric Interconnect(FI)上,并且是UCS架构的集中管理平台,允许你管理所有与计算、网络和存储相关的配置。1. UCS Manager 安装位置UCS Manager 是在 UCS Fabric Interconnect&…

C语言结构体、位段、枚举、联合体

结构体&#xff1a;定义&#xff1a;结构体就是一堆值的集合初始化&#xff1a;#include<stdio.h> #include <stddef.h> struct S {char ch;int n; };int main() {struct S s1 { a, 5 };S s2{ b,6 };printf("s1 ch:%c , n:%d\n", s1.ch, s1.n);printf(&…

AI产品经理面试宝典第61天:AI产品体验、数据安全与架构实战解析

1. 如何提升 AI 产品的用户体验? 1.1 问:如何提升 AI 产品的用户体验? 答: 提升 AI 产品的用户体验可以从以下几个方面入手: 可解释性增强:AI模型的输出往往较为“黑盒”,用户难以理解其决策逻辑。通过可视化、自然语言解释、关键特征展示等方式,增强用户对AI决策过程…

以微服务为基础搭建一套脚手架开始前的介绍

书接上回<java一个脚手架搭建-CSDN博客> 这个脚⼿架项⽬开发前&#xff0c;你要大概的了解一下这些东西&#xff1a; Java基础、IDEA使⽤、Maven基础 • Linux基础 • Springboot/Spring Cloud 基础 • MySQL基础 • Redis基础 • RabbitMQ基础 • Docker基础 • Git基…

Excel接入deepseek

先进入deepseek官网&#xff1a;DeepSeek | 深度求索 点击API开放平台&#xff1a; 确保余额里有钱: 创建APIkey: 复制到.txt文件中储存好 插入VBA代码&#xff1a; Function OptimizeEbayTitle(originalTitle As String) As StringDim Prompt As StringPrompt "作为…

【计组】概述

目录 计算机层次结构 计算机硬件 所有用户&#xff08;程序员&#xff09;可见 所有用户&#xff08;程序员&#xff09;透明 汇编程序员可见 计算机软件 从源程序到可执行文件 计算机性能指标 字长 运算速度 单位换算 存储 速率 时间 计算机层次结构 计算机硬件…

Web15题(7.28~8.3)

&#xff08;1&#xff09;SQL注入 [NSSRound#1 Basic]sql_by_sql 登录界面 尝试二次注入覆盖 admin 用户&#xff0c;但是发现注释符 # 被过滤了&#xff0c;--可以 但是无效了 奥原来是密码输错了 然后进行修改密码&#xff0c;修改以后就可以登录admin账户 查询按钮也不…

《Python 实用项目与工具制作指南》· 1.2 选择与配置Python代码编辑器

1.2 选择与配置 Python 代码编辑器 安装好 Python 环境后&#xff0c;我们还需要一款合适的代码编辑器来编写、运行和调试代码。就像作家需要趁手的钢笔&#xff0c;程序员也需要好用的编辑器 —— 它能帮你自动补全代码、高亮语法错误&#xff0c;让开发 “题目数据生成器”“…

Kali基础知识点【2】

Nmap信息收集nmap&#xff1a;网络扫描器&#xff0c;收集网络信息 openVAS:系统漏洞扫描器Nmap基础命令 nmap 目标主机&#xff1a;收集开放的端口 nmap -O 目标主机&#xff1a;收集目标主机的操作系统 nmap -sP 网段/子网掩码&#xff1a;扫描目标网段上开启的主机 nmap -sV…

Python自动化测试框架:Unittest 断言

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快断言是编程中常用的一种验证方法&#xff0c;也是测试代码中最重要的部分&#xff0c;用于验证某个条件是否为真&#xff0c;验证测试结果与预期结果是否一致。unit…

spring-ai-alibaba 学习(十八)——graph进阶

内容概述 前一篇&#xff08;spring-ai-alibaba 1.0.0.2 学习&#xff08;十七&#xff09;——初识graph-CSDN博客&#xff09;初步介绍了graph&#xff1a; 概念&#xff1a;图、边、节点、状态等&#xff0c;及其核心类和衍生类 使用流程&#xff1a; 1&#xff09;定义…

音视频学习(四十七):模数转换

模数转换&#xff08;Analog-to-Digital Conversion&#xff0c;简称ADC&#xff09;是将连续的模拟信号转换为离散的数字信号的过程&#xff0c;是现代电子系统中的核心技术之一。模数转换广泛应用于通信、信号处理、传感器数据采集、音频处理、图像处理等领域。 基本原理 模数…

8.高斯混合模型

高斯混合模型&#xff0c;简称GMM&#xff0c;对数据可以进行聚类或拟合&#xff0c;多用于传统语音识别。他会将每个数据看做多个高斯分布混合生成的。对于无标签的数据进行聚类&#xff0c;一般采用高斯混合模型处理。算法过程 1.首先进行初始猜测&#xff0c;假设有n个簇&am…

Calcite自定义扩展SQL案例详细流程篇

文章目录前言本章节源码一、基于 Calcite 实现一个自定义 SQL 解析器1.1、认识Calcite解析器二、实战案例2.1、快速构建一个可扩展sql语法的模板工程&#xff08;当前暂无自定义扩展sql示例&#xff09;步骤1&#xff1a;拉取calcite源码&#xff0c;复制codegen代码步骤2&…