C++ opencv相机标定矫正图片
时间: 2025-01-25 17:14:28 浏览: 42
在C++中使用OpenCV进行相机标定和图片矫正是一个常见的计算机视觉任务。相机标定的主要目的是确定相机的内参和外参,从而矫正由于镜头畸变导致的图像失真。以下是一个基本的步骤和代码示例,帮助你理解如何使用OpenCV进行相机标定和图片矫正。
### 步骤:
1. **准备标定板**:通常使用棋盘格作为标定板。确保标定板在不同的位置和角度下被拍摄多张图片。
2. **检测棋盘格角点**:使用OpenCV提供的函数检测棋盘格的角点。
3. **相机标定**:使用检测到的角点进行相机标定,计算相机的内参和畸变系数。
4. **图片矫正**:使用标定结果对图片进行矫正,去除畸变。
### 代码示例:
```cpp
#include <opencv2/opencv.hpp>
#include <vector>
#include <string>
int main() {
// 1. 读取标定图片
std::vector<std::string> imageFiles;
// 假设标定图片存放在calib_images文件夹下
cv::glob("calib_images/*.jpg", imageFiles);
// 2. 检测棋盘格角点
cv::Size patternSize(9, 6); // 棋盘格内角点的行数和列数
std::vector<std::vector<cv::Point2f>> imagePoints;
std::vector<cv::Point3f> objectPoint;
for (int i = 0; i < patternSize.height; ++i) {
for (int j = 0; j < patternSize.width; ++j) {
objectPoint.push_back(cv::Point3f(j, i, 0));
}
}
for (const auto& file : imageFiles) {
cv::Mat image = cv::imread(file);
cv::Mat gray;
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
std::vector<cv::Point2f> corners;
bool found = cv::findChessboardCorners(gray, patternSize, corners);
if (found) {
imagePoints.push_back(corners);
cv::drawChessboardCorners(image, patternSize, corners, found);
cv::imshow("Chessboard", image);
cv::waitKey(100);
}
}
// 3. 相机标定
std::vector<std::vector<cv::Point3f>> objectPoints(imagePoints.size(), objectPoint);
cv::Mat cameraMatrix, distCoeffs;
std::vector<cv::Mat> rvecs, tvecs;
cv::calibrateCamera(objectPoints, imagePoints, gray.size(), cameraMatrix, distCoeffs, rvecs, tvecs);
// 4. 图片矫正
for (const auto& file : imageFiles) {
cv::Mat image = cv::imread(file);
cv::Mat undistorted;
cv::undistort(image, undistorted, cameraMatrix, distCoeffs);
cv::imshow("Original", image);
cv::imshow("Undistorted", undistorted);
cv::waitKey(0);
}
return 0;
}
```
### 代码说明:
1. **读取标定图片**:使用`cv::glob`函数读取所有标定图片。
2. **检测棋盘格角点**:使用`cv::findChessboardCorners`函数检测棋盘格的角点。
3. **相机标定**:使用`cv::calibrateCamera`函数进行相机标定,计算相机的内参和畸变系数。
4. **图片矫正**:使用`cv::undistort`函数对图片进行矫正。
阅读全文
相关推荐


















