【问题标题】:Projecting an image onto a cylindrical surface in a way where the image appears flat以图像看起来平坦的方式将图像投影到圆柱表面上
【发布时间】:2020-01-27 12:32:36
【问题描述】:

我正在尝试使用 matlab 将二维码打印到水瓶表面。然而,由于瓶子的曲面,二维码的形状变形,无法识别二维码瓶。

我想知道我可能必须应用什么数学方程来变形图片(对于图片的一般几何形状和图片内部的间距变形),这样当打印到圆柱表面时,它看起来就像它的在相机的平面上。

谢谢!

【问题讨论】:

标签: matlab image-processing projection


【解决方案1】:

我在这方面取得了一些成功,虽然它不使用 Matlab,但它可能会给你或其他人一个关于可能的入门方式的想法。如果您不喜欢它,无需拒绝它,只需忽略它,它就会沉入答案的底部 - 我只是想帮助或激发想法......

我在终端中生成了一个带有qrencode 的二维码,如下所示:

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

我将它的大小调整为 500x500,然后生成了一个 “位移图”,它只是一个线性渐变,并创建了与 QR 码大小相匹配的对比度拉伸。我在终端中使用了 ImageMagick,但显然你可以使用 Matlab 或其他工具:

然后我将置换贴图应用到我的二维码,如下所示:

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

我得到了一个扭曲的二维码,我打印出来并用它包裹在一个大瓶子上,我的 iPhone 可以读取它。

Anthony Thyssen 有一些关于“置换贴图”的非常有用的信息here

【讨论】:

  • 谢谢,这对我很有帮助
【解决方案2】:

所以我尝试使用 Matlab 中包含的基本“car.jpg”图像来解决我的问题。

到目前为止,我已经拍摄了汽车图片的正方形部分,并将其包裹在圆柱体的一部分表面上。

这是我的代码:

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 函数来做到这一点)。

我希望得到反馈的另一种可能性是找到平面和圆柱图像上相应水平点之间的数学关系,然后将该方程的倒数应用于平面图像,这样一旦打印出来出来并粘在一个圆柱形表面上,它看起来是平的。

【讨论】:

    猜你喜欢
    • 2015-10-10
    • 2011-12-20
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多