halcon 旋转_HALCON高级篇:3D相机标定(3/3)

访问标定结果

算子calibrate_cameras的主要结果由相机内参和每一张图像标定板的位姿组成。算子将它们存储在标定数据模型中,可以用算子get_calib_data来访问它们。

5f503500d75739ccc6882fa443a75a29.png

相机外参并不能直接被获取,因为所需的世界坐标系统的信息没有存储在标定数据模型中。然而,如果标定板被直接放置在测量平面上,其位姿可以被用来很容易的得到相机的外参,其是测量平面的位姿。

确定相机外参

相机外参描述了测量平面和相机的关系,例如如果仅仅外参是已知,就可能将相机坐标系统(CCS)转化到测量平面的坐标系统,反之亦然。在HALCON中,测量平面被定义为世界坐标系统(WCS)z=0的平面。

相机外参可以用不同的方法来确定:

  1. 利用从某一个标定图像获取的位姿,其中标定图像中标定板被直接放置在测量平面上。在这种情况下,你就可以用算子get_calib_data来获得其位姿。
  2. 通过一个标定板被直接放置在测量平面的额外图像,将相机内参的确定从相机外参的确定分离出来。应用find_calib_object去提取标定标志点和位姿。
  3. 自己去确定3D世界点和它们在图像映射的对应关系,然后调用vector_to_pose。

如果你仅仅需要去精确地测量一个物体的尺寸,而不是在一个给定坐标系统的物体的绝对位置,前两种方法中一种就可以使用。

后两种情况具有相机外参的决定不依赖相机内参的优势。如果用单个相机在数个平面上做测量,或者不能在原地标定相机,这将是更加灵活和有用。

下面将对不同的情况做详细的讲解。

在标定图像之一将标定板放置在测量平面上

第一种情况是一种最容易决定外参的方法。标定板必须直接放置在测量平面上,例如流水线。

因为通过算子calibrate_cameras,标定板的位姿可以确定下来,你可以通过算子get_calib_data简单的访问其位姿。这样,用一个单一的标定步骤,内参和外参就能确定下来。这里,在第一个标定图像中标定板(标定物索引0)的位姿被确定。请注意的是每一个位姿是由7个值组成的。

81782dad3fcac749f3f90d03b68d8321.png

如果标定把是无限的薄的,结果位姿将是测量平面的真实位姿。因为真实的标定板有一个厚度d>0,标定板的位姿通过一个垂直于测量平面的量d的移动,例如沿着WCS的z轴。为了矫正它,我们需要沿着WCS的z轴去移动位姿d个单位。为了执行这个移动,算子set_origin_pose被利用:

578aa92c379f713d294a47a05ef5478e.png

一般地,只要标定板和测量平面的空间关系是已知的,标定板在WCS中就可以任意地锁定方向(如图3所示)。然后,为了从标定板位姿中获得测量平面的位姿,一个刚性转换时必须的。在下面的例子中,标定板的位姿沿着y轴平移,接着绕着x轴旋转。

f3602751bb24a2e9ec2533848ec6dc31.png

在一个单独图像中放置标定板在测量平面上

如果用HALCON标定板的优势可以将相机内参和外参分离所具有的灵活性相结合,第二种相机外参确定的方法可以使用。

首先,相机按照标定步骤进行标定。这可以优先于相机在最终使用点安装之前完成。

然后,在最终使用点安装完相机以后,外参就可以被确定。仅仅需要做的就是取一张图,图中标定被直接放在了测量平面上。从这张图中,外参就可以被确定下来。这里,内参,标定板被直接放在测量平面上的图像和标定标志点的世界坐标可从文件中读取。

771ece36d6bb40514acc93b6ce1148a8.png

然后,标定标志点和标定板的位姿被提取:

6fd0724d44cd2e8b50f3915168d6f9a5.png

最后,考虑到标定板的厚度,被给相机位姿原点的值平移标定板厚度个单位。

621eb2ed6ce457f53620692a75c5ae84.png
94a83a8ac9f992fd53f59013a7101e7b.png

图3 标定板和测量平面的关系

需要注意的是,如果你想将标定步骤分为两个部分来完成的话,相机的聚焦是很重要的,因为改变焦点就相当于改变焦距,其是内参的一部分。

利用已知的3D点和它们对应的图像点

如果在给定的世界坐标系统中执行测量是必要的,对于外参的确定,第三种情况就可以使用。这里,你需要知道至少不再一条直线上3个点的3D世界坐标,然后,你必须确定这些点映射后相对应的图像坐标。现在,算子vector_to_pose可以被用来确定相机的外参。

