エラー「位置1のイン​デックスが配列範囲を​超えています」

5 views (last 30 days)
RIntaro
RIntaro on 14 Oct 2022
Commented: Atsushi Ueno on 17 Oct 2022
を動かそうとしています。これは猿の顔を検出するプログラムです。
顔の検出をした際に画像をトリミングする枠の大きさを大きくしたいと考えています。そのために、
を書き換えます。
87行目で、facebox という配列?を参照して画像をトリミングしていそうなので、facebox の中身を変更したいと考えました。
そこで、disp() を使って、facebox を表示してみたところ、 12 24 54 54 のような結果が出力されました。
そのため、これは2点の座標の配列だと思い、
facebox(1, 1) = facebox(1, 1)*1.1
のように書きました。
すると表題のエラーが出ました。
試したこととしては
・facebox のデータ型を調べようと思い、class()で確認すると、double double ... と表示されました
 調べた感じ、配列かどうかの話ではなく、数字の表現の限度ということはわかりましたが、facebox が配列?なのかどうかはわかりませんでした
・(1)や.(1) などで指定してみました
エラーの意味としては配列のサイズ外のところを指定した、という意味だと思っていますが、↑のコードの105行目のあたりでは(p,1)などで指定しているので、何が違うのかわかりません、、
MATLABは始めたてです。初歩的なことかもしれませんが、お手柔らかにご教示お願いします。
  2 Comments
Atsushi Ueno
Atsushi Ueno on 14 Oct 2022
画像内の端で猿の顔を検出した際、facebox(1, 1)即ち左上隅のx座標を1.1倍した事により右に移動した矩形が元の画像をはみ出したのだと想定します。(動作確認はしていません)
  • faceboxはn行4列のベクトル:矩形(検出した顔の座標)を[x y w h]の形で表す
矩形の中心をずらさずに1.1倍の大きさにするには、下記の様にします。敢えて右端が画像からはみ出る様にしました。ここでrectangle関数やimcrop関数を使ってはみ出た矩形の座標を入力しても問題無く処理されます。しかし、コメントアウトした画像データへの直接indexingを使うと、座標が元画像のサイズである100を超えた時に本質問の表題と同様のエラーが発生します。詳細な説明はイメージのワールド座標系の定義が詳しいです。
I = zeros(100,100,3); imagesc(I); hold on % 黒の100*100画像を表示
mycolor = 'rgbcmyw'; facebox = [30 30 60 40]; % 矩形[x y w h]を定義
for i = 1:7
facebox(1,[3 4]) = facebox(1,[3 4]) * 1.1; % 幅と高さを1.1倍する
facebox(1,[1 2]) = facebox(1,[1 2]) - facebox(1,[3 4]) * 0.05; % 矩形の左上端の座標をずらす
rectangle('Position',facebox,'EdgeColor',mycolor(i)); % 拡大した矩形を表示
test = imcrop(I,facebox); % 元画像を矩形で切り出す実験
%test = I(facebox(1,1):facebox(1,1)+facebox(1,3), facebox(1,2):facebox(1,2)+facebox(1,4),:);
end
RIntaro
RIntaro on 16 Oct 2022
Atsushi Ueno さん、ご丁寧にありがとうございます。いただいた回答をもとに、実際のファイルでfaceboxのサイズを変えようとしたのですが、facebox(1,[3 4])のところが同様のエラーになります。
画像の端にあたる以前の、facebox を変更することもできない状態です。

Sign in to comment.

Answers (1)

Atsushi Ueno
Atsushi Ueno on 16 Oct 2022
Edited: Atsushi Ueno on 16 Oct 2022
https://github.com/clwitham/MacaqueFaces を動かして問題を再現しました。
すると、facebox が空の時に当該エラーが発生していた事が判りました。
>> facebox
facebox =
0×4 の空の double 行列
>> facebox(1, 1) = facebox(1, 1) * 1.1
位置 1 のインデックスが配列範囲を超えています。
エラー: MacaqueFaces_Detection (82)
facebox(1,1) = facebox(1,1) * 1.1
なので、下記の様に条件を付ければ問題は解消します。
if ~isempty(facebox)
facebox(1,1) = facebox(1,1) * 1.1
end
  3 Comments
Atsushi Ueno
Atsushi Ueno on 17 Oct 2022
「printデバッグ」をしました。
80 facebox=step(FaceDetector,I) % run face detection % ←セミコロンを除いておく
81 facebox(1, 1) = facebox(1, 1)*1.1 % ←セミコロンを除いておく
facebox(検出枠)が沢山表示されて、件のエラーが出たところで止まります。
facebox = 1.0e+03 *
1.7732 0.7320 0.0610 0.0610 % ←直前のフレームでは顔の検出枠が1つ存在した
facebox = 0×4 の空の double 行列 % ←今回のフレームでは検出枠が存在しなかった
位置 1 のインデックスが配列範囲を超えています。 % ←だからエラーが出た
エラー: MacaqueFaces_Detection (81)
facebox(1, 1) = facebox(1, 1) * 1.1
Atsushi Ueno
Atsushi Ueno on 17 Oct 2022
printデバッグよりデバッグ機能を使う事をお勧めします。
重要な点は「ワークスペース」です。プログラムカウンタがMacaqueFaces_Detection関数の外にいる時は、同関数の関数ワークスペースの外(ベースワークスペース)にいる為、同関数内の変数(faceboxなど)がワークスペースに表示されません。プログラムカウンタをMacaqueFaces_Detection関数内に移せば表示されるようになります。

Sign in to comment.

Categories

Find more on Matrix Indexing in Help Center and File Exchange

Tags

Products

Community Treasure Hunt

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

Start Hunting!