我正在尝试用matlab将二维码打印到水瓶的表面上。然而,由于瓶子的曲面以及因此变形的二维码形状,无法识别QR瓶。
我想知道我可能需要应用什么数学方程来使图片变形(对于图片的一般几何形状和图片内部的间距变形),这样当打印到圆柱面上时,对于相机来说,它就像在平面上一样。
谢谢!
发布于 2020-01-27 23:33:02
我在这方面取得了一些成功,虽然它没有使用Matlab,但它可能会给您或其他人提供一个可能的入门方法。如果你不喜欢它,没有必要否决它,只要忽略它,它就会沉入答案的底部--我只是想帮助或激发想法……
我在终端中用qrencode生成了一个二维码,如下所示:
qrencode -o qr.png -d 300 'http://www.thesetchells.com'

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

然后,我将置换图应用于我的二维码,如下所示:
convert qr.png map.png -fx 'p{v*w,j}' result.png我得到了一个变形的二维码,我把它打印并包裹在一个大瓶子上,我的iPhone可以识别它。
Anthony Thyssen有一些关于“置换图”here的非常有用的信息。
发布于 2020-01-29 18:31:49
因此,我尝试使用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函数来做到这一点)。
我希望得到反馈的另一种可能性是找到平面图像和圆柱图像上相应水平点之间的数学关系,然后将该方程的逆应用到平面图像上,这样一旦打印出来并粘贴到圆柱表面上,它就会看起来是平面的。
https://stackoverflow.com/questions/59931265
复制相似问题