Калибровка датчика

Здравствуйте.
Натолкните на мысль а то чувствую что я велосипед изобретаю.
В общем есть датчик с которого получаю координаты объекта в двумерной плоскости в своей системе координат.
Мне нужно откалибровать датчик так чтобы получить данные датчика соответствовали моей системе координат. И нужна модель чтобы в любой момент пересчитать любые показания датчика в новую систему.


Вот попытался изобразить. Надеюсь понятно.

Первое что приходит в голову это просто взять уравнение прямой и просто интерполировать каждую из осей но может быть есть нормальные человеческие методы для решения этой задачи??

Вы получаете две координаты - по оси абсцисс X (у Вас это прямая AB) и по оси ординат Y (прямая DC), а система координат Декарта ?

Тогда просто получайте разницу между центрами (точка в система координат 0,0) и прибавляйте (или вычитайте) разницу к полученным координатам X,Y - получите координаты в новой системе координат.

Если я правильно понял вопрос, конечно.

Со смещением понятно. А поворот не может быть еще в новой системе координат? А еще бывает растяжение-сжатие )

1 симпатия

Объект перемещается по круговой орбите вокруг своего центра в одной полуплоскости туда сюда.
И перемещение на плоскости не линейное это точно. Понятно что так проще но это не совсем точно и будет возникать погрешность.

Тогда нужно будет определять в каком квадрате находится точка и выбирать коэффициенты. ТАк то он да, но может есть какая нибудь модель с большим уравнением куда можно засунуть координаты и получить сразу результат.

какое движение - это абсолютно НЕ ВАЖНО.
синусоида в декартовой системе координат прекрасно отображается, несмотря на то, что она тоже не линейная.
Погрешность будет не более, что погрешность в исходной системе (зависит от точности/разрядности координат).

Только это всё справедливо для декартовой системы координат.
ну и важные аспекты отметил @Аватар

p.s. почему у Вас датчик вдруг стал одномерным (плоским)? он же ДВЕ координаты должен возвращать?

ну я 3д модель щас сходу не отрисую. с другой плоскости точно такая же ситуация.
Растяжений вроде тоже нигде нету. Меня смущает что при таком движении ближе к краям коэффициент смещения проекции на пиксель будет отличатся от того когда объект будет находится ближе к центру О

не переживайте.
Например, если шарик будет двигаться по перпендикуляру к плоскости датчика, то его координата на этом датчике вообще не будет меняться :wink:
для этого и нужна вторая плоскость.

а он не может двигаться перпендикулярно. у него свобода только движение по краю сферы.

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

Так что, не переживайте, если нет поворота и сжатия/разжатия и датчик выдаёт линейные координаты в декартовой системе, то банальной коррекции +/- для полученных координат будет достаточно.

Подробностей не хватает. Если датчик это ПЗСС - матрица а перед ним стоит линза. То нужно устранить перспективные искажения и аберрацию линзы.

Померьте в нескольких точках. А после сделайте аппроксимацию полиномом 3 степени или сплайном. Для 2-д соответственно с начало по одной координате потом по другой.

Ну … да … в идеале надо но искажения не настолько влияют на результат. Как никак качество оптики сейчас не самое плохое.

Интересный вариант

Ну … да … в идеале надо но искажения не настолько влияют на результат. Как никак качество оптики сейчас не самое плохое.

Линзы без аберраций изобрели в 2019 году, два года назад? У Вас супер передовые линзы?
Это так же называется геометрические искажения Линз.

Делал Я поиск решения положения камеры её фокуса. По координатным методом за 1 час находит все параметры камеры, включая перспективу, наклон и у первый коэффициент нелинейных искажений линзы.

На графике показан срез функционала, там куча локальных минимумомв.

Задача калибровки выяснить параметры камеры. У нас есть шахматная доска и есть камера.
Она снимает шахматную и на экране мы видим рисунок с некоторыми искажениями. на GIF центральные точки квадратов помечены кружком.

1)Параллельные прямые собираются в точку, а иногда и в три точки. Горизонтальные вертикальные и перпендикулярные каждые линии собираются в свою точку.
2)Квадраты становятся пухлыми округлыми. А плоская доска похожа на подушку или бочку.
3)А если присмотреться, то прямые линии становятся кривыми.

4)А если в кадр попадает девушка, то у ней моментально прибавляются килограммы.

5)Даже неподвижные объекты выглядывают друг из-за друга стараясь попасть в кадр.
6)Ах да и основное чуть не забыли центр доски не по центру кадра.

Задача калибровки устранить все эти искажения. Для чего нам надо разработать модель камеры.

Внешние параметры камеры. Это положение камеры в пространстве мира-сцены.
Положение камеры 3 параметра Cam.T=(x,y,z) и 3 угла Эйлера Cam.YPR=(Yaw,Pitch,Roll)
Еще не стоит забывать что у доски тоже самое.
Положение доски 3 параметра Board.T=(x,y,z) и 3 угла Эйлера Board.YPR=(Yaw,Pitch,Roll)

Они кодируют смещение точек на фото. А так же вращение относительно точки на экране.
Оставшиеся углы кодируют сжатие и растяжение по горизонтали и вертикали.

Внутренние параметры.
У камеры есть фокусное расстояние cam.D. Оно связано с углом обзора. И при этом создаёт перспективу.

Есть матрица камеры но она может быть установлена неровно относительно линзы.
Из за чего нарушается соотношение сторон пикселей. cam.Aspect (Выше было cam.a)

