• ベストアンサー

MATLABのGUI、画像表示について

GUIDEで設計したGUIのaxes1に画像を表示させようとしているのですが、 simulink上のMファイルに a = imread('a.jpg'); image(a); のようにimageを記述して、GUI上のオブジェクトを指定するにはどうしたらよいのでしょうか?? 新たにfigureを立ち上げるのではなく、GUIに表示させる方法がわからず困っています。 初心者なのでわからないことだらけですが、よろしくお願いします!

質問者が選んだベストアンサー

  • ベストアンサー
  • Kules
  • ベストアンサー率47% (292/619)
回答No.1

>初心者なのでわからないことだらけですが、よろしくお願いします! というか初心者でいきなりGUIDEとかを使えてる時点で十分すごいと思うんですが。私自身GUIDEをそれなりに使えるようになるまでには結構時間かかりましたから。 さて、imageを現在あるaxesに貼り付けたいということでしたら、imageプロパティの中にParentという項目があるので、そこを貼り付けたい軸にしてやればできるはずです(現在Matlabが動かせる状況にいないので100%の保証はしませんが) ただ、確かimage(X,Y,C,'PropertyName',PropertyValue)という書き方にする必要があった(気がする)ので、XとYも仕入れておく必要があります。といっても、大事なのは最大値と最小値だけですし、C(imageデータ)だとしてsize(C)とすればCに入っている第一成分が縦(つまりYの長さ)、第二成分が横になりますのでそこから求めてもかまいません。 あと、parentを直接指定する書き方をした場合、y軸が反転しないまま(yの値が小さい方が下。単にimage(C)とした時はyの値が小さい方が上になるよう自動調整されている)なので、set(axes1,'Ydir','Reverse')としてy軸を反転させる必要があります。 いろいろごちゃごちゃ書いてすみません。分からないところ等あればその旨補足いただければと思います。 参考になれば幸いです。

penguing4
質問者

補足

