Halcon雙相機單標定板標定實現拼圖

1.Halcon圖像拼接算法在之前的文章里也寫過,主要是硬拼接和特征點拼接兩種方式,今天增加另一種拼接圖像的方式。應用場景是多個相機聯合一起拍大尺寸的物體,并且相機視野之間存在重疊區域。通過在同一個標定板上面標定,計算兩個相機之間位相對外參矩陣實現拼接。
2.代碼分析

dev_update_off ()
*

  • Path to the calibration and object images.
    ImagePath := ‘3d_machine_vision/calibrated_mosaic/’
  • Display workflow explanation text.
    dev_close_window ()
    dev_open_window (0, 0, 600, 300, ‘black’, WindowHandle1)
    set_display_font (WindowHandle1, 16, ‘mono’, ‘true’, ‘false’)
    dev_disp_workflow_text ()
    stop ()
  • Display calibration explanation text.
    dev_clear_window ()
    dev_disp_calibration_text ()
    stop ()

dev_close_window ()
dev_open_window (0, 0, 600, 480, ‘black’, WindowHandle1)
dev_open_window (0, 605, 600, 480, ‘black’, WindowHandle2)
set_display_font (WindowHandle1, 16, ‘mono’, ‘true’, ‘false’)
set_display_font (WindowHandle2, 16, ‘mono’, ‘true’, ‘false’)
*


  • *********** Step 1: Calibration of the cameras ***********

  • Number of calibration images.
    NumCalibImages := 10
  • 從每個攝像頭讀取一張圖像,以獲得攝像頭的寬度和高度。
    read_image (ImageCam1, ImagePath + ‘/calib_cam_1_01’)
    read_image (ImageCam2, ImagePath + ‘/calib_cam_2_01’)
    get_image_size (ImageCam1, WidthCam1, HeightCam1)
    get_image_size (ImageCam2, WidthCam2, HeightCam2)
  • 設置內部相機參數的初始值。
    gen_cam_par_area_scan_division (0.012, 0, 4.4e-6, 4.4e-6, WidthCam1 / 2, HeightCam1 / 2, WidthCam1, HeightCam1, StartCamParam1)
    gen_cam_par_area_scan_division (0.012, 0, 4.4e-6, 4.4e-6, WidthCam2 / 2, HeightCam2 / 2, WidthCam2, HeightCam2, StartCamParam2)
  • 創建標定模型,并設置參數,此模型同時可以校準兩個相機
    create_calib_data (‘calibration_object’, 2, 1, CalibDataID)
    set_calib_data_cam_param (CalibDataID, 0, [], StartCamParam1)
    set_calib_data_cam_param (CalibDataID, 1, [], StartCamParam2)
    set_calib_data_calib_object (CalibDataID, 0, ‘calplate_160mm.cpd’)
  • 依次訪問兩個相機的標定板圖片,進行標定操作
    for I := 0 to NumCalibImages - 1 by 1
    • Read the calibration images.
      read_image (ImageCam1, ImagePath + ‘/calib_cam_1_’ + (I + 1)KaTeX parse error: Double subscript at position 56: …+ '/calib_cam_2_?' + (I + 1)‘02d’)
    • Find the calibration plate and store observations
    • in the calibration data model.
      find_calib_object (ImageCam1, CalibDataID, 0, 0, I, [], [])
      get_calib_data_observ_contours (ContoursCam1, CalibDataID, ‘marks’, 0, 0, I)
      find_calib_object (ImageCam2, CalibDataID, 1, 0, I, [], [])
      get_calib_data_observ_contours (ContoursCam2, CalibDataID, ‘marks’, 1, 0, I)
    • Display calibration images and observed contours.
      dev_set_window (WindowHandle1)
      dev_display (ImageCam1)
      dev_display (ContoursCam1)
      dev_disp_text (‘Image ’ + (I + 1) + ‘/’ + NumCalibImages + ’ (Camera 1)’, ‘window’, ‘top’, ‘left’, ‘black’, [], [])
      dev_set_window (WindowHandle2)
      dev_display (ImageCam2)
      dev_display (ContoursCam2)
      dev_disp_text (‘Image ’ + (I + 1) + ‘/’ + NumCalibImages + ’ (Camera 2)’, ‘window’, ‘top’, ‘left’, ‘black’, [], [])
      disp_continue_message (WindowHandle2, ‘black’, ‘true’)
      stop ()
      endfor

