Обратное искажение «рыбий глаз»

Я работаю с камерой «рыбий глаз» и мне нужно изменить искажение перед дальнейшими вычислениями. В этом вопросе это происходит Исправление искажения «рыбий глаз»

src = cv.LoadImage(src)
dst = cv.CreateImage(cv.GetSize(src), src.depth, src.nChannels)
mapx = cv.CreateImage(cv.GetSize(src), cv.IPL_DEPTH_32F, 1)
mapy = cv.CreateImage(cv.GetSize(src), cv.IPL_DEPTH_32F, 1)
cv.InitUndistortMap(intrinsics, dist_coeffs, mapx, mapy)
cv.Remap(src, dst, mapx, mapy, cv.CV_INTER_LINEAR + cv.CV_WARP_FILL_OUTLIERS,  cv.ScalarAll(0))

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

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

В матрицах mapx и mapy есть какие-то поточечные переводы, но многие точки без полного перевода. Я попытался интерполировать эти матрицы, но результат был не тем, что я искал.

Любая помощь будет высоко оценена, даже другие подходы, которые более эффективны по времени, чем cv.Remap.

Спасибо


person Khashayar    schedule 31.07.2013    source источник
comment
Из вопроса неясно, хотите ли вы неискажать изображение или просто набор дискретных позиций изображения (возможно, не целых чисел, т.е. с субпиксельной точностью). Если второе, ожидается ли, что количество позиций pf будет намного меньше, чем площадь изображения? Просьба уточнить.   -  person Francesco Callari    schedule 01.08.2013
comment
@FrancescoCallari да, вы правы, мне просто нужно небольшое количество точек, в основном я хочу подобрать контуры, найду их центральную точку и захочу, чтобы это переместилось в неискаженное положение, а затем в положение с высоты птичьего полета.   -  person Khashayar    schedule 01.08.2013


Ответы (1)


Я думаю, вам нужно cv.UndistortPoints().

Предполагая, что вы обнаружили некоторые точечные объекты distorted в искаженном изображении, вы сможете сделать что-то вроде этого:

cv.UndistortPoints(distorted, undistorted, intrinsics, dist_coeffs)

Это позволит вам работать с неискаженными точками без создания нового неискаженного изображения для каждого кадра.

person Aurelius    schedule 31.07.2013
comment
Большое спасибо за это, я рассмотрел это. так что в основном, чтобы найти матрицу камеры и dist_coeffs, мне нужно проделать трюк с шахматной доской? Мы делаем что-то подобное, чтобы получить вид с высоты птичьего полета на входе! это тот же процесс? - person Khashayar; 01.08.2013
comment
@Khashayar Как вы получите свою камеру и параметры искажения, зависит от вас. Калибровка с шахматной доской - один из способов получить их. Поскольку вы разместили код, который их использует, я предположил, что у вас уже есть эти данные. - person Aurelius; 01.08.2013
comment
Довольно аккуратно. Спасибо за это. - person Selam Getachew; 14.07.2017