Image processing Octave认为,我想读的图像()不';不存在

Image processing Octave认为,我想读的图像()不';不存在,image-processing,octave,imread,Image Processing,Octave,Imread,我正在写一个倍频程函数,以便在图像上轻松添加粒子,但我有一个问题 function [ out ] = enparticle( mainImg, particleNames, particleData, frames, fpp, sFrame, eFrame ) %particleData format: % [ p1Xline p1StartHeight p1EndHeight; % p2Xline p2StartHeight p2EndHeight; % p3Xli

我正在写一个倍频程函数,以便在图像上轻松添加粒子,但我有一个问题

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
当我试图以这种方式读取()文件时,Octave认为,没有这样命名的文件。但事实上是这样。与脚本文件位于同一文件夹中

最奇怪的是,当我改变

    tmp = particleNames(i,:) 

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

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

我为什么要这样做是因为我想把每一帧(图像和alpha)分别放在一个单元数组中

我完全没有任何线索,关于我在那里做错了什么,也无法在任何地方搜索它:(

代码:

filenames = [ "p_dot.png"; "p_star.png"; "p_dot.png" ]
不做你认为它会做的。这将创建一个二维 字符数组。请参阅

octave> size (filenames)
ans =

    3   10
值得注意的是,它列出了10列 文件名,您会注意到它们的文件名是不同的 长度,两个长度为9,一个长度为10。但这只是 与数字矩阵一样,唯一的区别是使用ascii码 和数字矩阵一样,所有行都必须具有长度。 发生的事情是,最短的行被填充了 空白。您可以通过检查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中,这是 空格字符(请参见包含表格的)

所以问题不在于imread找不到名为 “p_dot.png”,问题是它找不到名为 “p_dot.png”

您不应该为此使用字符数组。相反,请使用 单元格数组。在字符数组的单元格数组中。如下所示:

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
守则:

filenames = [ "p_dot.png"; "p_star.png"; "p_dot.png" ]
不做你认为它会做的。这将创建一个二维 字符数组。请参阅

octave> size (filenames)
ans =

    3   10
值得注意的是,它列出了10列 文件名,您会注意到它们的文件名是不同的 长度,两个长度为9,一个长度为10。但这只是 与数字矩阵一样,唯一的区别是使用ascii码 和数字矩阵一样,所有行都必须具有长度。 发生的事情是,最短的行被填充了 空白。您可以通过检查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中,这是 空格字符(请参见包含表格的)

所以问题不在于imread找不到名为 “p_dot.png”,问题是它找不到名为 “p_dot.png”

您不应该为此使用字符数组。相反,请使用 单元格数组。在字符数组的单元格数组中。如下所示:

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

我刚刚发现它,想在这里写作,但你是第一个;D非常感谢你花时间和决心:)我刚刚发现它,想在这里写作,但你是第一个;D非常感谢您花费的时间和决心:)