ОБНОВЛЕНИЕ СТАТУСА BOUNTY:
Я обнаружил, как сопоставить линейный объектив, от destination
координат до координат source
.
Как вы вычисляете радиальное расстояние от центра до перехода от рыбий глаз к прямолинейному?
-
1). Я действительно пытаюсь перевернуть его и сопоставить исходные координаты с координатами назначения. Что такое обратное, в коде в стиле преобразованных функций, которые я разместил?
-
2). Я также вижу, что мое искажение несовершенно на некоторых объективах - предположительно те, которые не являются строго линейными. Какова эквивалентность координат источника и места назначения для этих линз? Опять же, больше кода, чем просто математические формулы, пожалуйста...
Вопрос, как изначально указано:
У меня есть некоторые моменты, которые описывают позиции на снимке, сделанном с линзой с рыбий глаз.
Я хочу преобразовать эти точки в прямолинейные координаты. Я хочу исказить изображение.
Я нашел это описание о том, как создать эффект рыбий глаз, но не как его перевернуть.
Также есть сообщение в блоге, в котором описывается, как использовать инструменты для этого; эти снимки:
(1): source
Исходная ссылка на фото
Вход: Исходное изображение с искажением рыбьего глаза для исправления.
(2): destination
Исходная ссылка на фото
Выход: Исправленное изображение (технически также с коррекцией перспективы, но это отдельный шаг).
Как вы рассчитываете радиальное расстояние от центра, чтобы перейти от рыбий глаз к прямолинейному?
Моя заглушка выглядит следующим образом:
Point correct_fisheye(const Point& p,const Size& img) {
// to polar
const Point centre = {img.width/2,img.height/2};
const Point rel = {p.x-centre.x,p.y-centre.y};
const double theta = atan2(rel.y,rel.x);
double R = sqrt((rel.x*rel.x)+(rel.y*rel.y));
// fisheye undistortion in here please
//... change R ...
// back to rectangular
const Point ret = Point(centre.x+R*cos(theta),centre.y+R*sin(theta));
fprintf(stderr,"(%d,%d) in (%d,%d) = %f,%f = (%d,%d)\n",p.x,p.y,img.width,img.height,theta,R,ret.x,ret.y);
return ret;
}
В качестве альтернативы я мог каким-то образом преобразовать изображение из рыбий глаз в прямолинейное, прежде чем найти точки, но я полностью одурачен документация OpenCV, Есть ли простой способ сделать это в OpenCV, и он достаточно хорошо работает, чтобы сделать это с живой видео-лентой?