岳阳做网站多少钱,彩页设计用什么软件,王也道长头像无水印,如何进行网站建设无论是单目、双目或者是多屏幕镜面重建#xff0c;都需要事先对屏幕和相机的相对位置进行标定#xff0c;求得相机到屏幕之间的相对变换关系。如果求得屏幕和相机之间的变换关系呢#xff1f;接下来是标定流程。
#xff08;一#xff09;准备#xff1a;
1#xff09… 无论是单目、双目或者是多屏幕镜面重建都需要事先对屏幕和相机的相对位置进行标定求得相机到屏幕之间的相对变换关系。如果求得屏幕和相机之间的变换关系呢接下来是标定流程。
一准备
1生成1920*1080像素的标定板 // 生成棋盘格图像
void genChessBoardBmp()
{const int perBoardPixel 70;const cv::Size boardSize(11, 9);const cv::Size resolution(1920,1080);{int basisHeight (resolution.height - perBoardPixel * boardSize.height) / 2;int basisWidth (resolution.width - perBoardPixel * boardSize.width) / 2;if (basisHeight 0 || basisWidth 0){//cout Resolution doesnt match! endl;}cv::Mat image(1080,1920, CV_8UC1, cv::Scalar::all(255));int flag 0;for (int j 0; j boardSize.height; j){for (int i 0; i boardSize.width; i){flag (i j) % 2;if (flag 0){for (int n j * perBoardPixel; n (j 1) * perBoardPixel; n)for (int m i * perBoardPixel; m (i 1) * perBoardPixel; m)image.atuchar(n basisHeight, m basisWidth) 0;}}}//cv::imshow(haha,image);std::string strSavePath std::string(H) std::to_string(boardSize.width) _V std::to_string(boardSize.height) _ std::to_string(perBoardPixel) .bmp;cv::imwrite(strSavePath, image);//cv::waitKey(0);}
}
2购买棋盘格或者圆点标定板
3购买高精度平面镜子
4购买一个屏幕
二标定过程 1使用购买的棋盘格或者圆点标定板对单目相机标定或者双目相机标定 2放置镜子让相机采集到屏幕上的棋盘格图案。放置至少三个位置采集至少三张图像。 3使用参考文章中的标定方法通过三张采集图像计算得到屏幕到相机的旋转、平移变换矩阵。 4使用相机到虚像的旋转和平移矩阵以及屏幕到相机的旋转、平移矩阵计算剩下n张图像的镜面距离和法向。 5全局优化优化屏幕到相机的旋转和平移矩阵每一个图像下的镜子法向和相机中心到镜子的距离 三结果
1.标定结果如下
全局优化结果第一列是图像编号第二列是棋盘格点编号第三列是投影误差可以看到标定误差基本都在0.1个像素之内。 2.第0副屏幕、相机、镜子、虚像之间的关系显示 B点的夹角是180度表示A,B,C是在一条直线上的。 距离一致 垂直法向一致 3.验证法向
可以看到acos求角平分线和法向之间的反余弦值发现是吻合的。 四注意事项
1.相机标定的时候标定板的精度一定要高一点如果不高我发现在标定过程中如果相机标定误差是镜面标定误差的3倍的时候优化出来的镜子大小和相机到镜子之间的距离也会发现严重的失真发生等比例缩放【笑哭】一直找不到问题后来发现是这个问题。
2.一定不要放弃。 参考文章 Flexible geometrical calibration for fringe-reflection 3D measurement fringe-reflection photogrammetry based on poses calibration with planar mirror reflection