Вот входное изображение, за которым следует выходное изображение с нарисованным на нем рисунком шахматной доски для отладки:


Выходное изображение все еще сильно искажено, а линии узора шахматной доски все еще изогнуты.
Вот мой код (некоторые шаги удалены/закомментированы):
Код: Выделить всё
using OpenCvSharp;
const string assetPath = @"D:\MG-ES\OpenCvFiddle\OpenCvFiddle\Assets\";
const string imageFile = "bottom_left_sample.png";
var inputPath = Path.Combine(assetPath, imageFile);
var outputPath = Path.Combine(assetPath, Path.GetFileNameWithoutExtension(imageFile) + "_undistorted.png");
if (!File.Exists(inputPath)) throw new FileNotFoundException(nameof(inputPath));
using var frame = Cv2.ImRead(inputPath, ImreadModes.Color);
var patternSize = new Size(9, 6);
var objp = new List();
for (var y = 0; y < patternSize.Height; y++)
{
for (var x = 0; x < patternSize.Width; x++)
{
objp.Add(new Point3f(x, y, 0));
}
}
var objectPoints = new List();
var imagePoints = new List();
using var gray = new Mat();
Cv2.CvtColor(frame, gray, ColorConversionCodes.BGR2GRAY);
var criteria = new TermCriteria(CriteriaTypes.Eps | CriteriaTypes.MaxIter, 30, 0.001);
if (!Cv2.FindChessboardCorners(gray, patternSize, out var corners))
{
throw new Exception("No chessboard pattern found in the image.");
}
//Cv2.CornerSubPix(gray, corners, new Size(11, 11), new Size(-1, -1), criteria);
objectPoints.Add(Mat.FromArray(objp));
imagePoints.Add(Mat.FromArray(corners));
var cameraMatrix = new Mat();
var distCoeffs = new Mat();
var imageSize = frame.Size();
Cv2.CalibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix, distCoeffs, out _, out _);
//var newCameraMatrix = Cv2.GetOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, 1, imageSize, out var roi);
Cv2.DrawChessboardCorners(frame, patternSize, corners, true);
using var undistorted = new Mat();
Cv2.Undistort(frame, undistorted, cameraMatrix, distCoeffs, cameraMatrix);
//using var cropped = new Mat(undistorted, roi);
Cv2.ImWrite(outputPath, frame);
Подробнее здесь: https://stackoverflow.com/questions/798 ... rd-pattern