Конвертировать видео рыбий глаз в обычное видео - PullRequest
1 голос
/ 14 марта 2019

У меня есть видеопоток, поступающий с 180-градусной камеры «рыбий глаз». Я хочу выполнить некоторую обработку изображений, чтобы преобразовать изображение «рыбий глаз» в обычный вид.

После некоторых исследований и множества прочитанных статей я нашел эту статью .

Они описывают алгоритм (и некоторые формулы) для решения этой проблемы.

Я пытался реализовать этот метод в Matlab. К сожалению, это не работает, и я не смог заставить его работать. «Исправленное» изображение выглядит точно так же, как исходная фотография, и при этом не происходит никакого искажения, и во-вторых, я просто получаю верхнюю левую сторону изображения, а не полное изображение, но изменение значения «K» на 1,9 дает mw всего изображения , но это точно такое же изображение.

Исходное изображение:

Input Image

Результат:

Когда значение K составляет 1,15, как указано в статье

Когда значение K составляет 1,9

Вот мой код:

image = imread('image2.png');
[Cx, Cy, channel] = size(image);

k = 1.5;
f = (Cx * Cy)/3;
opw = fix(f * tan(asin(sin(atan((Cx/2)/f)) * k)));
oph = fix(f * tan(asin(sin(atan((Cy/2)/f)) * k)));
image_new  = zeros(opw, oph,channel);

for i = 1: opw    
    for j = 1: oph        
        [theta,rho] = cart2pol(i,j);        
        R = f * tan(asin(sin(atan(rho/f)) * k));        
        r = f * tan(asin(sin(atan(R/f))/k));        
        X = ceil(r * cos(theta));        
        Y = ceil(r * sin(theta));

        for k = 1: 3            
            image_new(i,j,k) = image(X,Y,k);            
        end
    end
end

image_new = uint8(image_new);
warning('off', 'Images:initSize:adjustingMag');
imshow(image_new);

1 Ответ

0 голосов
/ 22 марта 2019

Вот что решило мою проблему.

вход: сила с плавающей точкой> = 0. 0 = без изменений, большие числа равны более сильной коррекции. масштабирование с плавающей точкой> = 1. (1 = без изменения увеличения)

алгоритм:

set halfWidth = imageWidth / 2
set halfHeight = imageHeight / 2

if strength = 0 then strength = 0.00001
set correctionRadius = squareroot(imageWidth ^ 2 + imageHeight ^ 2) / strength

for each pixel (x,y) in destinationImage
    set newX = x - halfWidth
    set newY = y - halfHeight

    set distance = squareroot(newX ^ 2 + newY ^ 2)
    set r = distance / correctionRadius

    if r = 0 then
        set theta = 1
    else
        set theta = arctangent(r) / r

    set sourceX = halfWidth + theta * newX * zoom
    set sourceY = halfHeight + theta * newY * zoom

    set color of pixel (x, y) to color of source image pixel at (sourceX, sourceY)
...