1

私はビデオフレームを取り、それらを次のようなセル配列内に配置するMatlabコードに取り組んでいます

frames{fr} = read(videoObj, fr);

サンプルビデオの場合、フレームセルを確認すると、84フレーム(ビデオには84フレーム)が含まれており、すべてのセルに画像が表示されています。

私はmexファイルを持っています、標準として、それはそのようなものです

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

mexファイル作成のプロパティを読んだので、入力prhsconst mxArraymexコード内で何が起こっても、入力は変更されないようになっていると言われています。matlabのframesセル配列をprhs[0]framesセルと同様にmexファイルへの入力として指定し、いくつかの処理を行います(取り込んだものを変更しないことを誓いますprhs[0])。ただし、Matlabコードをデバッグすると、mexファイルを呼び出した直後(および入力としてmexファイルにフレームを指定した直後)に、フレームセルの最後のセルが削除されたように見えます。84番目のセルを見ると、それは[]であり、8や4などの乱数である場合もあります。mexファイルを呼び出すと、フレームセルの最後の列が消える方法や理由がわかりません。

Matlabコードにエラーがあると思われるかもしれませんが、デバッグすると、mexが処理される直前のフレームを確認しました。セルは84個あり、最後のセルは期待どおりの画像ですが、mexを呼び出した直後はframesです。まだ84セルですが、最後のセルは[]:空です。

誰か助けていただければ幸いですが、どうしてそんなことが起こるのでしょうか?const mxArray'入力がmexで変更されない'という意味ではありませんか?

4

1 に答える 1

0
  1. は、唯一のポインタconst mxArray* prhs[]カバーしています。内の入力引数の値を変更することは(非常に危険ですが)可能であることがわかります。mxArray[]mexFunction

  2. 注目に値するもう1つのポイントは、matlabの配列とセルはからインデックス付けされますが1..n、in C/C++(特にmexファイル内)の要素は0、...、n-1からインデックス付けされることです。したがって、デバッガーで空である(またはランダムな値が含まれている)ことがわかるのは、セル配列の終わりを超えてcell[84]アクセスしているためです。

于 2013-01-04T09:48:16.187 に答える