Невозможно неискажать изображение с помощью шахматной доски.C#

Место общения программистов C#
Ответить
Anonymous
 Невозможно неискажать изображение с помощью шахматной доски.

Сообщение Anonymous »

Я пытаюсь уменьшить распространение объектива камеры с помощью 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);
Есть ли у кого-нибудь предложения по успешному устранению искажений исходного изображения?


Подробнее здесь: https://stackoverflow.com/questions/798 ... rd-pattern
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»