下面的程序作为一个确定外参的例子。

首先,三个点的世界坐标被设定。

fb52159fa5ed3e03d65a6f510bb919c7.png

然后,在图像上这些点映射后的图像坐标被确定。在这个例子中,它们被很简单的设定位一些接近的 值。实际上,它们应该以亚像素的精度确定下来,因为他们定义了相机外参。

0ddc464d8e4df34dded9cc05b960117e.png

最后,算子vector_to_pose在已知对应关系和相机内参的情况下,被调用。

a566e76af4fd057d6382f65f8612b893.png

从标定数据模型中删除观测图

为了确定有关标定的观测效果,或者从标定数据模型中移除坏质量的观测数据,可以用算子remove_calib_data_observ删除一个观测图。

69c5afde570832009090fc5ad93569d2.png

当再次执行相机标定的时候,需要注意标定错误的改变。

保存结果和销毁标定数据模型

在访问结果(或者用算子write_cam_par和write_pose来存储它们),你可以借助算子clear_calib_data销毁标定数据模型。

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

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

相关文章

java实现poi导入excel_Java POI实现将导入Excel文件的示例代码

问题描述现需要批量导入数据,数据以Excel形式导入。POI介绍我选择使用的是apache POI。这是有Apache软件基金会开放的函数库,他会提供API给java,使其可以对office文件进行读写。我这里只需要使用其中的Excel部分。实现首先,Excel有…

JS中双引号单引号,转义字符问题!!

investListHtml <div class"targetBlock"> <p> targetClass <span>总金额 <i> loanAmount </i> 元&#xff0c;剩余可投 <i> (loanAmount-collectAmount) </i> 元</span></p> <div class"targetCon…

什么叫n+1次select查询问题?

在Session的缓存中存放的是相互关联的对象图。默认情况下&#xff0c;当Hibernate从数据库中加载Customer对象时&#xff0c;会同时加载所有关联的Order对象。以Customer和Order类为例&#xff0c;假定ORDERS表的CUSTOMER_ID外键允许为null&#xff0c;图1列出了CUSTOMERS表和O…

OGRE 入门 二、Basic Tutorial 1 : An introduction to the most basic Ogre constructs

1. 下载源代码及脚本 这里有一个‘Convenient All-In-One’ 版的框架。 2. 创建场景 解压clean_ogre_cmake_project.zip&#xff0c;修改TutorialApplication.cpp中的函数&#xff1a; 1 void TutorialApplication::createScene(void)2 {3 // create your scene here :)4 …

React Native 重新建项目遇到的一些问题

1、基本上一句话&#xff0c;就是本地的node太旧了&#xff0c;跟不上React_Native的节奏&#xff0c;所以需要更新node&#xff0c;但是单纯的更新node丫丫竟然不让我跟&#xff0c;因为是用Homebrew来管理的&#xff0c;所以先update了下brew brew update && brew up…

picACG本地缓存目录_手机上本地存储的哪些文件、文件夹不能删?

手机、电脑随着不断的使用&#xff0c;系统本身、系统工具、第三方应用都会不断产生一些临时文件和垃圾文件。手机产生的垃圾文件更是显得杂乱无章&#xff0c;虽然可以使用系统自带或第三方应用来清理垃圾&#xff0c;但在本地存储还是有大量的文件夹或文件是可以手动删除的。…

python元组和列表的联系_Python元组与列表的区别和联系?

1.元组和列表比较相似&#xff0c;不过它们之间也有着不同&#xff1a; &#xff08;1&#xff09;列表&#xff1a;一个大仓库&#xff0c;你可以随时往里边添加和删除任何东西。 &#xff08;2&#xff09;元组&#xff1a;封闭的列表&#xff0c;一旦定义&#xff0c;就不可…

java的日期操作_java中对时间的操作详解

代码演示&#xff1a;//数据库中去的日期Date s list.get(0).getSdate();System.out.println(s);// Tue Apr 28 00:00:00 CST 2015//手动newDate d new Date();System.out.println(d);// Tue Apr 28 20:53:15 CST 2015System.out.println("" s.after(d));//使用Ca…

1个多月就能看到效果的减肥大法 - 健康程序员,至尚生活!

