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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…