*同時校準兩個攝像頭.
calibrate_cameras (CalibDataID, Errors)
dev_set_window (WindowHandle1)
dev_disp_text (‘Calibration successful’, ‘window’, ‘top’, ‘left’, ‘green’, [], [])
dev_set_window (WindowHandle2)
dev_disp_text (‘Calibration successful’, ‘window’, ‘top’, ‘left’, ‘green’, [], [])
disp_continue_message (WindowHandle2, ‘black’, ‘true’)
stop ()
*


  • ******************* Step 2: Mosaicking *******************

  • Display mosaicking explanation text.
    dev_close_window ()
    dev_close_window ()
    dev_open_window (0, 0, 600, 300, ‘black’, WindowHandle1)
    set_display_font (WindowHandle1, 16, ‘mono’, ‘true’, ‘false’)
    dev_disp_mosaicking_text ()
    stop ()
  • Number of objects.
    NumObjects := 2
  • Number of images per object.
    NumObjImages := 2
  • 獲取兩個相機各自的標定好的參數,相機內參
    get_calib_data (CalibDataID, ‘camera’, 0, ‘params’, CamParam1)
    get_calib_data (CalibDataID, ‘camera’, 1, ‘params’, CamParam2)
  • 獲取相對于第一個相機(參考相機)的位姿
    get_calib_data (CalibDataID, ‘calib_obj_pose’, [0,0], ‘pose’, Pose1)
    *設置標定板厚度4mm,注意算子需要用的單位是米m
    set_origin_pose (Pose1, 0, 0, 0.004, Pose1)
  • 獲取第二臺相機相對于第一臺相機的位姿.
    get_calib_data (CalibDataID, ‘camera’, 1, ‘pose’, RelPose2)
    *為了獲得第二個相機的絕對姿態,它的相對姿態需要
    *以被反轉并與第一相機的絕對姿態相結合。
    pose_invert (RelPose2, RelPose2Inverted)
    pose_compose (RelPose2Inverted, Pose1, Pose2)

*設置目標圖像寬度、高度和比例,以便整個對象
*映射后圖像擬合良好。
TargetWidth := 1340
TargetHeight := 800
*像素當量(1顆像素0.0002m),注意單位是m/pixel
Scale := 0.0002

  • 設置區域,可以裁剪掉有黑邊的圖像區域
    Borders := [125,110,665,1222]

*為了映射對象圖像,需要校正相機的姿態
*再次取決于物體的厚度。這里我們使用兩個不同的對象:
*一把厚度約為2.5mm的尺子和一本薄薄的小冊子,可以
*近似為0mm厚度。
HeightCorrections := [-0.0025,0]
*
dev_close_window ()
dev_open_window (0, 0, 600, 480, ‘black’, WindowHandle1)
dev_open_window (0, 605, 600, 480, ‘black’, WindowHandle2)
dev_open_window (535, 0, 740, 360, ‘black’, WindowHandle3)
set_display_font (WindowHandle1, 16, ‘mono’, ‘true’, ‘false’)
set_display_font (WindowHandle2, 16, ‘mono’, ‘true’, ‘false’)
set_display_font (WindowHandle3, 16, ‘mono’, ‘true’, ‘false’)

