- ベストアンサー
MATLABのGUI、画像表示について
GUIDEで設計したGUIのaxes1に画像を表示させようとしているのですが、 simulink上のMファイルに a = imread('a.jpg'); image(a); のようにimageを記述して、GUI上のオブジェクトを指定するにはどうしたらよいのでしょうか?? 新たにfigureを立ち上げるのではなく、GUIに表示させる方法がわからず困っています。 初心者なのでわからないことだらけですが、よろしくお願いします!
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>初心者なのでわからないことだらけですが、よろしくお願いします! というか初心者でいきなり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軸を反転させる必要があります。 いろいろごちゃごちゃ書いてすみません。分からないところ等あればその旨補足いただければと思います。 参考になれば幸いです。
その他の回答 (1)
- Kules
- ベストアンサー率47% (292/619)
再び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で探すのが一番変更が少なく、簡単だと思います。 参考になれば幸いです。
お礼
回答ありがとうございます。 先ほど無事解決することができました(´;ω;`) 先日の回答と含めていろいろと原因を探ってみたところ、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自体初めて利用するのでよくわからなかったのですが、大変参考になりました。 先日の解答をベストアンサーに選ばさせていただいております。 長々となりましたが、もしまた機会がありましたらご指導の程、よろしくお願いします(><)
補足
丁寧な回答ありがとうございます。 いろいろと思考錯誤して、 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で取得したハンドル番号を直接書いたりしても上手くいきませんでした(><) むしろなぜできないのかもよくわからなくなってきています笑 もし何かアドバイスなどがあれば、よろしくお願いします(´;ω;`)