提示:。
提示:以下是本篇文章正文内容,下面案例可供参考
精度
算法(稳定性)
世界坐标系和摄像机坐标系通过旋转和平移相关。
外部参数:
Xw,Yw,Zw这三个参数用于平移
Xc,Yc,Yc这三个参数用于旋转
世界坐标系建为黄色,原点为自定义点
摄像机坐标系为红色,原点为相机当前位置
1.3D 点使用外在矩阵从世界坐标转换为摄像机坐标,该矩阵由两个坐标系之间的旋转和平移组成。
2.摄像机坐标系中新的 3D 点使用内部矩阵投影到图像平面上,该矩阵由内部摄像机参数(如焦距、光学中心等)组成。
参考用代码解释单应性的基本概念
/第一步:读取图像信息///
/*
定义一个vector容器
把某一路径下的全部图像全部存入容器中
*/
vector<String> Image;
string Path = "Left";
glob(Path, Image);
vector<Point3f>threewei;
for (int i = 0; i < CHESSBOARD[1]; i++)
{
for (int j = 0; j < CHESSBOARD[0]; j++)
threewei.push_back(Point3f(i, j, 0));
}
cout << "/关键点的世界坐标///"<<endl;
waitKey(2000);
cout << threewei;
第三/四步: 找到关键点在图像上的位置//
/*
用Mat类变量表示存在Image里的图像
变色
寻找关键点
精准化
检测关键点
储存关键点信息
*/
cout << "//正在搜索标定点" << endl;
Mat ima,imag;
bool found;
vector<Point2f>corners;
vector < vector<Point3f>>threeweidian;
vector < vector<Point2f>>jiaodian;
for (int i = 0; i < Image.size(); i++)
{
ima = imread(Image[i]);
cvtColor(ima, imag, COLOR_BGR2GRAY);
found = findChessboardCorners(imag, Size(CHESSBOARD[0], CHESSBOARD[1]), corners,
CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE + CALIB_CB_FAST_CHECK);
if (found)
{
TermCriteria criteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.001);
cornerSubPix(imag, corners, cv::Size(11, 11), cv::Size(-1, -1), criteria);
drawChessboardCorners(imag, cv::Size(6, 9), corners, found);
threeweidian.push_back(threewei);
jiaodian.push_back(corners);
}
cv::imshow("Corner Detected Left", imag);
waitKey(0);
}
///第五步: 计算相机内外参数 ///
cout << "开始计算镜头内外参,请等待数分钟……" << endl;
cv::calibrateCamera(threeweidian,jiaodian, cv::Size(imag.rows, imag.cols), L_cameraMatrix, L_distCoeffs, L_R, L_T);
cout << "镜头内外参计算完成!" << endl;
//左摄像头参数输出
cout << "/// 左摄像头内参 ///" << endl;
std::cout << "cameraMatrix : " << L_cameraMatrix << std::endl;
std::cout << "distCoeffs : " << L_distCoeffs << std::endl << endl << endl;