首页 > 编程语言 >张正友相机标定流程(程序)

张正友相机标定流程(程序)

时间:2023-07-18 23:14:25浏览次数:39  
标签:objectPoints 张正友 boardSize 标定 世界坐标 相机 vector 图像 棋盘

写在前面

OpenCV存储数据的方式:

比如所有图像的角点坐标我可以定义一个对象:

InputArrayOfArrays _imagePoints

InputArray这个接口类可以是Mat、Mat_<T>、Mat_<T, m, n>、vector<T>、vector<vector<T>>、vector<Mat>

这里面以vector<vector<T>>为例:最外面的vector的每个元素(也就是里面的vector)代表一张图像,里面的vector的每个元素代表一个角点坐标,如果是Mat的话还可以求row(行)为1,col(列)为图像的数量

存储世界坐标

 1 /****************************************************************************************************************************
 2 函数原型:
 3        static void calcChessboardCorners(Size boardSize, float squareSize, vector<Point3f>& corners, Pattern patternType = CHESSBOARD)
 4 函数功能:
 5        将相应棋盘格所有可能的世界坐标存储在容器中
 6 函数参数:
 7        1---Size boardSize-------------棋盘格的尺寸Size
 8        2---float squareSize-----------棋盘格角点之间的距离Size
 9        3---vector<Point3f>& corners---用来存储棋盘格角点的三维坐标
10        4---Pattern patternType--------标定板的类型
11 函数返回值:
12        void
13 ****************************************************************************************************************************/
14 
15 static void calcChessboardCorners(Size boardSize, float squareSize, vector<Point3f>& corners, Pattern patternType = CHESSBOARD)
16 {
17     corners.resize(0);
18 
19     switch (patternType)
20     {
21     case CHESSBOARD:
22     case CIRCLES_GRID:
23         for (int i = 0; i < boardSize.height; i++)
24             for (int j = 0; j < boardSize.width; j++)
25                 //typedef Point3_<float> Point3f;
26                 //该函数通过Point3_<float>的有参构造函数实例化一个Point3_<float>对象,也就是创建一个3D点
27                 //猜想对图像棋盘格角点检测后如果认为右下角的内点点为世界坐标系下原点
28                 //那么就将corners[0]的值认为是它的世界坐标的值
29                 //因此这个函数只是在corners这个容器中存储了所有可能的世界坐标,并不考虑是棋盘格哪个点
30                 corners.push_back(Point3f(float(j * squareSize),
31                     float(i * squareSize), 0));
32         break;
33 
34     case ASYMMETRIC_CIRCLES_GRID:
35         for (int i = 0; i < boardSize.height; i++)
36             for (int j = 0; j < boardSize.width; j++)
37                 corners.push_back(Point3f(float((2 * j + i % 2) * squareSize),
38                     float(i * squareSize), 0));
39         break;
40 
41     default:
42         CV_Error(Error::StsBadArg, "Unknown pattern type\n");
43     }
44 }

世界坐标的具体实现程序:

/*************************************************
总体实现逻辑是:由于拍摄时棋盘格始终以棋盘格左下角为世界坐标原点,
因此无论怎么变换棋盘格或则是变换相机,棋盘格的所有点的世界坐标都不会变,
变的只是棋盘格在图像上的位置,也就是像素坐标系,
因此每张图像的棋盘格角点的世界坐标都是一样的,
这里为了和图像一一对应就将棋盘格的所有世界坐标都储存下来(它们是一样的),
定义一个容器的容器,最外层的容器的每个元素是一个存储一张棋盘格的图像的所有角点世界坐标的容器,
这相当于构成了一个N*(H*W)尺度的矩阵,N是图像的总数,H是棋盘格内角点的纵向个数,W是内角点的横向个数 **************************************************/ vector<vector<Point3f> > objectPoints(1); //该函数得到了一张图像上角点的世界坐标 calcChessboardCorners(boardSize, squareSize, objectPoints[0], patternType); objectPoints[0][boardSize.width - 1].x = objectPoints[0][0].x + grid_width; newObjPoints = objectPoints[0]; //imagePoints.size()是图像的个数,imagePoints一个容器的容器,
最外层的容器的每个元素是一个存储一张棋盘格的图像的所有角点的像素坐标的容器,
由于每张图像的世界坐标都一样,因为将objectPoints.resize变成和imagePoints相同的尺度,代表着图像数目,
objectPoints多扩展的空间每个元素都赋予相同的世界坐标 objectPoints.resize(imagePoints.size(), objectPoints[0]);

 

