2014-09-19 3 views
1

Я модифицировал алгоритм для rectif. Он возвращает мне 2 гомографии Opencv (матрицы 3x3). Я могу использовать cv :: warpPerspective и получать исправленные изображения. Таким образом, алгоритм работает правильно. Но мне нужно применить эту гомологию к текстурам в OpenGl. Поэтому я создаю матрицу 4x4 (HomoGl), и я используюГомография Opencv применяется в Opengl

glMultMatrixf(HomoGl); 

, чтобы применить этот Tranform. Для заполнения HomoGl я использую

for(int i=0;i<3;++i){ 
    for(int j=0; j<3;++j){ 
     HomoGL[i+j*4] = HomoCV.at<double>(i,j); 
    } 
} 

Этот метод имеет лучший результат ... но это неправильно. Я тестирую некоторые другие методы [1], но они не работают.

Мой вопрос: как преобразовать гомологию OpenCV, поэтому я могу использовать glMultMatrixf для правильного преобразования изображений.

[1] http://www.aiqus.com/questions/24699/from-2d-homography-of-2-planes-to-3d-rotation-of-opengl-camera

ответ

0

Так H матрица является преобразование 1 точки на плоскости одной в другую точку на плоскости 2.

X1 = H*X2 

При использовании warpHomography в OpenCV вы ставите точки в восприятии плоскости 2.

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

+0

Спасибо. Очевидная идея работает хорошо;). – ilt

+0

@ilt Ха-ха! здорово. Не забудьте установить флажок (под стрелкой вверх), если это то, что вы искали :) – Jay

0

Ваше расширение гомографии 3x3 на 4x4 неверно. Самый простой подход, который будет несколько работы будет продолжением формы

 h11 h12 h13    h11 h12 0 h13 
H = h21 h22 h23 -> H' = h21 h22 0 h23 
    h31 h32 h32    0 0 1 0 
          h31 h32 0 h33  

Проблема с этим подходом является то, что в то время как он дает правильный результат для x и y, это приведет к искажению z, так как модифицированное Компонент w влияет на все координаты. Если координата z имеет значение, вам нужен другой подход.

В this paper предложено приближение, которое минимизирует влияние на глубину (см. Уравнение 5, вам также необходимо будет нормализовать вашу гомографию, чтобы h33=1). Однако это приближение будет достаточно хорошо работать для небольших искажений. Если у вас есть какое-то экстремальное трапециевидное искажение, это утверждение также потерпит неудачу. В этом случае возможен двухпроходный подход к рендерингу в текстуру и применение 2D-искажения.

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

+0

У вас есть какой-либо пример кода для подхода шейдеров? – aledalgrande