for OIdx := 0 to NumObjects - 1 by 1
* 設置矯正圖像原點位置和標定板厚度
set_origin_pose (Pose1, -0.14, -0.07, HeightCorrections[OIdx], WorldPose1)
set_origin_pose (Pose2, -0.14, -0.07, HeightCorrections[OIdx], WorldPose2)
*
* 生成矯正矩陣
gen_image_to_world_plane_map (Map1, CamParam1, WorldPose1, WidthCam1, HeightCam1, TargetWidth, TargetHeight, Scale, ‘bilinear’)
gen_image_to_world_plane_map (Map2, CamParam2, WorldPose2, WidthCam1, HeightCam1, TargetWidth, TargetHeight, Scale, ‘bilinear’)
*
* 矯正圖像
for IIdx := 1 to NumObjImages by 1
ObjImageIdx := 2 * OIdx + IIdx
read_image (ImageCam1, ImagePath + ‘/obj_cam_1_’ + ObjImageIdxKaTeX parse error: Double subscript at position 62: …h + '/obj_cam_2_?' + ObjImageIdx’02d’)
*
* Display input images and camera poses.
dev_set_window (WindowHandle1)
dev_display (ImageCam1)
dev_disp_text (‘Camera 1 image’, ‘window’, ‘top’, ‘left’, ‘black’, [], [])
disp_3d_coord_system (WindowHandle1, CamParam1, Pose1, 0.05)
dev_set_window (WindowHandle2)
dev_display (ImageCam2)
dev_disp_text (‘Camera 2 image’, ‘window’, ‘top’, ‘left’, ‘black’, [], [])
disp_3d_coord_system (WindowHandle2, CamParam2, Pose2, 0.05)
*
* 通過將圖像映射到世界坐標系來優化圖像。
map_image (ImageCam1, Map1, ImageWorld1)
map_image (ImageCam2, Map2, ImageWorld2)
*
* 將映射的圖像拼接在一起。
get_domain (ImageWorld1, Domain1)
get_domain (ImageWorld2, Domain2)
intersection (Domain1, Domain2, RegionIntersection)
paint_region (RegionIntersection, ImageWorld1, ImageWorld1Blackended, 0, ‘fill’)
full_domain (ImageWorld1Blackended, ImagePart1)
full_domain (ImageWorld2, ImagePart2)
add_image (ImagePart1, ImagePart2, ImageFull, 1, 0)
*
* Rotate image and remove the black borders for display.
rotate_image (ImageFull, ImageRotated, 12, ‘constant’)
gen_rectangle1 (RectangleDomain, Borders[0], Borders[1], Borders[2], Borders[3])
reduce_domain (ImageRotated, RectangleDomain, ImageReduced)
crop_domain (ImageReduced, ImageReduced)
mirror_image (ImageReduced, ImageReduced, ‘row’)
mirror_image (ImageReduced, ImageResult, ‘column’)
*
* Display the result image.
dev_set_window (WindowHandle3)
dev_display (ImageResult)
dev_disp_text (‘Result image’, ‘window’, ‘top’, ‘left’, ‘black’, [], [])
if (ObjImageIdx < NumObjects * NumObjImages)
disp_continue_message (WindowHandle3, ‘black’, ‘true’)
stop ()
else
dev_disp_text (‘End of program’, ‘window’, ‘bottom’, ‘right’, ‘black’, [], [])
endif
endfor
endfor
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89118.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89118.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89118.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

動物世界一語乾坤韻芳華 人工智能應用大學畢業論文 -仙界AI——仙盟創夢IDE

提示詞在一個奇幻的童話森林里&#xff0c;所有的動物都像人類一樣直立行走&#xff0c;穿著各種搞怪的衣服。 一只戴著超大眼鏡、穿著背帶褲的烏龜&#xff0c;正一本正經地站在一個蘑菇舞臺上&#xff0c;拿著一根樹枝當作麥克風&#xff0c;準備唱歌。它的眼鏡總是往下滑&am…

SpringBoot(原理篇)

