この「Simulink」モデルで行われた作業の要点は、実際に MATLAB 関数によって実行されているようです。したがって、この質問に対する答えは、その関数が実際に何をしているかに大きく依存します。具体的には、 への予想される入力とvidfunc
、この関数の出力は何ですか? この関数は、モデルに適合するように修正する必要があると思われます。
モデルをデバッグするには、各ブロックからの信号出力を考えると便利です。各時間ステップで、From Multimedia File
ブロックは単一の画像フレームを出力します。ドキュメントによれば、これは次のように構造化されているようです。
M x N x P のカラー ビデオ信号。ここで、P はカラー プレーンの数です。
下流に移動すると、次にColor Space Conversion
ブロックに到達します。この場合、M 行 N 列の行列の形式で画像フレームを出力する可能性が最も高いように見えます (行列の各要素は、そのピクセルでの画像の強度に対応します)。 )。
ここで、興味深い部分であるMATLAB Fcn
ブロックに行きます。先ほど見たように、このブロックへの入力は、1 つの画像フレームを表す M 行 N 列の行列になります。ブロックのパラメーター ダイアログ ボックスを見ると、MATLAB Fcn
このブロックへの入力は変数 で表されますu
。したがって、vidfunc
このブロックに入力されているイメージ フレームで関数を実行するには、単にMATLAB 関数vidfunc(u)
に を入力します。
ここで、MATLAB Fcn
ブロックへの入力と、出力に接続された Video Viewer ブロックがあるという事実に基づいてvidfunc
、単一の画像フレームを入力として操作し、別の単一の画像フレームを出力するように構造化する必要があります。がこのように構成されていない場合vidfunc
は、編集する必要があります (または、Simulink ブロックを使用して同じ機能を再実装するだけです)。
とはいえvidfunc
、処理された画像フレームを表す M 行 N 列の行列も返されていると仮定しましょう。出力が入力と同じ次元を持つことを示すために、ブロックの [出力次元]パラメーターを設定する必要があります。また、(docに示されているように) Collapse 2-D results to 1-Dがオフになっていることを確認する必要があります。そうしないと、画像出力が M 行 N 列ではなく 1 つの長いベクトルの形式になります。MATLAB Fcn
-1
正しくvidfunc
構造化されていれば、これで問題が解決するはずです。
注:作業を楽にするために、Simulink モデルで信号のデータ型と次元を表示することを強くお勧めします。これにより、多くの混乱を避けることができます。このドキュメントでは、これを行う方法を正確に説明しています。
- アップデート -
vidfunc
あなたのコードを見た後、これは の入力/出力がSimulink モデルが期待するものと矛盾しているという私の疑いを裏付けています。進め方は、独自の設計上の制約と、このシステムに実際に何を求めているかによって大きく異なります。基本的に、Simulink モデルと MATLAB 関数は一致しません...どちらが正しいですか? あなたが何を目指しているのかについての私の最善の推測に基づいて、いくつかの一般的な考えを述べます.
まず、Simulink はイメージ (M 行 N 列の行列の形式) を に渡しvidfunc
ます。これはvidfunc
、コードの開始時に画像をロードする必要がなくなったことを意味します。したがって、コードの最初の数行を次のように更新できると思います。
function h=vidfunc(a)
BW = edge(a,'sobel'); %sobel edge detection
vidfunc
入力として実際の画像 (画像を含むファイル名ではない) を取得していることを確認してください。基本的に、行を削除してa=imread(u);
すぐに処理にジャンプしますa
。
もう 1 つの問題は、の出力ですvidfunc
。Simulink は出力がイメージであることを想定していますが、そうではありません。このコードに何が含まれているかは 100% わかりませんh
(あなたのコードを最初に見たとき、これらは line オブジェクトへのハンドルだと思いましたが、そうではないようです)。これはおそらく、ハフラインの 1 つの終点の y 座標であるように見えます。それにもかかわらず、これは Simulink モデルが期待するものではありません。これは、修正するのが簡単ではありません。おそらく、 getframeを使用して、線のプロットから画像を取得することができます。
私があなたにできる最善のアドバイスは、MATLAB 関数を破棄して、すべてを Simulink に実装することだと思います。vidfunc
これは、モデルをうまく操作しようとするよりもはるかに簡単だと思います。vidfunc
実際にはそれほど多くのコードは含まれていないため、これはそれほど難しい作業ではありません。もう 1 つの利点は、このプロセスの最後に、実行しているすべての画像処理手順を明示的に示す優れた Simulink モデルが得られることです。
MATLAB 関数で行っているすべての画像処理は、Simulink ブロックでも実行できると思います (このドキュメントのSimulink ブロックのセクションを参照してください)。
幸運を。