Почнемо з моделі камери.
Image plane - ПЗС матриця камери;
Pinhole plane - площина тонкої лінзи;
X - спостережувана точка;
f - фокусна відстань;
Optical axis - головна оптична вісь.
Якщо хто пам'ятає шкільний курс геометричної оптики, рівняння перспективної проекції виглядає так:
Тепер врахуємо той факт, що зазвичай головна оптична вісь не проходить через точку ПЗС матриці з координатами (0, 0).
Тут c - координата точки перетину головної оптичної віссю ПЗС матриці.
Запишемо дані рівняння для координат X і Y, з огляду на факт, що через технологічну похибки виготовлення матриці пікселі мають злегка прямокутну форму.
su і sv - коефіцієнти форми пікселя.
Запишемо рівняння перспективної проекції в матричному вигляді, щоб з ними було зручніше працювати. Та й OpenCV дружить в основному з матрицями.
- координати точки у зовнішній системі координат
- координати проекції точки
- матричне рівняння перспективної проекції
Тепер врахуємо факт, що лінзу не обов'язково тонка, і вона вносить спотворення в зображення.
Даний вид спотворення називається радіальним. Він враховується в такий спосіб:
Тут r - відстань від точки перетину головної оптичної віссю ПЗС матриці до точки проекції; k1, k2 - коефіцієнти радіального спотворення.
Тепер матричне рівняння перспективної проекції має вигляд:
Крім радіального спотворення існує ще тангенціальне. Воно виникає через те, що площина ПЗС матриці не перпендикулярна головної оптичної осі. Його в моделі я враховувати не буду: воно дуже мало. OpenCV визначає і коефіцієнти тангенціального спотворення.
При установці камери теж з'являються похибки - врахуємо в моделі і їх.
Результуюча матриця обертання камери навколо необхідної системи координат:
Вектор зміщення камери щодо необхідної системи координат:
Тепер модель камери з урахуванням радіального спотворення і похибок установки виглядає так:
Перейдемо до однорідних координатах:
Тут Rij - відповідні компоненти результуючої матриці обертання камери навколо необхідної системи координат.
tx, ty, tz - компоненти вектора зміщення камери щодо необхідної системи координат.
Ось ми і отримали модель камери.
У неї входять внутрішні параметри:
fu, fv - фокусні відстані
cu, cv - положення оптичного центру
Зовнішні параметри: 3 кута Ейлера, 3 компонента вектора трансляції.
А тепер перейдемо до визначення цих параметрів на OpenCV, тобто до калібрування камери.
Сам принцип калібрування дуже простий - ми спостерігаємо декілька зображень шахівниці, розпізнаємо її кути. І знаючи як в дійсності розташовані кути шахівниці, чисельно підбираємо параметри камери. OpenCV має набір вбудованих засобів для підтримки такої моделі калібрування. Я буду використовувати інтерфейси OpenCV на C ++.