大家好&#xff0c;這里是 盛碼筆記。 本篇我們來聊一聊 Spring Boot 的“魔法”是如何實現的。你可能已經用過 Spring Boot 快速搭建項目&#xff0c;但有沒有想過&#xff1a;為什么只需要引入幾個 starter&#xff0c;Spring Boot 就能自動配置好整個應用環境&#xff1f; …

數據結構:棧(區間問題)

碼蹄集OJ-小碼哥的棧 #include<bits/stdc.h> using namespace std; #define int long long const int N1e67; struct MOOE {int ll,rr; }; stack<MOOE>st; signed main( ) {ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin>>n;while(n--){int opt…

Vue 中 data、watch、created 和 methods

以下是 Vue 中 data、watch、created 和 methods 的詳細解釋&#xff0c;結合常見使用場景和示例&#xff1a;1. data&#xff1a;響應式數據容器 作用&#xff1a;定義組件的響應式數據&#xff08;狀態&#xff09;&#xff0c;當數據變化時&#xff0c;視圖自動更新。特點&a…

精密模具冷卻孔內輪廓檢測方法探究 —— 激光頻率梳 3D 輪廓檢測

引言精密模具冷卻孔的內輪廓精度直接影響注塑成型效率與制品質量。冷卻孔具有深徑比大&#xff08;可達 25:1&#xff09;、結構復雜&#xff08;多為螺旋形或異形&#xff09;、表面質量要求高&#xff08;Ra≤0.2μm&#xff09;等特點&#xff0c;傳統檢測方法難以滿足其高精…

Vue單文件組件與腳手架工程化開發

一、Vue與VueComponent原型關系解析1. 原型鏈關系圖解在Vue中&#xff0c;組件實例(VueComponent)與Vue實例之間存在特殊的原型鏈關系&#xff1a;VueComponent.prototype.__proto__ Vue.prototype這種設計使得所有組件都能訪問Vue原型上定義的方法和屬性。2. 原理驗證示例// …

架構設計之計算高性能——單體服務器高性能

架構設計之計算高性能——單體服務器高性能 高性能是每個程序員共同的追求&#xff0c;無論是開發系統&#xff0c;還是僅僅只是寫一段腳本&#xff0c;都希望能夠達到高性能的效果&#xff0c;而高性能又是軟件系統設計中最復雜的一步。無論是開發千萬級并發的電商系統&#…

Unity燈光面板環境設置

在Unity中&#xff0c;環境設置&#xff08;Environment Lighting&#xff09; 是燈光面板&#xff08;Lighting Window&#xff09;的核心功能之一&#xff0c;用于控制場景的全局光照效果&#xff0c;包括天空盒、環境光、反射和霧效等。這些設置直接影響場景的整體氛圍和真實…

MySQL語句優化案例

