Я делаю калибровку камеры, используя calibration.cpp образец предоставлен в выпуске OpenCV 3.4. Я использую простую шахматную доску 9×6 с длиной квадрата = 3,45 мм.
Команда для запуска кода:
Calib.exe -w=9 -h=6 -s=3.45 -o=camera.yml -oe imgList.xml
Я использую партию из 28 доступных изображений Вот
camera.yml (выход)
Вывод изображений из drawChessboardCorners: Вот
Есть 4 изображения без нарисованного наложения шахматной доски, findChessboardCorners не удалось для них.
Результаты выглядят странно (если я правильно их понимаю). Я принимаю значение фокусного расстояния как само собой разумеющееся, но основной момент, кажется, далеко с = (834, 1513). Я ожидал точку ближе к центру изображения в (1280, 960), так как ориентация камеры на видимую поверхность очень близка к 90 градусам.
Кроме того, если я помещаю объект в главную точку и перемещаю его по оси Z, я не должен видеть, что он движется вдоль x и y на изображении, это правильно?
Я подозреваю, что я должен добавить изображения с большим наклоном шахматной доски относительно камеры, чтобы получить лучшие результаты (угол z). Но у камеры очень узкая глубина резкости, и это предотвращает обнаружение углов шахматной доски.
Основная проблема, с которой вы столкнулись, заключается в том, что вы не предоставляете программному обеспечению камеры достаточно информации для правильной оценки различных параметров.
На всех 28 изображениях вы изменили только ориентацию шахматной доски вокруг оси z в одной плоскости. Вам не нужно делать столько фотографий, для меня около 15 — это нормально. Вам нужно добавить больше ddl
к вашим изображениям: измените расстояние шахматной доски от камеры и наклоните шахматную доску вокруг ее осей X и Y. Повторно откалибруйте камеру, и вы получите правильные параметры.
Это действительно зависит от камеры и объектива, который вы используете.
Более конкретно на такие вещи, как:
У некоторой дешевой веб-камеры с небольшим чипом даже может быть главное значение размера изображения (это означает, что это может быть и отрицательное число). Так что в вашем случае С может быть и — (834,1513) или (1513,834).
Если вы используете промышленную камеру или что-то подобное, С должно быть в пределах десятков процентов вокруг центра изображения -> например. (1280,960) + — 25%.
О проблеме с узкой степенью свободы (в двух словах) — чтобы сделать ее шире, необходимо получить как можно меньшую диафрагму, продлить экспозицию и добавить дополнительный свет позади камеры для компенсации апертуры.
Также вы можете перефокусироваться, чтобы получать резкие снимки с разных расстояний, только ваша точность снижается, поскольку перефокусировка слегка меняет фокусное расстояние. Но в большинстве случаев вам не нужна эта супер-сверхвысокая точность, так что это не должно быть проблемой.