减肥方法很多。选择减肥方法时应以物理减肥和减少饮食为主。不应该以口服药物为主。常用减肥方法有&#xff1a; ① 预防性减肥&#xff1b; ②运动减肥&#xff1b; ③行为减肥&#xff1b; ④机械减肥&#xff1b; ⑤ 桑那浴减肥&#xff1b; ⑥石膏减肥&#xff1b; ⑦石腊减…

pytorch自带网络_PyTorch机器学习笔记(1)整好环境

2020年1月1日炼丹第0步&#xff0c;装好环境系统 Ubuntu 18.04 LTS先装上conda&#xff08;自带大多数科学计算基础包&#xff0c;以及比较优秀的包管理系统&#xff09;&#xff1a;国内网络环境建议到清华大学镜像站下载&#xff1a;Tsinghua Open Source Mirror​mirror.tun…

Atom与markdown

简述 Atom是github开发的开源跨平台的编辑器&#xff0c;Atom的强大可以与大名鼎鼎的Sublime Text相媲美。因为使用过Sublime Text&#xff0c;所以用Atom上手很快。这篇文章主要介绍使用Atom写markdown。之前在项目开发中都是使用.doc文件作为接口文档的载体&#xff0c;但是在…

java 正则匹配 sql星号,正则表达式匹配星号和换行符之间的字符串

Example:blah blah * Match this text Match this textMatch this textMatch this textMatch this text*more text more textHow to get string from inside the asterisk with the line breaks?解决方案You can use a negated match here. Notice that I escaped \ the liter…

Effective C# Item22:使用事件定义外发接口

事件为类型定义了外发接口&#xff0c;C#的事件是建立在委托的基础上的&#xff0c;委托为事件处理器提供了类型安全的函数签名。 委托要比事件的使用范围广泛&#xff0c;我们可以把事件看做是一种经过了封装的委托&#xff0c;专门用于事件驱动模型。你可以在客户代码中直接调…

【VC6.0】getline需要输入2次回车才会结束的BUG修复方法

今天看CPrimer的时候发现一个问题&#xff0c;getline需要输入2次回车才会显示结果&#xff0c;上网找了一下&#xff0c;发现是VC6.0的原因&#xff0c;修复原因如下&#xff1a; &#xff08;1&#xff09;建立一个1.CPP &#xff08;2&#xff09;输入#include <string&g…

Hash(LCP) || 后缀数组 LA 4513 Stammering Aliens

题目传送门 题意&#xff1a;训练指南P225 分析&#xff1a;二分寻找长度&#xff0c;用hash值来比较长度为L的字串是否相等。 #include <bits/stdc.h> using namespace std;typedef unsigned long long ull; const int N 4e4 5; const int x 123; ull H[N], _hash[N]…

2009小记

也许这个总结早就应该写了&#xff0c;不过按照学生的时间表&#xff0c;现在写也还说的过去&#xff0c;呵呵 到现在转到计算机这个专业好像已经好几年了&#xff0c;学了很多很多的东西&#xff0c;不过老觉得还是浮在表面上&#xff0c;没有真正的进入深层次的学习。也许我并…

python画菱形的代码_Python打印“菱形”星号代码方法

本人是一名python初学者&#xff0c;刚刚看到一道有趣的python问题&#xff0c;“用python如何在编译器中打印出菱形图案&#xff1f;” 因此决定尝试一下&#xff0c;代码不多&#xff0c;仅供参考。 代码 def printStar(intNum): s "*" spaceLength intNum block…

python创建变量score_使用Python 3.5.1中的变量创建文件时的FileNotFoundError

我正在尝试使用Python中的变量创建一个文件&#xff0c;但它不会拥有它。 以下是创建文件名的代码&#xff1a;a, b time.strftime("%d/%m/%Y"), time.strftime("%H-%M-%S")c ("SCORE""-""("a")""-"&…

Ubuntu 14.04.3 LTS 配置 DNS Server

我们目的是用一台局域网机器完成 192.168.1.113 <-->cloudshield.com的解析&#xff0c;指定A记录和CNAME; 0.关于Ubuntu 14.04.2 LTS 下载、安装、更新这里就直接跳过了; 1.下载安装工具 bind9 sudo apt-get install bind9 DNS 配置文件在/etc/bind 目录中。安装bind9后…

汇编的艺术(01)sizeof operator

以前在百度的博客里面学习了逆向一些基本的C语言知识。一方面不能让学习的汇编知识荒废&#xff0c;另外一方面是由于经常碰到一些细节性的问题&#xff0c;需要温故而知新。 学习汇编对于我自己的感觉是&#xff1a;可以从更加底层的角度来窥视C语言以及其他高层语言的细节。这…