Octave 认为,我要 imread() 的图像不存在

Octave thinks, that image I want to imread() doesn't exist

我正在用 Octave 编写一个函数来轻松地在图像上添加粒子,但是我遇到了问题。

function [ out ] = enparticle( mainImg, particleNames, particleData, frames, fpp, sFrame, eFrame )

  %particleData format:
  % [ p1Xline p1StartHeight p1EndHeight;
  %   p2Xline p2StartHeight p2EndHeight;
  %   p3Xline p3StartHeight p3EndHeight;
  % ... ]
  %particleNames format:
  % [ p1Name;
  %   p2Name;
  %   p3Name;
  % ... ]

  pAmount = size(particleData, 1);

  for i= 1:pAmount
    tmp = particleNames(i,:) 
    [ pIMG pMAP pALPHA ] = imread( tmp );
  end

end

当我运行这个简单的代码用

enparticle( "ffield.png", [ "p_dot.png"; "p_star.png"; "p_dot.png" ], [ 100 50 100; 200 50 100; 300 50 100 ], 30, 10, 5, 25 )

我在控制台中写了这个

tmp = p_dot.png
error: imread: unable to find file p_dot.png
error: called from
    imageIO at line 71 column 7
    imread at line 106 column 30
    enparticle at line 24 column 23

当我尝试以这种方式 imread() 文件时,Octave 认为没有这样命名的文件。但它实际上是。在与脚本文件相同的文件夹中。

最奇怪的是,当我改变

    tmp = particleNames(i,:) 

    tmp = particleNames(:,:)

并且 Octave 将所有名称作为数组分配给 tmp,它神奇地找到了所有具有传递名称的文件。

但这不是我想要的工作方式,因为所有文件都将被替换、合并或图像处理过程中的其他操作。

为什么我尝试这样做与事实相关,我想稍后将每一帧(图像和 alpha)分别放入一个元胞数组中。

我完全不知道我在那里做错了什么,也不能在任何地方google:(

代码:

filenames = [ "p_dot.png"; "p_star.png"; "p_dot.png" ]

并不像你想象的那样。这将创建一个二维 字符数组。参见

octave> size (filenames)
ans =

    3   10

值得注意的是它列出了 10 列。看看你的 文件名,您会注意到它们的文件名不同 长度,两个长度为 9,一个长度为 10。但这只是 就像一个数字矩阵,唯一的区别是你有 ascii 人物。和数字矩阵一样,所有行都必须有长度。 发生了什么,最短的行被填充了 白色space。您可以通过检查 ascii 十进制代码来确认这一点 您的文件名:

octave> int8 (filenames)
ans =

  112   95  100  111  116   46  112  110  103   32
  112   95  115  116   97  114   46  112  110  103
  112   95  100  111  116   46  112  110  103   32

注意第一行和第三行如何以“32”结尾。在 ASCII 中,这是 space 个字符(参见 维基百科关于 ASCII 其中有表格)

所以问题不在于imread没有找到名为 'p_dot.png',问题是没有找到名为 'p_dot.png '.

您不应该为此使用字符数组。相反,使用 元胞数组。在 char 数组的元胞数组中。像这样:

filenames = {"p_dot.png", "p_start.png", "p_dot.png"}
for i = 1:numel (filenames)
  fname = filenames{i};
  [pIMG, pMAP, pALPHA] = imread (fname);
  ## do some stuff
endfor