Проецирование изображения на цилиндрическую поверхность таким образом, чтобы изображение казалось плоским - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь распечатать QR-коды на поверхности бутылок с водой, используя Matlab. Однако QR-бутылки не могут быть распознаны из-за изогнутой поверхности bottle и, следовательно, деформированной формы QR-кодов.

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Итак, я попытался подойти к своей проблеме, используя изображение basi c "car.jpg", включенное в Matlab.

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

Вот мой код:

close all, clf, clear all
%% Creating cylinder
r = 6;    %centimeter
h = 25;     %centimeter

[X,Y,Z] = cylinder(r,100);
x = X(:,1:ceil(length(X)/3));
y = Y(:,1:ceil(length(Y)/3));
z = Z(:,1:ceil(length(Z)/3));

%% Plotting cylinder surface
figure(1), clf
h = surf(x,y,z); hold on

axis([-r r -r r]*2.2)
plot3([-r -r], get(gca,'ylim'), [0 0]);
plot3([r r], get(gca,'ylim'), [0 0]);
plot3(get(gca,'xlim'), [-r -r], [0 0]);
plot3(get(gca,'xlim'), [r r], [0 0]);

xlabel('x');
ylabel('y');
zlabel('z');

rotate3d on
axis vis3d

%% Car image
img = imread('car.jpg');
img = imrotate(img,180);
figure(2), clf
%imshow(img(1:340, 1:340, :));
imagesc(img(1:340, 1:340, :));


figure(), clf
warped_plot = warp(x,y,z,img(1:340, 1:340, :))

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

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

0 голосов
/ 27 января 2020

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

Я генерировал QR-код с qrencode в терминале, например:

qrencode -o qr.png -d 300 'http://www.thesetchells.com'

enter image description here

Я изменил размер до 500x500, а затем сгенерировал смещение " map ", который представляет собой просто линейный градиент с растяжением контраста, созданным для соответствия размеру QR-кода. Я использовал ImageMagick в Терминале, но, очевидно, вы можете использовать Matlab или другие инструменты:

enter image description here

Затем я применил карту смещения к мой QR-код выглядит так:

convert qr.png map.png -fx 'p{v*w,j}' result.png

И получил искаженный QR-код, который я распечатал и обернул вокруг большого bottle, и мой iPhone смог его прочитать.

Энтони Тиссен имеет очень полезную информацию о «картах смещения» здесь .

...