2

私は非常に厳しいタイミング スケジュールで入力データを受信し、リアルタイムで GUI にプロットするかなり大規模なデータ取得プログラムを matlab で作成しました。私の問題は、プログラムのユーザーが Web 経由で GUI を表示してデータをリモートで監視する方法が必要なことです。私の解決策は、5 秒ごとに GUI フィギュアのスナップショットを撮り、そのイメージを Web サーバーでホストすることでした。

ただし、これは 2 つの許容できない問題につながります。

  1. print 関数は単純に遅すぎます。保存ごとに 3 ~ 4 秒かかり、その後、「print」を呼び出すたびに、プログラムは他のルーチンで遅れをとります。

  2. 何らかの理由で、印刷機能によって GUI が一時的にゆがみ、一部のコンポーネントの位置が変更され、他のコンポーネントが複製されます。それはほんの 1 秒ほど続きますが、それでも私の解決策は実用的ではありません。

これらの問題のいずれかを解決する方法はありますか?

編集: * ** 興味のある方へ、私が見つけた最善の解決策は、Minicapと呼ばれる外部ツールキットを使用することでした。

4

5 に答える 5

8

ファイル形式は大きな違いを生みます。これが散布図のサンプルです

n = 1e4;
hfig = figure;
hax = plot(1:n, rand(1, n), '+');

...そして、さまざまな形式に保存するためのいくつかのタイミング。

tic; print(hfig, 'test.bmp', '-dbmp'); toc      %4.1s
tic; print(hfig, 'test.bmp', '-dbmp256'); toc   %2.0s
tic; print(hfig, 'test.png', '-dpng'); toc      %1.9s
tic; print(hfig, 'test.tiff', '-dtiff'); toc    %0.45s
tic; print(hfig, 'test.jpg', '-djpeg'); toc     %0.44s
tic; print(hfig, 'test.wmf', '-dmeta'); toc     %0.42s

tiff、最初は共同でしたがjpegwmftiff ファイルは巨大で、jpeg の品質はお粗末で、Windows プラットフォームを使用していない場合は wmf に問題があります。


ラスター形式の場合、解像度もタイミングに影響します。

tic; print(hfig, 'test600.png', '-dpng', '-r600'); toc   %4.2s
tic; print(hfig, 'test72.png', '-dpng', '-r72'); toc     %0.31s

印刷を高速化するもう 1 つの方法は、プロットの不要な部分を削除することです。透明度は計算負荷が高く、凡例も同様です。すべてをプロットするのではなく、データをサンプリングすることで、時間も節約できます。

于 2011-07-25T15:46:47.740 に答える
3

将来これに苦労する人のために、私が Windows プラットフォーム用にたどり着いた解決策は、システム コマンドでスクリーンショットを簡単にキャプチャして保存できるMinicapと呼ばれる小さなプログラムです。

gethwnd()スーパーユーザー Yair M. Altman によって作成された、公開されている matlab 関数を使用してアクセスできる Figure の基になる Windows ハンドルが必要です。

次に、図の非常に高速で高解像度のスクリーンショットを撮り、次のような方法でディスクに保存できます。

winHandle = gethwnd(matlabFigHandle);
cmndstr = sprintf('%s','MiniCap.exe -save ','"',snapShotFileNamePath,'"',...
    ' -compress 9', ' -capturehwnd ', num2str(winHandle),' -exit');
system(cmndstr);
于 2012-11-21T20:51:33.537 に答える
2

あなたのソリューションは純粋な Matlab でなければなりませんか? プラットフォーム ツールキットを使用して、GUI を保持しているウィンドウのスナップショットを取得し、それをディスクに書き込みます。これは非常に高速であり、別のスレッドになるため、スレッドの問題を処理する必要があります。

于 2011-07-25T16:00:41.303 に答える
1

saveas()Figure をMATLAB.figインスタンスが計算を行うファイルとして (かなり高速である必要があります)、次に別の MATLAB インスタンス (おそらく別のコンピューター上) をprint使用して、必要な形式にすることができます。このようにして、他のルーチンの遅延を回避し、印刷による歪みが "メイン" MATLAB インスタンスで発生しません。

print特定のケースで捨てることができるものがあるかどうかを調べるために調べることができる .m ファイルであることに注意してください。たとえば、private/prepare.mあなたが話している歪み/位置の変化を引き起こすと私が思う呼び出し...多分あなたはこれで遊ぶことができますか?

更新: データWeb インターフェイスを経由する必要がありますか? ユーザーベースが十分に小さい場合は、VNC、Teamviewer、または Windows に組み込まれているターミナル サーバーなどのリモート デスクトップ ソフトウェアを使用してデータをリモートで表示するように教えることができますか?

于 2011-07-25T15:12:46.267 に答える
1

おそらく常にキャプチャする必要はありませんが、リクエストが実際に Web 経由で行われたときにのみキャプチャする必要があります。それでも、リクエストごとにキャプチャするのではなく、最後のスナップショットが 5 秒より古い場合にのみキャプチャします。これは、パフォーマンスを向上させるのに大いに役立つはずです。

于 2011-07-25T15:07:36.590 に答える