#c #opencv #interpolation
#c #opencv #интерполяция
Вопрос:
Я использую opencv с cpp.
У меня есть std::vector<std::pair<cv::Point2d, cv::Point2d> >
, который представляет деформацию. Для каждой точки изображения A я связываю точку изображения B. Я не знаю всей связи между точками изображения A и точками изображения B. Точки изображения A находятся на разреженной матрице. Эти данные также, вероятно, имеют ошибку epsilon. Поэтому я хотел бы интерполировать. В opencv я не нашел функции, которая выполняет просто интерполяцию. Как это сделать?
Я нашел функцию cv :: warpPoint, но я не знаю cv::Mat
ни внутренних параметров камеры, ни cv::Mat
матрицы поворота камеры. Как вычислить эти матрицы из моих данных?
Комментарии:
1. попробуйте
cv::getPerspectiveTransform
использовать пары точек в разделенных векторах, за которыми следует acv::warpPerspective
, если ваши деформации могут быть представлены перспективной гомографией.2. Мое изображение A искажено, поэтому это не простая перспектива.
3. Являются ли точки деформации разбросанными или регулярными?
Ответ №1:
Я думаю, что лучший способ — кусочно-аффинный деформатор:
https://code.google.com/p/imgwarp-opencv/
У меня есть своя быстрая реализация, но комментарии на русском языке, вы можете найти ее здесь.
Комментарии:
1. Спасибо за ответ. Я лучше понимаю редактирование. Но что вы хотите сказать с помощью шага 4?
2. Это та же идея, что и ваша первая?
3. Нет, это не та же идея. Я вспомнил проблему, с которой столкнулся, а затем реализовал метод деформации. Это было при сканировании так, что координаты точки назначения пикселей, которые вы получаете, не совпадали с координатами пикселей (целочисленные значения). Вот почему я реализовал обратную деформацию, когда вы устанавливаете значение пикселя назначения и получаете координаты исходного значения пикселя. В приведенной выше реализации я использовал барицентрическую интерполяцию (вот почему набор точек нуждается в триангуляции). В обычной сетке вы можете задать треугольники с помощью жесткого кодирования (не нужен триангулятор).
Ответ №2:
Итак, есть 2 вопроса:
-
как деформировать точки с одного изображения на другое. Попробуйте
cv::remap
сделать это, как только у вас будет плотное (интерполированное) описание. См. http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/remap/remap.html например. -
Как вычислить не заданные пары точек с помощью интерполяции. У меня нет решения для этого, но есть некоторые идеи:
- используйте не пары точек, а векторы смещения. смещение может быть проще для интерполяции.
- используйте обратную формулировку, чтобы получить плотное описание второго изображения (в противном случае может быть пиксель, который вообще не затронут
Но я думаю, что «реальным» методом для этого была бы какая-то интерполяция сплайнов.
Комментарии:
1. Я не понимаю ваших идей по интерполяции. вектор смещения получается: точечный двухточечный Ai? Какая формулировка?
2. У меня есть другая идея. Что вы думаете об этом? Я создаю cv::Mat, в котором каждая точка имеет в качестве значения свои координаты. Затем я сопоставляю это изображение с моей деформацией.
3. итак, ваше смещение — это именно то, каким было бы мое смещение. Я думал, что вы будете использовать «пары» в качестве элементов в своей матрице.
4. чтобы заполнить пустые элементы в разреженном мате, я видел метод: уменьшите масштаб вашего изображения вдвое, где значение пикселя является средним значением всех заданных значений в окрестности с более высоким разрешением. делайте это до тех пор, пока ваш mat не станет размером всего 1×1 пиксель. Затем снова увеличьте дискретизацию и заполните отверстия в вашем слое значением слоя с пониженной дискретизацией в этой позиции. Но я не знаю, приведет ли эта интерполяция к хорошим результатам здесь.