Цель калибровки камеры, чтобы найти внутренние и внешние параметры:Как получить доступ к векторам вращения и перевода после калибровки камеры в emgu CV?
- Присущих из них являются те, которые описывают сам (фокусное длины, искажение и т.д.) камеры я получаю значение для тех, нет проблема.
- Внешние параметры - это в основном положение камеры. Когда я пытаюсь получить доступ к этим, я получаю
AccessViolationException
.
Один из способов выполнить такую калибровку, чтобы
- принять изображение цели калибровки с известными углами
- найти эти углы в образе
- от соответствия между 3D и 2D точек , найдите матрицу, которая преобразует ее в другую
- , что матрица состоит из внутренних и внешних параметров.
Звонок в calibration function выглядит следующим образом:
Mat[] rotationVectors = new Mat[1];
Mat[] translationVectors = new Mat[1];
double error = CvInvoke.CalibrateCamera(realCorners,
detectedCorners,
calibrationImages[0].Image.Size,
cameraMatrix,
distortionCoefficients,
0,
new MCvTermCriteria(30, 0.1),
out rotationVectors,
out translationVectors);
Console.WriteLine(rotationVectors[0].Size); // AccessViolationException
- Я использую только одно изображение здесь, но у меня такая же проблема при использовании нескольких изображений (30) Различные калибровки изображения будут давать разные результаты для
translation
-/rotationVector
в любом случае, что заставляет меня сомневаться, что использование только одного изображения является проблемой. - Обнаружение точек работает и рисует их в исходное изображение, дает результаты разумной оценки.
- И
cameraMatrix
, иdistortionCoefficients
могут быть доступны и содержать значения. (Я пытался только опубликовать соответствующие части кода) - я использую emgu версии 3.0.0.2157
Почему я получаю AccessViolationException
на rotationVectors
и translationVectors
?
Я установил точку останова и обнаружил, что внутренняя собственность Data
равна null
. Смотрите скриншот VS отладчик:
Это объясняет, почему я не могу получить доступ к нему. Но почему это null
в первую очередь?
я написал свою собственную функцию, которая изменяет эти линии. Я действительно могу получить доступ к значениям. Они сильно отличаются от того, что я получаю от SolvePnP, но, по крайней мере, я могу получить к ним доступ. Благодаря! – null
@Bartosz Rachwal и null, извините за вопрос, но мой cvInoke.SolvePnP не хочу принимать Mat [] rotationVector, работает только с Emgu.CV.MatrixвращенияVector. Что я могу сделать, чтобы прочитать ротацию? Я надеюсь, что вы можете помочь мне –