В потогонных трубах стоит пара линз которая должна скомпенсировать перспективное искажение.
Однако оптическая система линз не идеальна и создаёт геометрическое искажение по краям картинки более узкая, а по серёдке более. Будем называть это дисторсией линз.

Даже система из единичной линзой не идеальна и с фронтальной и тыльной стороны имеют разный радиус кривизны. Будем использовать приближение первого порядка.
Тут k- это коэффициент определяющий геометрические искажения линзы.

// Оператор геометрических искажений от линзы.
function L(x,k,r:Real):Real; Overload;
begin 
if ((1+k*r*r)=0) then result:=MaxInt else  result:=x/(1+k*r*r);
end;
function L(v:TPoint2DReal; k3:Real):TPoint2DReal; Overload;
var r:Real;
begin 
r:=Hypot(v.x,v.y); // расстояние от 0 до точки, Hypot точнее чем sqrt. Result.x:=L(v.x,k3,r);
 Result.y:=L(v.y,k3,r);
end;

Я понимаю что они не передовые но качество картинки устраивает. Это не рыбий глаз. Да и угол обзора тут маленький. Не тот уровень который прям требует сильных ухищрений с исправлением.

Про это в курсе. В OCV есть методика… когда то помнится она неплохо выручила но с ней столько плясок чтобы подобрать лучшее решение…

У меня больше задача сделать модель переноса системы координат. Дисторсией и перспективой можно на данном этапе пренебречь.

Тогда все просто у вас афинные преобразования. Измеряет кучу точек в двух системах координат. И находите матрицу перехода из одной СК в другую СК. Если измерений больше чем неизвестных то решаете через МНК.
P.X*A11 + P.Y*A12+P.Z*A13 +0*A21+ 0*A21 ... = N.X

0*A11 + 0*A12 + 0*A13+ P.X*A21 +P.Y*A22 ...= N.Y

Тут видно две новых матрицы A превращается в вектор столбц X а вектор P в матрицу M коэффициентов(наверно гомоморфная матрица). Вектор N остается вектором.

И находим псевдо обратную матрицу M^-1=M^+ по методу Мура — Пенроуза.

М^+=(M^T M)^-1 M^T

A[:]=X=NM^+

ого … спасибо. )))

А можно по подробнее?? Вот задача чуток видоизменилась.

Слева то что реально получает датчик. Справа то к чему нужно привести.
Как вы и сказали нужна матрица искажения и сдвига.
Не натолкнете на саму матрицу?? Или на метод как ее получить.

Тут вы вроде привели фрагмент, но как его использовать мне пока не понятно. Можете пояснить подробнее?

Вот в фотошопе вытягивание вот так выглядит:

И матрица будет вот такая:
image

Но это на глаз. А вот как получить точные значения коэффициентов матрицы ??

Набросал програмку.

Методом подбора подобрал коэффициенты a,b,c,d,e,f чтобы красная прямая выпрямилась.
Подскажите каким образом это можно все на автомате рассчитать??

Вам надо отметить точки в обоих системах координат Pi для старых Ni для новых сопоставить пары.
У нас есть матрица прехода из одной системы координат в другую A
Ni=A*Pi
Пусть A=
a11 a12
a21 a22

Такую систему где неизвестная матрица Вы искать не умете но умеете искать.
N=M*X
Где M- матрица с известными коэффициентами N вектор с известными коэффициентами.

Вот нам и нужно матрицу A преобразовать в вектор. Мы матрицу переводи в линейный вид и ищем её коэффициенты. Подставляете в систему уравнений не достающие коэффициенты заполняете как 0.
Получаем такую систему:

P1.X*A11 + P1.Y*A12 +0*A21+ 0*A21 = N1.X
0*A11 + 0*A12 + P1.X*A21 +P1.Y*A22 = N1.Y
P2.X*A11 + P2.Y*A12 +0*A21+ 0*A21 = N2.X
0*A11 + 0*A12 + P2.X*A21 +P2.Y*A22 = N2.Y

Pn.X*A11 + Pn.Y*A12 +0*A21+ 0*A21 = Nn.X
0*A11 + 0*A12 + Pn.X*A21 +Pn.Y*A22 = Nn.Y

Тут матричная система вида M*X=N
Откуда выписываем коэффициенты, вернее заполняем наши матрицы
матрица M равна
M=
P1.X P1.Y 0 0
0 0 P1.X P1.Y
P2.X P2.Y 0 0
0 0 P2.X P2.Y

Pn.X Pn.Y 0 0
0 0 Pn.X Pn.Y

X равна
X=
A11
A12
A21
A22

Или так
X=[A11 A12 A21 A22 ] ^T
N - равна
N=[N1.X N1.Y ... Nn.X Nn.Y] ^T

X - неизвестное его ищем так
M*X=N
Домножаем слева на M^-1
(M^-1)*M*X=(M^-1)*N
X=(M^-1)*N // Тут -1 это псевдо обратная
A11:=X[0]
A12:=X[1]
A21:=X[2]
A22:=X[3]

Спасибо. Вроде бы получилось. Для квадратной матрицы даже результаты сошлись.
А вот вопрос теперь как вычислить псевдообратную матрицу?? Может код какой есть?
Нашел про скелетное разложение но как то все поверхностно…

Опять не получается. Делал на ресурсе

Затем умножаю на столбец известных координат в новой системе

Потом проверяю но почему то не получаю того что ожидаю.
image

Что я сделал не так?