1. Aruco Board
ArUco板是一组marker,在计算相机位姿时,如同对单个marker计算相机位姿一样,但是更加鲁棒。
板不限于这种布置,并且可以表示任何2d或3d布局
ArUco板与一组独立的marker之间的区别在于,板中Marker之间的相对位置是先验的,这样可以将所有Marker的角点用于估计摄像机相对于整个ArUco板的姿态
使用ArUco板的好处是:
- 姿势估计更加通用,因为只需要一些Marker,所以即使存在遮挡或局部视图,也可以计算出姿势(相对于整个板的)
- 由于采用了大量的点对应关系(Marker角),因此获得的姿态通常更准确
1.1. 主要的类
1 | class Board { |
- 第一个参数
objPoints
: 这个板上面的角点在这个板的3D坐标系下的坐标的集合,对于每个marker,它的4个角以标准顺序存储,即顺时针顺序,从左上角开始 - 第二个参数: 指示棋盘Marker属于哪个marker字典
- 第三个参数
ids
: 表明了在objPoints
里面每一个marker在字典中的索引
2. Aruco Board 标定相机
2.1. 使用函数calibrateCameraAruco()
无data,暂时没有进行
3. Aruco Board进行相机位姿估计
在进行相机位姿估计之前,同样需要先进行marker的检测detectMarkers()
3.1. estimatePoseBoard()
函数
1 | cv::aruco::estimatePoseBoard(markerCorners, markerIds, board, cameraMatrix, distCoeffs, rvec, tvec); |
- 第一、二个参数
markerCorners
,markerIds
: marker检测得到的角点和id - 第三个参数: 上面提到的
Board
类对象 - 第四、五个参数: 相机参数
cameraMatrix
和distCoeffs
- 最后两个参数: 平移和旋转(相对于整个Aruco板的),如果作为数据传入,数据不为空的时候,作为初始位姿估计,然后计算,再作为输出
3.2. 代码
1 |
|
运行效果:
这是我个人运行的结果,可能由于图片中的Marker是旧版本的字典,现在已经识别不了了,通过函数返回的reject判断
这是官方自己给出的运行效果
4. Aruco Board 的生成
创建 Aruco Board 对象需要指定环境中每个Marker的角位置。 然而,在许多情况下, Aruco Board 对象只是在同一个平面和网格布局中的一组Marker,所以它可以很容易地打印和使用。
将会使用一个GridBoard
类,是继承自 Board 类的一个特殊类,它表示一个在同一个平面中具有所有标记并且在一个网格布局中的 Board。
GridBoard
类的坐标系定位在板面上,坐标系原点在板的左下角,z 轴指向外面,如下图所示。轴色对应为
- x: 红色
- y: 绿色
- z: 蓝色
GridBoard
类两个函数说明
1 | static Ptr<GridBoard> cv::aruco::GridBoard::create( |
1 | void cv::aruco::GridBoard::draw( |
4.1. 生成并输出一个Aruco Board
1 |
|
运行效果