[英]Can't read tiff image using imread() in Octave 5.2.0 , getting this error : Magick++ exception
[英]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)分别放入单元格数组中。
我完全不知道我在那里做错了什么,也无法在任何地方使用谷歌搜索:(
编码:
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中,这是空格字符(请参阅有关表的ASCII的Wikipedia文章 )
因此,问题不在于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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.