在c++中vector<Mat> rvecs, tvecs是什么意思?如何查看?完整代码
时间: 2024-03-03 19:47:10 浏览: 23
相机标定是一个比较复杂的过程,需要先读入标定图片,然后提取图片中的特征点,接着进行相机标定,最后输出标定结果。下面是一个完整的相机标定示例代码,包括如何定义和查看`rvecs`和`tvecs`。
```c++
#include <iostream>
#include <string>
#include <vector>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
// 读入标定图片
vector<string> images;
string folder = "path/to/folder";
for (int i = 1; i <= 10; i++)
{
string filename = folder + "/" + to_string(i) + ".jpg";
images.push_back(filename);
}
// 定义标定板角点
Size boardSize(6, 9);
vector<vector<Point3f>> objectPoints;
vector<vector<Point2f>> imagePoints;
vector<Point3f> obj;
for (int i = 0; i < boardSize.height; i++)
{
for (int j = 0; j < boardSize.width; j++)
{
obj.push_back(Point3f(j, i, 0));
}
}
// 提取角点
Mat image, gray;
vector<Point2f> corners;
bool found;
for (int i = 0; i < images.size(); i++)
{
image = imread(images[i]);
cvtColor(image, gray, COLOR_BGR2GRAY);
found = findChessboardCorners(gray, boardSize, corners,
CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE);
if (found)
{
cornerSubPix(gray, corners, Size(11, 11), Size(-1, -1),
TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 30, 0.1));
drawChessboardCorners(image, boardSize, corners, found);
imshow("Image", image);
waitKey(100);
imagePoints.push_back(corners);
objectPoints.push_back(obj);
}
}
// 标定相机
Mat cameraMatrix, distCoeffs;
vector<Mat> rvecs, tvecs;
calibrateCamera(objectPoints, imagePoints, gray.size(), cameraMatrix, distCoeffs, rvecs, tvecs);
// 输出标定结果
cout << "Camera matrix:\n" << cameraMatrix << endl;
cout << "Distortion coefficients:\n" << distCoeffs << endl;
for (int i = 0; i < images.size(); i++)
{
cout << "rvecs[" << i << "]:\n" << rvecs[i] << endl;
cout << "tvecs[" << i << "]:\n" << tvecs[i] << endl;
}
return 0;
}
```
上述代码中,我们首先定义了一个`vector<Mat> rvecs`和`vector<Mat> tvecs`,分别用于存储每幅图像的旋转向量和平移向量。在标定完成后,我们使用循环遍历每幅图像,输出其对应的旋转向量和平移向量。