関数の呼び出し中に出​力引数が代入されない​エラーを回避するには​どうしたらよいのでし​ょうか

17 views (last 30 days)
Astro boy
Astro boy on 29 Sep 2021
Answered: Astro boy on 4 Oct 2021
こんにちは,私は主題のタイトルのエラーと現在格闘しています.バージョンは2021aを使用しています.
やりたい処理として
①画像上に水平な線分を描く
②水平線分が矢印キー上と下を押すことでそれぞれ上下に移動する
③qキーを押して移動した水平線分ピクセル値を,画像をクリックして読み取る
となっています.
しかし下記の作成したコードをもとに実行を行うと
出力引数 "pix" (および他の引数もおそらく) は "lineplot" の呼び出し中に代入されていません。
エラー: main (行 6)
pix=lineplot(J);
と表示されます.
エラー文の内容を調べたところ,「関数内で例外が発生すると出力引数が未定義になる」とあったのですが,いまいちよくわかりません.
ここでいう例外にあたるケースはどういった場合なのでしょうか,またどういった対策をすればよいのでしょうか,解答よろしくお願いいたします.
-----------------------------------------------------
%メインのプログラム
function main()
close
%画像の読み取り
J=imread('corn.tif');
pix=lineplot(J);
----------------------------------------------------
%画像上に水平線分の描画と移動を行う関数
function pix=lineplot(J)
fig=figure;
ax=axes;
ypixh=size(J,1)/2;
I=imshow(J,'Parent',ax);
axis ([0 size(J,2) 0 size(J,1)]);
%水平線分の描画
line=yline(ypixh,'--.r','LineWidth',3);
%キーが押されると実行する関数
fig.KeyPressFcn = {@my_callback};
function my_callback(src,data)
%矢印キー上が押されると水平線分が上に移動
if strcmp(data.Key,'uparrow')
ypixh=ypixh-10;
linemove(J,ypixh,ax);
end
%矢印キー下が押されると水平線分が下に移動
if strcmp(data.Key,'downarrow')
ypixh=ypixh+10;
linemove(J,ypixh,ax)
end
%qキーを押して水平線分上のピクセル値を読み取り
if strcmp(data.Key,'q')
pix=clickimage(J)
end
end
end
-----------------------------------------------------
%画像をクリックしてピクセル値を読み取る関数
function pix=clickimage(J)
roi=drawpoint;
%画像クリックでピクセル値読み取り
pix=roi.Position;
end
-----------------------------------------------------
%linemove関数
function linemove(J,ypixh,ax)
I=imshow(J,'Parent',ax);
axis ([0 size(J,2) 0 size(J,1)]);
line=yline(ypixh,'--.r','LineWidth',3);
end

Accepted Answer

Kojiro Saito
Kojiro Saito on 30 Sep 2021
関数lineplotが最初に実行されるとき、fig.KeyPressFcnの部分のキーが押された場合の処理が未実施で終了するため、lineplotの出力pixに何も値が入らず、定義されていない状態になっているためこのエラーが生じています。
キーが押されない場合はpixに初期値を入れるように変更してみてはいかがでしょうか。
例:
function pix=lineplot(J)
pix = [0 0]; % 初期値
fig=figure;
% 以下同様

More Answers (1)

Astro boy
Astro boy on 4 Oct 2021
キーが押されていない場合が未定義になるんですね.
初期値を入れてみるようにします.迅速な回答ありがとうございました.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!