Калибровка камеры

Калибровка камеры

Сообщение =DeaD= » 10 июл 2006, 20:20

Зачем нужна калибровка камеры?

Затем, что камера не является идеальный оптическим прибором, тем более для целей технического зрения, поэтому снятое изображение требуется сначала исправить в смысле простейших оптических искажений, прежде чем его можно будет использовать для сложных алгоритмов вроде стереозрения или motion-flow.

Далее под калибровкой камеры будем понимать определение параметров элементарных оптических искажений.

К этим параметрам относятся:
1. Фокусные расстояния по обеим координатам (fx,fy);
2. Главная точка [оптический центр] (cx,cy);
3. Коэффициенты дисторсии (k1,k2,p1,p2);

Как использовать полученные при калибровке параметры?

float _intrinsic_matrix[9];
_intrinsic_matrix[1]=0;
_intrinsic_matrix[3]=0;
_intrinsic_matrix[6]=0;
_intrinsic_matrix[7]=0;
_intrinsic_matrix[8]=1;
_intrinsic_matrix[0]=fx; // (focus_lenX)
_intrinsic_matrix[2]=cx; // (PrincipalX)
_intrinsic_matrix[4]=fy; // (focus_lenY)
_intrinsic_matrix[5]=cy; // (PrincipalY)
CvMat intrinsic_matrix=cvMat(3,3,CV_32FC1,_intrinsic_matrix);

float _distortion_coeffs[4];
_distortion_coeffs[0]=k1; // (Dist1)
_distortion_coeffs[1]=k2; // (Dist2)
_distortion_coeffs[2]=p1; // (Dist3)
_distortion_coeffs[3]=p2; // (Dist4)
CvMat distortion_coeffs=cvMat(4,1,CV_32FC1,_distortion_coeffs);

cvUndistort2(source,destination,&intrinsic_matrix,&distortion_coeffs);

ВНИМАНИЕ!!! ^^^ Это имеет смысл, если исправлять картинку один раз. Если нужно с одними и теми же параметрами обрабатывать много кадров подряд - лучше сгенерировать векторную карту для исправления дисторсии функцией InitUndistortMap и потом значительно быстрее исправлять дисторсии с помощью применения этой карты функцией cvRemap к изображениям.

Как калибровать камеру?

Пока у меня получилось сделать это просто подобрав параметры с помощью 4 трекбаров и простейшего приложения. Если подскажете нормальный способ или почему не работает описанный ниже теоретически-правильный способ - буду рад.

Получившиеся "практические" параметры моего экземпляра камеры Genius Slim 320:
Фокусные и главную точку определил вручную:
1. Фокусные расстояния по обеим координатам (fx=950,fy=950);
2. Главная точка [оптический центр] (cx=320,cy=240);

Дисторсии подобрал:
3. Коэффициенты дисторсии (k1=-3/20,k2=0,p1=-2/150,p2=0);
Последний раз редактировалось =DeaD= 12 июл 2006, 22:27, всего редактировалось 10 раз(а).
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Сообщение =DeaD= » 11 июл 2006, 21:43

Как по "теории" правильно откалибровать камеру
ВНИМАНИЕ!!! Сразу скажу что традиционным путем калибровки у меня получился полный бред, то есть система параметры рассчитала, но на выходе из них получается такая бочка, которой даже близко не было на исходном изображении. Если кто подскажет в чем засада - буду рад.

Кроме самого железа с установленными драйверами нам понадобятся:

1. Пакет для калибровки камеры:
http://research.graphicon.ru/calibratio ... box-3.html
(требует MS .NET Framework 1.1, найдите в сети или у себя в дистрибутивах)

2. Рекомендации, как делать тестовые снимки для калибровки камеры:
http://research.graphicon.ru/calibratio ... tos-2.html

3. Картинка для калибровки камеры.
http://www.kloss.ru/cvision/pattern.zip (2.6Kb)
В формате MS-Word 2003 (.doc), формата А4.
Поле 6х5, размер клетки - 30мм.

Порядок действий:

1. Печатаем картинку для калибровки (см. выше);
2. Читаем рекомендации (см. выше);
3. Снимаем по этим рекомендациям серию фоток калибруемой камерой;
4. Ставим программу калибровки (см. выше);
5. Загружаем их в программу калибровки и проводим рассчет.

Получившиеся "теоретические" параметры моего экземпляра камеры Genius Slim 320:

