相机标定完成后,把角点图转成正视 C++
时间: 2023-08-12 20:28:43 浏览: 251
以下是将角点图转换成正视图的 C++ 代码示例:
```cpp
#include <opencv2/opencv.hpp>
using namespace cv;
// 相机内参和外参
Mat cameraMatrix, distCoeffs, rvec, tvec;
// 角点坐标
vector<Point2f> corners;
// 原始图像大小
Size imageSize;
// 转换后的正视图大小
Size newSize(800, 600);
// 将角点图转换成正视图
void undistortImage(Mat& image)
{
Mat undistortedImage;
undistort(image, undistortedImage, cameraMatrix, distCoeffs);
Mat rotationMatrix;
Rodrigues(rvec, rotationMatrix);
Mat transformMatrix(3, 3, CV_64FC1);
hconcat(rotationMatrix, tvec, transformMatrix);
transformMatrix = cameraMatrix * transformMatrix;
Mat newCameraMatrix = getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, 1, newSize);
Mat map1, map2;
initUndistortRectifyMap(cameraMatrix, distCoeffs, Mat(), newCameraMatrix, newSize, CV_16SC2, map1, map2);
Mat transformedImage;
warpAffine(undistortedImage, transformedImage, transformMatrix, imageSize, INTER_LINEAR, BORDER_CONSTANT);
Mat undistortedTransformedImage;
remap(transformedImage, undistortedTransformedImage, map1, map2, INTER_LINEAR);
Rect roi(0, 0, newSize.width, newSize.height);
image = undistortedTransformedImage(roi).clone();
}
int main()
{
Mat image = imread("corner_image.jpg");
imageSize = image.size();
// 进行相机标定,获取相机内参和外参,以及角点坐标
// ...
// 将角点图转换成正视图
undistortImage(image);
// 显示转换后的正视图
imshow("Undistorted Image", image);
waitKey(0);
return 0;
}
```
在代码中,`cameraMatrix`、`distCoeffs`、`rvec`、`tvec` 分别表示相机的内参矩阵、畸变系数、旋转向量和平移向量;`corners` 表示角点坐标;`imageSize` 表示原始图像大小;`newSize` 表示转换后的正视图大小。
`undistortImage()` 函数将角点图转换成正视图,具体实现步骤如下:
1. 对角点图进行去畸变处理,得到去畸变后的图像。
2. 根据相机内参和外参计算变换矩阵,将去畸变后的图像进行变换,得到变换后的图像。
3. 根据新的相机内参和去畸变后的图像计算映射表,将变换后的图像进行透视变换,得到正视图。
4. 从正视图中裁剪出指定大小的区域作为最终的正视图。
最后,通过 `imshow()` 函数和 `waitKey()` 函数可以显示转换后的正视图。
阅读全文