丁寧な回答ありがとうございます。 いろいろと思考錯誤して、 h = gca; %カレントfigureに対するカレントaxesハンドル番号の取得 a = imread('gazou.jpg'); image(500,500,a,'Parent',h); のように記述したのですが、ハンドルが空で上手くいきません(><) guideで作成したGUIをカレントfigureに認識?できていないのが原因だとは思います。。。 新たにfigureが立ち上がってしまいます。 現在の流れは GUI上に作成したスタートボタンでset_param('シミュリンクのファイル名','SimulationCommand','start') % シミュレーション開始 ↓ simulink上のMファイルで、入力の値に応じて画像表示 です。 GUIのMファイル上でimageを記述すればGUI上のaxesに表示はされるのですが、 simulinkの実行結果(Output)ごとにリアルタイムで画像を切り替えてアニメーションにしたい為、 simulink上のMファイルにimageを記述したいと考えています。 h = figure(figureハンドル番号); としてfigureを指定したいところなのですが、gcfで取得したハンドル番号を直接書いたりしても上手くいきませんでした(><) むしろなぜできないのかもよくわからなくなってきています笑 もし何かアドバイスなどがあれば、よろしくお願いします(´;ω;`)

その他の回答 (1)

  • Kules
  • ベストアンサー率47% (292/619)
回答No.2

再びKulesです。 そうですね…私自身Simulinkを使ったことがないのでそちらに関して正確なことはわからないのですが。 ひとまず先に前回の回答の訂正です。 >size(C)とすればCに入っている第一成分が縦(つまりYの長さ)、第二成分が横になりますのでそこから求めてもかまいません。 と書きましたが、image(X,Y,C)のXとYに必要なのは最大値、最小値です。(Xの成分が1つしかない場合、それは最小値と解釈されます) ですので、 >image(500,500,a,'Parent',h); と書くとX軸、Y軸の範囲は500~1000、500~1000になってしまいます。 もし1~500の範囲で描きたいのであれば、 image([1,500],[1,500],a,'Parent',h); とする必要があるはずです。 とりあえず >guideで作成したGUIをカレントfigureに認識?できていないのが原因だとは思います。。。 >新たにfigureが立ち上がってしまいます。 に関してですが、現在パソコン画面のどこかにaxesがあるにも関わらずgcaコマンドで新しいaxesが立ち上がるということは、 axesの中にあるプロパティhandlevisibilityがoff、またはcallbackになっている可能性が高いです。 axes自体はGUIDEで配置しているんですよね?プロパティエディタで確認してみてください。 handlevisibilityがoffやcallbackになっているオブジェクトのハンドルを探す方法はいろいろありますが、 一番簡単(かはわからないけど最近私はこうやって探すようにしている)なのは、 あらかじめaxesのプロパティTagに適当な名前をつけておいて、 findallを使う方法です。 例えば、 figure; h=gca; set(h,'Tag','ABC'); としておけば、そのあと set(h,'HandleVisibility','Off'); としても、 h1=findall(0,'Tag','ABC'); とすれば先ほど作ったaxesのハンドルを取得できます。 handlevisibilityをonにしてh=gca;でもいいんですが、それをすると変なタイミングでそのaxesが使われてしまったりするので お勧めできません。また、guidata(handle,Data)を使ってfigureにハンドルを覚えさせておくと言う手もありますが、その場合figureのハンドルをどうやって取得するんだって話になり、やはりお勧めできません。 tagをつけてfindallで探すのが一番変更が少なく、簡単だと思います。 参考になれば幸いです。

penguing4
質問者

お礼

回答ありがとうございます。 先ほど無事解決することができました(´;ω;`) 先日の回答と含めていろいろと原因を探ってみたところ、Simulink内でループ(入力と出力の繰り返し)した際に、ハンドル(h)の中身が初期化されていた為、ハンドル指定が上手くできていなかったようです。 image([1,500],[1,500],a,'Parent',h); と記述した場合も、初めの1回は実際にはきちんと表示できていましたが、残りのループで[h]が空だった為、エラーが起こっていたようです(デバッグをしてようやく気づきました、すみません) また、自分の作成したaxesのハンドル番号をgcaで取得できていなかった事も原因でした。 axesのプロパティをいくつか変更した為、取得できなくなっていたようです。 ご指摘の通り、findallのtag検索を用いたら上手くいきました。 まとめると、やや強引ですが、GUI上のMファイルに global c; h = findall(0,'Tag','axes1'); c = h; としてハンドル番号を取得しておき、Simulink上のMファイルに global c; a = imread('a.jpg'); image([1,500],[1,500],a,'Parent',c); と記述しています。 あとはif文などを用いて、入力の値に応じて原始的に画像の切り替えを行うことにします(苦笑 親身になって回答していただいて本当にありがとうございました! 実は、教えてgoo自体初めて利用するのでよくわからなかったのですが、大変参考になりました。 先日の解答をベストアンサーに選ばさせていただいております。 長々となりましたが、もしまた機会がありましたらご指導の程、よろしくお願いします(><)

関連するQ&A

  • MATLABのGUI作成についての質問です。

    貼り付けた画像のようなGUIをつくりたいです。 どなたかおわかりになる方がおられたらご教授ねがいます。 プッシュボタンを押すとaxes1に F=<64×64 double> の行列を呼び出して imagescを使ってその数値をaxes1にカラーとして表示させ、 axes1上でマウスをクリックすると、その座標を2つのエディットテキストに 出力するようなGUIをつくりたいです。 プッシュボタンのコールバックに データ(行列F)の呼び出しとimagesc(F)によるaxes1への図の表示を定義しています。 axes1に図を表示させるところまではできたのですが、 マウスでクリックした点の座標をエディットテキストに出力することができません。 http://www.mathworks.co.jp/support/solutions/ja/data/1-AGU7P7/index... を参考にしてfigureのWindowButtonDownFcnのコールバックを定義すればいいのかと思いましたが、 「.fig」を保存して作成して作った「.m」ファイルのプログラムのどこにも figureのWindowButtonDownFcnを定義するところが見当たりません。 マウスでクリックした点の座標の値を取得してエディットテキストに出力するには どのようにしたらよいのでしょうか?

  • MATLABのGUIについて教えていただけないでしょうか。

    MATLABのGUIについて教えていただけないでしょうか。 今、128x128pixelの画像が40枚でセットになっているデータ(人間の脳みそのMRI画像なんですが)がmatファイルに保存されています(変数tempA. size(A) = 128x128x40)。これをGUIで読み込んでスライドバーで次々に切り替えて表示したいのですが、うまくいきません。(つまり40枚のうちの1枚が表示された状態でスライドバーを動かすと残りの39枚が順番につぎつぎ表示される状態にしたい) GUIDEを使ってuiloadでmatファイルを読み込んで表示するところまではいいのですが、スライドバーのCallback内に slider1=findobj('tag','slider1');slice=round(get(slider1,'value'));image(tempA(:,:,slice)); と記述すると、tempAは定義されていないとエラーが返ってしまいます。同じMファイル内で一度は使われている変数なのに?? どなたか解決策を教えていただけないでしょうか。 UICONTROLのvalueを表示された画像にリアルタイムに反映するにはどのような方法がありますか? よろしくお願いいたします。

  • MATLABで画像の表示方法

    a = imread('C:\Users\Labmember2011\Desktop\MatlabStuffs\2266057137_611af466d4.jpg'); b = imread('C:\Users\Labmember2011\Desktop\MatlabStuffs\pc.jpg'); cont = 0; %フレームカウンター figure; tic; %ストップウオッチタイマの開始 while(toc<10) %10秒の間アニメーション if toc > cont*0.5 %0.5秒間隔でフレームを更新 if mod(cont, 2) %カウンターが偶数の時はaの画像を表示 image(a); else %奇数の場合はbの画像を表示 image(b); end drawnow() %確実に描画させる cont = cont+1; end pause(0.05); %CPU使用率が上がるのが嫌な場合はpauseを入れる。(フレーム更新の精度はその分落ちる) end で実行したら2枚の画像が切り替わるプログラムが実行されました。 複数枚画像の表示方法はどのように書いたら実行できますか? 教えてください。

  • 連続でランダムに画像を表示させたい

    フェードで画像が切り替わるjQueryを使って画像を表示させています。 出てくる順番をランダムにしたいと思い、phpを記述しましたが、1枚目だけしか表示してくれません。 デモサイトがこちらです。 http://ijs.uh-oh.jp/demo/ ちなみにphpは、以下のように記述しました。 <figure id="fadein">  <?php $image=array( "image/photo01.jpg", "image/photo02.jpg", "image/photo03.jpg", "image/photo04.jpg", "image/photo05.jpg", ); $image = $image[rand(0, count($image)-1)]; echo '<img src=" '.$image.' " alt="">'; ?> </figure> 1枚だけでなく、ランダムで連続して表示させる方法をご教授ください。 phpは超初心者で自分なりに調べてみましたが、ギブアップしました(>_<)

    • ベストアンサー
    • PHP
  • MATLABのguiで別画面を表示する方法

    MATLAB 7.5.0(R2007b)、Windows版です。guideでGUIツールを作成しているのですが、計算結果(1000行くらいの実数の行列)を別ウィンドウで出力したいのですが、やり方がわかりません。基本的すぎるのか、結構時間をかけてWeb上や書籍を探したのですが、方法が見つかりませんでした。 GUI上の「計算」ボタンを押したら、その結果(グラフではなく、計算結果の数字)が別ウィンドウで表示され、スクロールバーで中身を見れるというものをイメージしているのですが、どなたかその方法をご存知の方、教えて下さい。

  • MATLABのGUIDEでフォルダ内の画像ファイルを表示する方法。

    MATLABのGUIDEでフォルダ内の画像ファイルを表示する方法。 MATLABのGUIDE内であらかじめボタンやパネルなどを配置するときに 背景色の変更のように背景に画像を設定することはできないのでしょうか? できなければmファイル内でのプログラミングでもいいので 画像ファイルを読み込んでGUIで背景表示させる方法を教えてください。

  • MATLABで連続した画像の取り込み方

    1つのJPGファイルを取り込み、表示させるやり方は I = imread('sample000.jpg'); imshow(I) これででき、作業を書くと for t=1:1:10 if(t==1) A=imread('sample000.jpg'); imshow(A) hold on [xa, ya]=textread('sample01.txt','%d %d','headerlines',10); end plot(xa(t,1), ya(t,1), 'r+'); if(t==10) hold off end end ということになります。 10回ループさせるのは、sample01.txtの10行目以降の中身が10個ずつの座標だからです 以下はsample01.txtの中身を簡単に書いたものです ...         ※9行目 test coordinates  ※10行目 44 54        ※11行目 45 46 53 43 55 41 58 38 61 33 66 36 69 41 72 47 73 52        ※20行目 10         ※21行目 46 54        ※22行目 48 52 ... ... 77 51        ※31行目 10         ※32行目 47 52        ※33行目 ... ... という感じです。 で、本題ですが sample000.jpg sample001.jpg sample002.jpg ... ... など複数のjpgファイルをループを使って連続して取り込み、作業したいときは、どういうコマンドでどういうループを作ればいいでしょうか? 具体的には 1枚目のsample000.jpgファイルを読み込みhold on、sample01.txtの11行目から20行目の座標を赤い点でプロットし、最後にhold off 2枚目のsample001.jpgファイルを読み込みhold on、sample01.txtの22行目から31行目の座標を赤い点でプロットし、最後にhold off 3枚目の... というループです。 下手な説明でごめんなさい、誰かMATLABの画像処理に詳しい方がいたら応答よろしくおねがいします。

  • いろいろなGUI

    いろいろなGUI えーと、どうゆう質問の趣旨かと言うと、WindowsでGUIがやりたいのですが、 どうしていいのか分かりません。 とりあえずCとPerlが出来ますが、exeがいいのでCがいいです。 一応CでWinAPIだかを使って画面を出したり文字を表示させたりはしたのですが、 おっそろしく面倒くさかった上、 覚える量や、いちいち指定する量が正気の沙汰ではないと感じました。 (APIに指定しなかった部分は全部デフォルトのデータが適用されるとかだったら続けてたと思います)。 一応私としては複雑なGUIはいらないので、 Windowsの基本的な画面だけ扱えればそれで満足です。 あまり面倒でイラっとくる量の記述(と言うか画面指定)はしたくないです。 WindowsでGUIを実現する手段に関しては全然知りません。 Windowsの何がどうなって画面が表示されてるかも知りません。 そこで質問なのですが、 言語とGUIツール(?)の名称をセットで教えて下さい。 それをいろいろ教えて下さい。 簡単な解説は付けてくれると嬉しいですが、 名称さえ分かれば自分で検索して確認します。 どーしてもCで手っ取り早いGUIがないのであれば、 JavaでもDelphiでも新規で言語を覚え直します。(そのくらいGUIめんどくせぇって思いました)。 しかし可能な限り出費はしたくないと思ってます。 ちなみに、今までGUIは以下の物をやりました。 CでWinAPI →   全部手書き。やってられないと思って却下。 PerlでGUI →   そこそこ思い通りに使えますが今回はコンパイルでexeがいいです。 HSP →   昔やって、GUIの手軽さを素晴らしいと思いましたが、   プログラム部が欠陥に感じたと言うか、プログラム言語じゃないと思いました。 プログラム経験とGUI経験はこれだけです。 他の言語はどーなってるのかとかは一切知りません。

  • 複数の画像をリンク設定し、サイズ、位置を指定してそれぞれ別ページにリンク設定する場合

    ホームページを作成している最中です。 画像をクリックした際に、リンク先はリンク元の拡大画像を表示し 画像サイズと位置を指定するよう設定しています。 例えば、そのリンク元の1ページに縮小画像が複数有る場合、 どのように記述すればよいのでしょうか。 現在はこんな感じとなっています。 -=-=-=-=-=-=-=-=-=-= <SCRIPT language="JavaScript"> <!-- function openwin() { window.open("http://●●●.net/guide_a.html", "", "scrollbars=yes,width=420,height=270,top=100,left=80,scrollbars=no"); } //--> </SCRIPT> -=-=-=-=-=-=-=-=-=-= 省略 -=-=-=-=-=-=-=-=-=-= <TD><A href="javascript:openwin();"><IMG src="image27.jpg" width="150" height="94" border="0"></A></TD> ↑この画像をクリックすると、上記で指定したサイズ、位置で画像が表示されますが 同じページにリンク元が複数ある場合、どのように記述すればよいでしょうか。 例えば、下記の別の画像も同じように、違うページに設定したいです。 <TD><A href="javascript:openwin();"><IMG src="image17.jpg" width="150" height="94" border="0"></A></TD> リンクしたいページ http://●●●.net/guide_b.html 今の状態ですと、リンク元の画像は同じページ内にあるため image17もimage27も同じリンク先(http://●●●.net/guide_a.html)に飛んでしまいます。 これをそれぞれ別ページにリンク設定したいです。 image27→http://●●●.net/guide_a.html image17→http://●●●.net/guide_b.html 大変わかりずらい説明で申し訳ありません。 素人なのでいまいち説明の仕方がよくわかってないです。。。 どうぞよろしくお願いいたします。

  • 外部画像の読み込み→表示で

    Flash MX でアクションスクリプトを記述しました。 this.myPhoto.loadMovie("/image1.jpg"); インスタンス名:myPhoto 画像ファイル名:image1.jpg (画像ファイルimage1.jpgはswfファイルと同じ階層) バブリッシュして htmlファイルと swfファイルを作成しましたが、htmlでは画像が表示されません。 swfファイルをFlash Player再生すると画像は表示されています。 this.myPhoto.loadMovie("/image1.jpg"); を this.myPhoto.loadMovie("image1.jpg"); と『/』を除いて記述すると、 今度は htmlファイルでは画像が表示されますが、swfファイルはFlash Playerで再生しても表示されません。 htmlでもswfでも表示するようには出来ないものでしょうか? OS: windowsXP SP2 IE: Ver6.0 FLASH: Flash MX アクションスクリプトの初心者で質問の仕方さえ要領を得てないと思いますがご勘弁ください。 不明の点はご指摘ください。

    • ベストアンサー
    • Flash

専門家に質問してみよう