如何通過黑白棋盤進行定位配準融合?(前后安裝的兩個相機)

一.總結:

完整流程 :硬件準備 → 數據采集 → 空間統一 → 相機標定(內參+畸變) → 外參求解 → 定位配準融合 → 校驗 → 生成映射表 → 上線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
英文地址,請注明出處:http://en.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&…