Деформация интерполяции

#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 использовать пары точек в разделенных векторах, за которыми следует a cv::warpPerspective , если ваши деформации могут быть представлены перспективной гомографией.

2. Мое изображение A искажено, поэтому это не простая перспектива.

3. Являются ли точки деформации разбросанными или регулярными?

Ответ №1:

Я думаю, что лучший способ — кусочно-аффинный деформатор:

https://code.google.com/p/imgwarp-opencv/

У меня есть своя быстрая реализация, но комментарии на русском языке, вы можете найти ее здесь.

Комментарии:

1. Спасибо за ответ. Я лучше понимаю редактирование. Но что вы хотите сказать с помощью шага 4?

2. Это та же идея, что и ваша первая?

3. Нет, это не та же идея. Я вспомнил проблему, с которой столкнулся, а затем реализовал метод деформации. Это было при сканировании так, что координаты точки назначения пикселей, которые вы получаете, не совпадали с координатами пикселей (целочисленные значения). Вот почему я реализовал обратную деформацию, когда вы устанавливаете значение пикселя назначения и получаете координаты исходного значения пикселя. В приведенной выше реализации я использовал барицентрическую интерполяцию (вот почему набор точек нуждается в триангуляции). В обычной сетке вы можете задать треугольники с помощью жесткого кодирования (не нужен триангулятор).

Ответ №2:

Итак, есть 2 вопроса:

  1. как деформировать точки с одного изображения на другое. Попробуйте cv::remap сделать это, как только у вас будет плотное (интерполированное) описание. См. http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/remap/remap.html например.

  2. Как вычислить не заданные пары точек с помощью интерполяции. У меня нет решения для этого, но есть некоторые идеи:

    • используйте не пары точек, а векторы смещения. смещение может быть проще для интерполяции.
    • используйте обратную формулировку, чтобы получить плотное описание второго изображения (в противном случае может быть пиксель, который вообще не затронут

Но я думаю, что «реальным» методом для этого была бы какая-то интерполяция сплайнов.

Комментарии:

1. Я не понимаю ваших идей по интерполяции. вектор смещения получается: точечный двухточечный Ai? Какая формулировка?

2. У меня есть другая идея. Что вы думаете об этом? Я создаю cv::Mat, в котором каждая точка имеет в качестве значения свои координаты. Затем я сопоставляю это изображение с моей деформацией.

3. итак, ваше смещение — это именно то, каким было бы мое смещение. Я думал, что вы будете использовать «пары» в качестве элементов в своей матрице.

4. чтобы заполнить пустые элементы в разреженном мате, я видел метод: уменьшите масштаб вашего изображения вдвое, где значение пикселя является средним значением всех заданных значений в окрестности с более высоким разрешением. делайте это до тех пор, пока ваш mat не станет размером всего 1×1 пиксель. Затем снова увеличьте дискретизацию и заполните отверстия в вашем слое значением слоя с пониженной дискретизацией в этой позиции. Но я не знаю, приведет ли эта интерполяция к хорошим результатам здесь.