基于Opencv C# 鱼眼(桶形)畸变矫正完整代码,使用棋盘格进行畸变矫正,代码运行正常,由实际运行项目中剥离,含测试图片

在计算机视觉领域,鱼眼镜头由于其独特的广角视野,被广泛应用于安防监控、自动驾驶等诸多场景。然而,鱼眼镜头带来广阔视角的同时,也引入了严重的桶形畸变,这对后续的图像分析和处理造成了很大困扰。今天,就来分享一下基于OpenCV C# 使用棋盘格进行鱼眼畸变矫正的完整代码及实践。

环境准备

首先,确保你已经安装了OpenCV for.NET库。可以通过NuGet包管理器轻松安装,在Visual Studio中,右键点击项目,选择“管理NuGet程序包”,搜索“OpenCvSharp4”并安装。

代码实现

加载棋盘格图片

Mat chessboardImage = Cv2.ImRead("test_chessboard.jpg");
if (chessboardImage.Empty())
{
    Console.WriteLine("无法加载图片");
    return;
}

这里使用Cv2.ImRead方法读取测试图片,如果图片加载失败,程序直接输出提示信息并返回。test_chessboard.jpg就是我们用于标定的棋盘格图片,这个图片要清晰,并且棋盘格要完整显示在画面中。

寻找棋盘格角点

Size patternSize = new Size(9, 6);
Point2f[] corners = new Point2f[patternSize.Width * patternSize.Height];
bool found = Cv2.FindChessboardCorners(chessboardImage, patternSize, out corners, ChessboardFlags.AdaptiveThresh | ChessboardFlags.NormalizeImage);
if (found)
{
    Cv2.DrawChessboardCorners(chessboardImage, patternSize, corners, found);
}
else
{
    Console.WriteLine("未找到棋盘格角点");
}

我们定义了棋盘格的内角点数量patternSize,这里是9列6行。Cv2.FindChessboardCorners方法用于在图像中寻找棋盘格角点,找到角点后,found会为true,此时通过Cv2.DrawChessboardCorners方法将找到的角点绘制在图像上,方便直观查看。要是没找到,就输出提示信息。

计算相机参数

Mat cameraMatrix = Mat.Identity(3, 3, MatType.CV_64F);
Mat distCoeffs = new Mat();
Size imageSize = chessboardImage.Size();
List<Point3f> objectPoints = new List<Point3f>();
for (int i = 0; i < patternSize.Height; i++)
{
    for (int j = 0; j < patternSize.Width; j++)
    {
        objectPoints.Add(new Point3f(j * 1.0f, i * 1.0f, 0));
    }
}
List<List<Point2f>> imagePoints = new List<List<Point2f>>();
imagePoints.Add(corners.ToList());
Cv2.CalibrateCamera(new List<List<Point3f>> { objectPoints }, imagePoints, imageSize, cameraMatrix, distCoeffs, out _, out _, CalibType.ZeroTangentDist);

Mat.Identity创建了一个3x3的单位矩阵作为初始相机矩阵cameraMatrixobjectPoints是棋盘格角点在世界坐标系下的坐标,这里假设棋盘格每个格子大小为1x1,Z轴坐标为0。imagePoints是棋盘格角点在图像坐标系下的坐标。通过Cv2.CalibrateCamera方法计算相机的内参矩阵cameraMatrix和畸变系数distCoeffs

畸变矫正

Mat undistortedImage = new Mat();
Cv2.Undistort(chessboardImage, undistortedImage, cameraMatrix, distCoeffs);
Cv2.ImShow("Undistorted Image", undistortedImage);
Cv2.WaitKey(0);

最后,使用Cv2.Undistort方法对原始的鱼眼图像chessboardImage进行畸变矫正,得到矫正后的图像undistortedImage。通过Cv2.ImShow显示矫正后的图像,Cv2.WaitKey(0)等待用户按键关闭窗口。

总结

通过上述代码,我们基于OpenCV C# 利用棋盘格完成了鱼眼(桶形)畸变的矫正。实际项目中,可能需要采集多组棋盘格图像以提高标定精度,但整体流程基本一致。希望这篇文章能帮助到正在研究鱼眼畸变矫正的朋友们,一起在计算机视觉的海洋里探索。

基于Opencv C# 鱼眼(桶形)畸变矫正完整代码,使用棋盘格进行畸变矫正,代码运行正常,由实际运行项目中剥离,含测试图片

记得把测试图片test_chessboard.jpg放在项目正确路径下,这样代码才能正常运行哦。大家如果在实践中有任何问题,欢迎留言交流。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