0

私は simulink でビデオに取り組んでいます。マルチメディア ファイル ブロックは一度に 1 フレームを読み取ることがわかっているため、matlab 関数ブロックにアタッチすると、imread コマンドで一度に 1 フレームを読み取る必要があります。matlab 関数ブロックをダブルクリックすると ( http://tinypic.com/view.php?pic=dggujd&s=6に示されているように)、関数の名前を matlab mfile に記述されているとおりに指定する必要があることがわかります。入力で; この場合はビデオ (convid.avi という名前) です。一度に 1 フレームずつ読み込んでいますが、ビデオ全体を matlab 関数の引数として指定しました。これは、どうすれば解決できるかという問題です。ビデオ全体ではなく、matlab 関数ブロックで引数として何を指定する必要がありますか。モデルもhttp://tinypic.com/view.php?pic=55jggw&s=6にアップロードしました。. 私がvidfuncに使用しているコードは次のとおりです。

function h=vidfunc(u)
a=imread(u); % read frame
BW = edge(a,'sobel'); %sobel edge detection
[H,thetaa,rhoo]=hough(BW); % Hough Transform
P = houghpeaks(H,6,'threshold',ceil(0.5*max(H(:))));
lines=houghlines(BW,thetaa,rhoo,P,'FillGap',15,'Minlength',15)
figure,imshow(I),hold on
for k = 1:length(lines) % Draw lines
 xy = [lines(k).point1; lines(k).point2];
 z(k)=lines(k).point2(2);
 plot(xy(:,1),xy(:,2),'LineWidth',1,'Color','green');
 end
 h=z(k)
4

1 に答える 1

1

この「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 ブロックのセクションを参照してください)。

幸運を。

于 2012-09-29T06:50:13.683 に答える