opencv读取图片c++,读取多个图像完成棋盘格标定完整代码
时间: 2023-08-04 10:28:34 浏览: 94
以下是使用 OpenCV 读取多个图片并完成棋盘格标定的 C++ 代码示例:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 定义棋盘格大小和个数
Size boardSize(9, 6);
int boardNum = 20;
// 定义棋盘格角点坐标
vector<vector<Point3f>> objPoints;
vector<vector<Point2f>> imgPoints;
// 生成棋盘格角点坐标
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));
}
}
for(int i = 0; i < boardNum; i++)
{
objPoints.push_back(obj);
}
// 读取多个图片并提取角点
for(int i = 1; i <= boardNum; i++)
{
// 读取图片
string filename = "path/to/images/" + to_string(i) + ".jpg";
Mat image = imread(filename);
// 转换为灰度图
Mat gray;
cvtColor(image, gray, COLOR_BGR2GRAY);
// 提取角点
vector<Point2f> corners;
bool found = findChessboardCorners(gray, boardSize, corners);
if(found)
{
// 亚像素精细化
cornerSubPix(gray, corners, Size(11, 11), Size(-1, -1), TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 30, 0.1));
// 存储角点
imgPoints.push_back(corners);
// 可视化角点
drawChessboardCorners(image, boardSize, corners, found);
imshow("corners", image);
waitKey(0);
}
}
// 标定相机
Mat cameraMatrix, distCoeffs;
vector<Mat> rvecs, tvecs;
calibrateCamera(objPoints, imgPoints, Size(640, 480), cameraMatrix, distCoeffs, rvecs, tvecs);
// 打印标定结果
cout << "camera matrix:\n" << cameraMatrix << endl;
cout << "distortion coefficients:\n" << distCoeffs << endl;
return 0;
}
```
在代码中,我们首先定义了棋盘格的大小和个数,并生成了棋盘格角点的坐标。然后,我们使用 `findChessboardCorners()` 函数在读取的每个图片中寻找棋盘格角点,并使用 `cornerSubPix()` 函数进行亚像素精细化。找到的角点存储在 `imgPoints` 中。我们还使用 `drawChessboardCorners()` 函数可视化了角点,以便检查是否正确提取。最后,我们使用 `calibrateCamera()` 函数对相机进行标定,并打印标定结果。
需要注意的是,我们需要将图片存储在一个文件夹中,并且按照顺序进行命名(例如,1.jpg、2.jpg、3.jpg 等)。同时,我们还需要将棋盘格图案的长宽比例(即棋盘格大小)与实际棋盘格大小匹配。
阅读全文