(сохранен проект калибровки и из получившегося .xml-файла вырезан кусок)

<results>
 <ImageCount>33</ImageCount>
 <focus_lenX>913.2387861975642</focus_lenX>
 <focus_lenY>952.611267402613</focus_lenY>
 <PrincipalX>302.817225986546</PrincipalX>
 <PrincipalY>253.24848880824442</PrincipalY>
 <Dist1>0.0278205532909052</Dist1>
 <Dist2>-0.20040411308884268</Dist2>
 <Dist3>-0.057025346228840042</Dist3>
 <Dist4>-0.0018288932226029845</Dist4>
 <focus_lenX_er>19.880834923907976</focus_lenX_er>
 <focus_lenY_er>16.94893132668567</focus_lenY_er>
 <PrincipalX_er>12.298625056296132</PrincipalX_er>
 <PrincipalY_er>28.45180821972664</PrincipalY_er>
 <Dist1_er>0.017808106390967002</Dist1_er>
 <Dist2_er>0.070249236050039229</Dist2_er>
 <Dist3_er>0.0029616869284901743</Dist3_er>
 <Dist4_er>0.0038711908619994554</Dist4_er>
 <dc_AllImage_errX>0.13525676761559682</dc_AllImage_errX>
 <dc_AllImage_errY>0.21908445255907849</dc_AllImage_errY>
 <Calib_Date>11.07.2006 23:02:25</Calib_Date>
 <Calib_Type>1</Calib_Type>
</results>
Последний раз редактировалось =DeaD= 12 июл 2006, 22:21, всего редактировалось 3 раз(а).
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Сообщение GraphD » 12 июл 2006, 16:28

=DeaD= писал(а):Получившиеся параметры моего экземпляра камеры Genius Slim 320:
...skip...

А данные для убирания бочки он генерит?
GraphD
 
Сообщения: 157
Зарегистрирован: 01 окт 2005, 00:56
Откуда: С.-Петербург

Сообщение =DeaD= » 12 июл 2006, 21:54

GraphD писал(а):А данные для убирания бочки он генерит?

Короче если бочка равносильная вверх/вниз, то за это отвечают коэффициенты k1 и k2, причем первый это первого порядка, а второй - второго. Если бочка с перекосом вверх/низ, то это p1, а если бочка влево/вправо с перекосом, то это p2 :)

Но см. выше по поводу параметров которые оно генерит - какие-то они странные, мне оказалось проще подобрать самому.
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Сообщение Сергей Мальцев » 02 авг 2006, 11:04

=DeaD= писал(а):
GraphD писал(а):А данные для убирания бочки он генерит?

Короче если бочка равносильная вверх/вниз, то за это отвечают коэффициенты k1 и k2, причем первый это первого порядка, а второй - второго. Если бочка с перекосом вверх/низ, то это p1, а если бочка влево/вправо с перекосом, то это p2 :)

Но см. выше по поводу параметров которые оно генерит - какие-то они странные, мне оказалось проще подобрать самому.


В OpenCV тоже есть чего-то для калибровки, почему ею не пользуешься?
Сергей Мальцев
 
Сообщения: 106
Зарегистрирован: 07 мар 2006, 16:14
Откуда: Москва

Сообщение =DeaD= » 02 авг 2006, 16:54

Сергей Мальцев писал(а):В OpenCV тоже есть чего-то для калибровки, почему ею не пользуешься?

А ты попробуй! :)

Это типа - у тебя же в гараже колеса валялись и двигатель, зачем машину купил?
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Сообщение Сергей Мальцев » 03 авг 2006, 12:56

=DeaD= писал(а):
Сергей Мальцев писал(а):В OpenCV тоже есть чего-то для калибровки, почему ею не пользуешься?

А ты попробуй! :)

Это типа - у тебя же в гараже колеса валялись и двигатель, зачем машину купил?


Что такое сложное у них использование? Я сам эти функции еще не смотрел особо, поэтому не знаю.
Сергей Мальцев
 
Сообщения: 106
Зарегистрирован: 07 мар 2006, 16:14
Откуда: Москва

Сообщение =DeaD= » 03 авг 2006, 17:13

Сергей Мальцев писал(а):Что такое сложное у них использование? Я сам эти функции еще не смотрел особо, поэтому не знаю.

Я же говорю - наличие колес и двигателя не обеспечивает перемещение из точки А в точку Б, надо еще массу всего сделать... :)
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов


Вернуться в Железо

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6