Я пытаюсь уменьшить распространение объектива камеры с помощью OpenCV на C#. Вывод изображения из моего кода, похоже, не приводит к каким-либо ощутимым изменениям.
Вот входное изображение, за которым следует выходное изображение с нарисованным на нем рисунком шахматной доски для отладки:
Выходное изображение все еще сильно искажено, а линии узора шахматной доски все еще изогнуты.
Вот мой код (некоторые шаги удалены/закомментированы):
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);
Есть ли у кого-нибудь предложения по успешному устранению искажений исходного изображения?
Я пытаюсь уменьшить распространение объектива камеры с помощью OpenCV на C#. Вывод изображения из моего кода, похоже, не приводит к каким-либо ощутимым изменениям. Вот входное изображение, за которым следует выходное изображение с нарисованным на нем рисунком шахматной доски для отладки: [img]https://i.sstatic.net/VCCMx9It.png[/img] [img]https://i.sstatic.net/O9JBsi18.png[/img]
Выходное изображение все еще сильно искажено, а линии узора шахматной доски все еще изогнуты. Вот мой код (некоторые шаги удалены/закомментированы): [code]using OpenCvSharp;
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();
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);
using var undistorted = new Mat(); Cv2.Undistort(frame, undistorted, cameraMatrix, distCoeffs, cameraMatrix);
//using var cropped = new Mat(undistorted, roi); Cv2.ImWrite(outputPath, frame); [/code] Есть ли у кого-нибудь предложения по успешному устранению искажений исходного изображения?