标签:objectPoints,张正友,boardSize,标定,世界坐标,相机,vector,图像,棋盘
From: https://www.cnblogs.com/Sandals-little/p/17564361.html

相关文章

  • [机器人]FANUC发那科机器人零点标定/校准
    首先,需要设定变量$MASTER_ENB的值为1,具体步骤为。1.MENU-下一页-变量。2.ITEM-输入313-变量$MASTER_ENB的值设为1。接下来,通过MENU-下一页-系统-零点标定/校准,进入校准页面。(注:可以提前把机器各轴移动至原点位置)后一步,单击“更新零点标定结果”-是,完成更新操作。(注:无论哪种标......
  • 【开机10】解决出现问题,你的PIN不可用,单击以重新设置PIN 无法打开相机 设置我的PIN 登
    \(弄了1.5个小时,找到这个视频,终于弄好了!!!!!!\)\(如果各位基友出现这种问题,可以参考。\)【开机10】解决出现问题,你的PIN不可用,单击以重新设置PIN无法打开相机设置我的PIN登录选项诊断启动禁用服务后问题解决......
  • 从零开始一起学习SLAM | 相机成像模型
    上一篇文章《从零开始一起学习SLAM|为啥需要李群与李代数?》以小白和师兄的对话展开,受到了很多读者的好评。本文继续采用对话的方式来学习一下相机成像模型,这个是SLAM中极其重要的内容,必须得掌握哦~小白:师兄,上次听你讲了李群李代数,有种“听君一席话胜读十年书”的赶脚~后来看书感......
  • labview视觉检测,一个相机,两个相机,抓边,找圆,一套代码任意切换!采用halcon模板匹配
    labview视觉检测,一个相机,两个相机,抓边,找圆,一套代码任意切换!采用halcon模板匹配YID:33166640852673233......
  • 基于瑞芯微平台cif接口dvp相机的视频接入(ov2640、rv1126为例)
    名词定义CIF,指RK芯片中的VIP模块,用以接收Sensor数据并保存到Memory中,仅转存数据,无ISP功能DVP,一种并行数据传输接口,即DigitalVideoPortHSYNC,指DVP接口的行同步信号PCLK,指Sensor输出PixelClockVSYNC,指DVP接口的场同步信号V4L2,即Video4Linux2,Linuxkernel的视频处理模块 ......
  • FLIR相机 FlyCapture2
    这一段时间在学习重建相关的知识,很自然地就接触到了工业相机。刚拿到相机一头雾水,只能自己一点一点摸索着来。网上能搜到的相关介绍都非常零散,需要自己拼拼凑凑来得到一个全貌。于是我打算在这里把配置和学习的过程简单记录一下,以便日后复习,顺便做一点微小的贡献。(更新中)驱动......
  • Qt联合海康威视工业相机采集,在线转Halcon变量并显示(独立封装、支持多相机、支持黑白相
    Qt联合海康威视工业相机采集,在线转Halcon变量并显示(独立封装、支持多相机、支持黑白相机和彩色相机)。原创文章,转载请说明出处,资料来源:http://imgcs.cn/5c/668685372998.html......
  • EPSON机械手跟相机搭配走tcp ip协议,及跟plc通讯将手动操作部分映射到触摸屏
    EPSON机械手跟相机搭配走tcpip协议,及跟plc通讯将手动操作部分映射到触摸屏EPSON机械手与相机通过TCP/IP协议进行配对,并与PLC进行通信,以将手动操作部分映射到触摸屏。这样做的好处是可以实现更高效的自动化操作和监控。在这段话中涉及到的知识点和领域范围包括:EPSON机械手:机械手是......
  • 我在使用Winform7.0开发海康相机应用的时候系统悄无声息的退出
    一、简介1、说明一下最近,我在开发一个玻璃幕墙检测的项目,这个项目需要使用到海康的相机系统。业务是这样的,相机按着指定的坐标,扫描玻璃幕墙的每块玻璃,通过算法查看是否有损坏的,如果有就发出报警信息,告诉客户。这个项目是有一个同事写好的,我后来重构了一下......
  • 什么是工业相机
    什么是工业相机工业相机是一种特殊类型的相机,适用于恶劣条件(高温、高压和振动)的工作。它们用于控制生产周期、跟踪输送机上的单元、检测超小零件等。因此,总的来说,它们的使用范围覆盖到各个工业领域。工业类型可靠性工业用相机与普通日常相机的显著不同之处在于其高可靠性。此......