2014-08-27 4 views
1

У меня проблема с геометрическим деформированием, в основном деформируя изображение в перспективе сверху вниз. Без использования очков.Геометрическое деформирование с черным изображением

Что у меня есть:

  1. У меня есть изображение, глядя на 45deg угла (т.е.) F является расположение моей камеры, направленным вниз enter image description here

  2. This бумаги на то, что я хотеть сделать. Page 2 имеет основную формулу

  3. Основная функция используется в OpenCV cv::warpPerspective для активного этого искривленного изображения
  4. У меня есть необходимый Ccam1_cam2 roation (предполагая, что моя математика правильно)

Что я сделал:

  1. Я создал матрицу H, используя формулу из бумаги.
  2. Протестировано, если не было перевода только с поворотом i.e H=R, если бы это сделало искаженное изображение более качественным.
  3. Посмотрел на мои значения x, y из искаженного изображения и заметил, что они < 1, что плохо, потому что они должны быть в диапазоне 400x530, что является исходным изображением.

    Код:

    cv::Mat hmatrix = (cv::Mat_<double>(3,3) << H.c11, H.c12, H.c13, 
             H.c21, H.c22, H.c23, 
             H.c31, H.c32, H.c33); 
    lfImg = cv::imread("undistortedsmall.bmp", 0); 
    imshow("not warped image", lfImg); 
    cv::waitKey(0); 
    cv::Mat warpedimg; 
    cv::Scalar borderValue; 
    cv::warpPerspective(lfImg, warpedimg, hmatrix ,lfImg.size(),cv::INTER_LINEAR,cv::BORDER_CONSTANT,borderValue); 
    
    imshow("warpedImage", warpedimg); 
    
  4. Я взял очки из сверху вниз изображения с соответствующими точками из моего 45deg изображения и генерируется матрица H, что деформирует хорошо. Просто посмотрим, как может выглядеть матрица H. Но масштаб совершенно другой.

пример:

My generated H Matrix: 
     0.240053 0.859119 -0.451983 
     0.689905 -0.478534 -0.543171 
     -0.682938 -0.181435 -0.707585 

pt generated H matrix 
    0.894764 3.37653 77.6052 
    -0.950235 2.02846 240.977 
    -8.73899e-05 0.00384326 1 

Что я хочу:

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

Проблема Черного экрана (если я масштабировать матрицу мои кратные позволяет сказать * 100) я получаю неправильное коробление, но по крайней мере что-то видимые

ответ

0

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

Это не указано в документе, который вы предоставили, что означает, что они работают с так называемой «нормализованной» или «некалиброванной» гомографией. Когда вы создаете гомографию из точек соответствия, вы получаете «откалиброванную» гомографию и получаете ожидаемые результаты.

Рассмотрите раздел Уравнение плоскости плоскости к плоскостиhere. Как видим, R-(t * n^t)/d предварительно умножается матрицей Ka и после умножается на Kb^-1 (инвертированная внутренняя матрица инвертированной второй камеры), чтобы произвести «откалиброванную» гомографию. Если оба изображения взяты с одной камерой, вы можете предположить Ka = Kb.

Итак, для получения «откалиброванной» гомографии вы можете использовать выражение Hc = K * H * K^-1, где Hc - калиброванная гомография, H - некалиброванная гомография, а K - калибровочная матрица.

Теперь вам нужно extimate K. В идеале вы должны выполнить калибровку камеры для того, чтобы получить его, но если вы знаете, фокусное расстояние камеры вы можете использовать несколько грубое приближение следующим образом:

| f, 0, cx | 
K = | 0, f, cy | 
    | 0, 0, 1 | 

где е (cx, cy) - координаты главной точки (вы можете использовать (w/2, h/2), где w и h - ширина и высота изображения в пикселях)