Emgu.CV Fisheye.Calibrate метод - PullRequest
       43

Emgu.CV Fisheye.Calibrate метод

0 голосов
/ 06 декабря 2018

В настоящее время я пытаюсь использовать метод Fisheye.Calibrate и метод Fisheye.UndistorImage из библиотеки Emgu.CV.Насколько я понял, метод Calibrate используется для вычисления матрицы камеры (K) и вектора искажения (D), которые должны использоваться, чтобы искажать изображения типа «рыбий глаз», используя метод UndistorImage.Однако, когда я использую эти два метода, результаты не убедительны.Это входное изображение, которое я тестирую: входное изображение «рыбий глаз» , и вот результат: выходное изображение «рыбий глаз» .

Когда я попытался взглянуть на значения K и D, посмотрев переменную данных объектов, он сказал 'null' для K и D. Поэтому я не уверен, что используюметод Calibrate () правильно.Мой код выглядит следующим образом:

private void EmguCVUndistortFisheye()
    {
        string[] fileNames = Directory.GetFiles(@"C:\Users\Test\Desktop\Jakob\ImageAnalysis\Images\Calibration", "*.png");
        Size patternSize = new Size(6, 8);
        VectorOfVectorOfPoint3D32F objPoints = new VectorOfVectorOfPoint3D32F();
        VectorOfVectorOfPointF imagePoints = new VectorOfVectorOfPointF();
        foreach (string file in fileNames)
        {
            Mat img = CvInvoke.Imread(file, ImreadModes.Grayscale);
            CvInvoke.Imshow("input", img);
            VectorOfPointF corners = new VectorOfPointF(patternSize.Width * patternSize.Height);
            bool find = CvInvoke.FindChessboardCorners(img, patternSize, corners);
            if (find)
            {
                MCvPoint3D32f[] points = new MCvPoint3D32f[patternSize.Width * patternSize.Height];
                int loopIndex = 0;
                for (int i = 0; i < patternSize.Height; i++)
                {
                    for (int j = 0; j < patternSize.Width; j++)
                        points[loopIndex++] = new MCvPoint3D32f(j, i, 0);
                }
                objPoints.Push(new VectorOfPoint3D32F(points));
                imagePoints.Push(corners);
            }
        }
        Size imageSize = new Size(1280, 1024);
        Mat K = new Mat();
        Mat D = new Mat();
        Mat rotation = new Mat();
        Mat translation = new Mat();
        Fisheye.Calibrate(
            objPoints,
            imagePoints,
            imageSize,
            K,
            D,
            rotation,
            translation,
            Fisheye.CalibrationFlag.CheckCond,
            new MCvTermCriteria(30, 0.1)
        );

        foreach (string file in fileNames)
        {
            Mat img = CvInvoke.Imread(file, ImreadModes.Grayscale);
            Mat output = img.Clone();
            Fisheye.UndistorImage(img, output, K, D);
            CvInvoke.Imshow("output", output);
        }
    }

Является ли причина моих странных результатов следствием неправильных параметров в методе калибровки или это просто случай не использования достаточного количества входных изображений?

1 Ответ

0 голосов
/ 26 декабря 2018

Это похоже на проблему, подобную той, которая была у меня недавно, когда я пытался передать Mat в функцию калибровки, когда ей требовалось Matrix, и, как вы обнаружили, она просто не работает, не сообщая об ошибках.Я думаю, вам понадобится следующее:

var K = new Matrix<double>(3, 3);
var D = new Matrix<double>(4, 1);

Также обратите внимание, что если вы хотите получить векторы поворота и перемещения, передавая Mat, это хорошо, но вы, вероятно, захотите преобразовать обратно вMatrix если вы хотите выполнить вычисления на них.Я просто использовал обычную калибровку камеры, а не «рыбий глаз», но следующий фрагмент кода может быть полезен для понимания:

var cameraMatrix = new Matrix<double>(3, 3);
var distortionCoeffs = new Matrix<double>(4, 1);
var termCriteria = new MCvTermCriteria(30, 0.1);
System.Drawing.PointF[][] imagePoints = imagePointsList.Select(p => p.ToArray()).ToArray();
MCvPoint3D32f[][] worldPoints = worldPointsList.Select(p => p.ToArray()).ToArray();
double error = CvInvoke.CalibrateCamera(worldPoints, imagePoints, imageSize, cameraMatrix, distortionCoeffs, CalibType.RationalModel, termCriteria, out Mat[] rotationVectors, out Mat[] translationVectors);
var rotation = new Matrix<double>(rotationVectors[0].Rows, rotationVectors[0].Cols, rotationVectors[0].DataPointer);
var translation = new Matrix<double>(translationVectors[0].Rows, translationVectors[0].Cols, translationVectors[0].DataPointer);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...