1.案例in查詢條件很慢其中in中共115個select id,detail_id,request,response,utime,ctime from response_detaill where detaill_id in (26371986, 26372242, 26371984, 26371990, 26400150, 26371988, 26371994, 26371992,26371998, 26371996, 26371970, 26371968, 2637197…

能行為監測算法:低成本下的高效管理

AI監控智慧公司管理&#xff1a;降本增效的實踐與突破一、背景&#xff1a;經濟壓力下的管理轉型需求在經濟下行周期&#xff0c;企業面臨人力成本攀升、管理效率低下、安全風險頻發等多重挑戰。傳統監控依賴人工巡檢&#xff0c;存在響應滯后、誤判率高、數據孤島等問題&#…

當前(2024-07-14)視頻插幀(VFI)方向的 SOTA 基本被三篇頂會工作占據,按“精度-速度-感知質量”三條線總結如下,供你快速定位最新范式

當前&#xff08;2024-07-14&#xff09;視頻插幀&#xff08;VFI&#xff09;方向的 SOTA 基本被三篇頂會工作占據&#xff0c;按“精度-速度-感知質量”三條線總結如下&#xff0c;供你快速定位最新范式。感知質量最佳&#xff1a;CVPR 2024 ? PerVFI ? 關鍵詞&#xff1a;…

開源 python 應用 開發(七)數據可視化

最近有個項目需要做視覺自動化處理的工具&#xff0c;最后選用的軟件為python&#xff0c;剛好這個機會進行系統學習。短時間學習&#xff0c;需要快速開發&#xff0c;所以記錄要點步驟&#xff0c;防止忘記。 鏈接&#xff1a; 開源 python 應用 開發&#xff08;一&#xf…

基于深度學習的情感分析模型:從文本數據到模型部署

前言 情感分析&#xff08;Sentiment Analysis&#xff09;是自然語言處理&#xff08;NLP&#xff09;領域中的一個重要應用&#xff0c;它通過分析文本數據來判斷文本的情感傾向&#xff0c;例如正面、負面或中性。隨著社交媒體的興起&#xff0c;情感分析在市場調研、品牌管…

使用python 實現一個http server

下面是一個使用 Python 內置庫 http.server 的簡單 HTTP 服務器實現。不需要安裝任何第三方庫&#xff0c;非常適合做演示或開發測試用。 from http.server import HTTPServer, BaseHTTPRequestHandlerclass SimpleHTTPRequestHandler(BaseHTTPRequestHandler):def do_GET(self…

Redis技術筆記-主從復制、哨兵與持久化實戰指南

目錄 前言 一、Redis主從復制 &#xff08;一&#xff09;Redis主從復制介紹 &#xff08;二&#xff09;基本環境準備 &#xff08;三&#xff09;工作原理 &#xff08;四&#xff09;結構模式 &#xff08;五&#xff09;一主一從&#xff08;無密碼&#xff09; 配置…

sundog公司的SilverLining SDK庫實現3d動態云層和下雨、下雨、雨夾雪效果

OSG系列文章目錄 文章目錄OSG系列文章目錄前言一、3d動態云與下雨、下雪效果不能同時出現二、3d動態云與下雨、下雪效果不能同時出現的原因三、解決辦法&#xff1a;前言 先看下效果&#xff1a;下雨 效果&#xff1a;下雪 效果&#xff1a;雨夾雪 &#x1f324;? Sundo…

Python:簡易的 TCP 服務端與客戶端示例

下面是一個完整的 TCP 服務端與客戶端示例&#xff0c;適用于 Python 3&#xff0c;使用 socket 模塊&#xff0c;并正確處理了中文傳輸與異常情況&#xff0c;支持基本的多輪通信。TCP 服務端&#xff08;server_tcp.py&#xff09;import socket HOST 127.0.0.1 # 監聽本地…

文心一言 4.5 開源深度剖析:中文霸主登場,開源引擎重塑大模型生態

> 百度用一場徹底的開源風暴,宣告中文大模型進入性能與普惠并重的新紀元——這里沒有技術黑箱,只有開發者手中躍動的創新火花。 2025年,當全球大模型競賽進入深水區,百度文心一言4.5的開源如同一顆重磅炸彈,徹底打破了“閉源即領先”的固有認知。這一次,中國團隊不…

解決“Windows 無法啟動服務”問題指南

錯誤1067&#xff1a;進程意外終止一、重啟計算機有時系統出現臨時性的服務故障&#xff0c;重啟計算機就可以有效解決問題。需要注意的是&#xff0c;在重啟之前&#xff0c;需要保存好所有未保存的工作&#xff0c;以免數據丟失。重啟完成后&#xff0c;再次嘗試啟動相關服務…

銀河麒麟(Kylin) - V10 GFB高級服務器操作系統ARM64部署昇騰910b訓練機以及Docker安裝

銀河麒麟(Kylin) - V10 GFB高級服務器操作系統ARM64部署昇騰910b訓練機以及Docker安裝 原因 項目需要使用Deepseek-r1-distill-qwen-32b來做訓練&#xff0c;在此記錄 測試環境 服務器配置 型號&#xff1a;G5680V2 CPU&#xff1a;CPU 4Kunpeng 920-5250 NPU&#xff1a;NP…