Это похоже на проблему, подобную той, которая была у меня недавно, когда я пытался передать 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);