Я работаю с камерой типа «рыбий глаз», и перед дальнейшими вычислениями мне нужно обратить искажение,
В этом вопросе это происходит Исправление искажения типа «рыбий глаз»
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.
Спасибо
Я думаю, что вы хотите cv.UndistortPoints()
.
Предполагая, что вы обнаружили некоторые точечные объекты distorted
в вашем искаженном изображении вы должны сделать что-то вроде этого:
cv.UndistortPoints(distorted, undistorted, intrinsics, dist_coeffs)
Это позволит вам работать с неискаженными точками без создания нового неискаженного изображения для каждого кадра.
Других решений пока нет …