Matlabでビデオを操作する

Matlabは数値計算用の有名な媒体であり、科学界で広く使用されています。 これは、Windows、nixシステム、およびポピーで動作します。 Matlab言語は、行列と多次元配列を扱うために最適化されています;さらに、最適化問題、統計計算、信号と画像などを処理するための膨大な数の拡張機能(公式にはツールボックスと呼ばれます)があります さらに、Matlabには既に大量の科学的コードが記述されており、その人気がさらに高まっています。



この記事では、ビデオを操作するためのMatlabの機能について簡単に説明します。 synthis matlabaに慣れていない人のために、ロシア語の主な機能の簡単な概要をここで読むことができます





ビデオフォーマット



ビデオを操作するために最初にすることは、Matlabにアップロードすることです。 私に生じた主な困難は、コーデックに関連しています。 デフォルトでは、サポートされているビデオ形式のリストは小さく( 英語のドキュメント )、ビデオがビデオを開くかどうかは、システムにインストールされているコーデックによって異なります。 一般的なルールは、組み込みプレーヤー(Windowsの場合はWindows Media Player)がファイルを開けない場合、Matlabはほとんどの場合ファイルを開けません。



したがって、ビデオを記録する機能はインストールされたコーデックに大きく依存しますが、Matlabはコーデックがインストールされていないシステムで非圧縮ビデオを作成できます。



「たくさんのもの」オプションにKLite Codec Pack Fullをインストールすることで、ビデオの読み取りと録画に関する問題を解決しました。





ビデオを読むためのさまざまな方法



matlabでビデオを読む方法はいくつかあります。 それらの2つを以下に説明します。



mmreaderおよびreadメソッドを使用してビデオを読む



ビデオを読み取る最初の方法は、 mmreader



メソッドを使用してファイルを開き、 read



メソッドを使用してフレームを読み取ることです。



 %ファイルを開く
 video = mmreader( 'd:\ test \ 1.avi');

 %これは、オープンビデオのいくつかのプロパティについて学習する方法です
 width = video.Width;
 height = video.Height;
 frameRate = video.FrameRate;
 numOfFrames = video.NumberOfFrames;

 %読み取りフレーム
 %フレームは1から番号付けされます
 frameNo = 50;
 frame = read(video、frameNo);

 %フレームを読み取ることができ、このように
 frame = video.read(frameNo);

読み取りフレーム範囲の割合
 %50-最初の読み取りフレームの数
 %100-最後の読み取りフレームの番号
 framesRange = [50 100];
フレーム=読み取り(ビデオ、framesRange);

すべての動画を読む%
ビデオが大きく、メモリに収まらない場合、%操作は実行されません
 wholeVideo = read(ビデオ);

 %matlabには、ビデオファイルを閉じるための特別な機能はありません。
 %したがって、ビデオの操作を終了すると
 %追加のアクションを実行する必要はありません。




すべてのフレーム読み取り関数は、実行の結果として多次元マトリックスを返します。 たとえば、matlabの対話型コンソールでビデオを操作するためのいくつかのコマンドを実行した結果は次のとおりです。



  >> video.Width

 ans =

    704

 >> video.Height

 ans =

    576

 >>フレーム=読み取り(ビデオ、5);
 >>サイズ(フレーム)

 ans =

    576704 3

 >>フレーム=読み取り(ビデオ、[5 10]);
 >>サイズ(フレーム)

 ans =

    576704 3 6 




したがって、1つのフレームを読み取った結果、サイズが高さx幅x 3の行列が得られます。この要素の要素は8ビット符号なし整数です。 いくつかのフレーム範囲を読み取った結果、高さx幅x 3 x NumOfFramesのサイズのマトリックスが取得されます。



したがって、フレームをアップロードすると、通常のMatlabマトリックスと同様にフレームを操作でき、 Image Processing Toolboxに含まれる画像処理用のあらゆる種類の関数を適用できます



System Objectsでビデオを読む-Matlab 2010aの革新



matlabaバージョン2010aでは、システムオブジェクトの概念が導入されました。 Matlabのマニュアル 、システムオブジェクトがアルゴリズムのオブジェクト指向の実装を提供すると述べています。 通常のMatlab機能と比較して、それらは自動的に状態を制御し、ストリーミング情報処理に適しています。 一般的に、主なポイントは、開発者によると、ストリーミング情報処理のためにそれらを使用する方が便利であるということです。 利便性を犠牲にして、あなたは賭けることができますが、コードは少し短くなっています。



次に、システムオブジェクトを使用したビデオのフレームごとの読み取りの例を示します。



 %ビデオを読むためのオブジェクトを作成します
 reader = video.MultimediaFileReader( 'Filename'、 'd:\ test \ 1.avi');

 %すべてのビデオをフレームごとに読む
 %ステップ関数は、高さx幅x 3のサイズの行列を返します
 %この行列の真の要素は、すでにシングル-4バイトの浮動小数点型です。
 while〜isDone(リーダー)
   フレーム=ステップ(リーダー);
終わり

ここでは、前の場合と同様に、終了操作は必要ありません
ビデオの最後の%




このアプローチの重大な欠点は、ビデオへのランダムアクセスがないことです。フレームはシーケンシャルにしか読み取れません。 また、主観的に、ビデオを開いてシステムオブジェクトを使用してフレームをread



は、 mmreader



read



を使用するよりも少し時間がかかりread







ビデオを再生する



ビデオを読み取って処理できることに加えて、Matlabに組み込まれた手段で再生することもできます。



映画機能で遊ぶ



ムービー機能を使用すると、ビデオを再生できます。 この機能を使用する特徴は、再生する必要があるビデオ全体を事前に準備する必要があることです。 さらに、ビデオは、ビデオを読み取って得られた形式とは異なる形式でメモリに保存する必要があります。 以下は、この関数を使用してビデオの最初の200フレームを再生する方法の例です。



 %%ビデオ読書
ファイル名= 'd:\ test \ 1.avi';
 video = mmreader(ファイル名);
 nFrames = 200;

 %情報が読み込まれる構造を準備します
 mov(1:nFrames)= struct( 'cdata'、[]、 'colormap'、[]);

フレームごとの読み取り率
 k = 1:nFramesの場合
     mov(k).cdata = read(video、k);
終わり

 %%ビデオを再生
 hf =図;
設定(hf、 'position'、[150 150 video.Width video.Height])
映画(hf、mov、1、video.FrameRate);




このコードでは、ムービーはmov



変数で準備されます。 この変数には、構造体の配列が格納されます。 各構造には、 cdata



cdata



2つのフィールドがあります。 cdata



フィールドにはフレームのビットマップが格納され、 colormap



フィールドにはインデックス付きカラーのビデオのカラーパレットを格納する必要があります。 この場合、これは本格的なRGBビデオであり、 colormap



フィールドcolormap



空です。



システムオブジェクトで遊ぶ



前の例と比較して、システムオブジェクトを使用すると、コードを大幅に削減できます。



 %ビデオを読むためのオブジェクトを作成します
 reader = video.MultimediaFileReader( 'Filename'、 'd:\ test \ 1.avi');

 %ビデオを再生するオブジェクトを作成します
 player = video.VideoPlayer;

 %フレームごとに読み取り、ビデオを再生する
 while〜isDone(リーダー)
   フレーム=ステップ(リーダー);
   ステップ(プレイヤー、フレーム);
終わり 




ビデオ録画



ビデオを録画するにはいくつかの方法があります。 ここでは、3つの方法を分析します。フレームごとの録画、1つのビデオ録画、およびシステムオブジェクトの使用です。



ビデオを複数のピースで録画する場合は、操作の最後に必ずビデオファイルを閉じる必要があることに注意してください。 ファイルが閉じられていない場合、matlabを終了するまでアクセス、削除、または上書きできません。



フレームごとにビデオを録画する





 %%準備変数
ファイル名= 'd:\ test \ 1.avi';
 result_file = 'd:\ test \ result.avi';
 nFrames = 200;
 video = mmreader(ファイル名);
 %書き込み用にファイルを開く
 %コンプレッサーのインストール-XVID
 writer = avifile(result_file、 'compression'、 'XVID');

ループ内の%% read-modify-write
膨張の%構造要素
 se = strel( 'rectangle'、[3 3]);
 k = 1:nFramesの場合
     %読み取りフレーム
     frame = read(video、k);
     %フレーム拡張を実行
     frame = imdilate(フレーム、se);
     %書き込みフレーム
     writer = addframe(ライター、フレーム);
終わり
 %ライターを必ず閉じてください
 writer = close(ライター); 




ここで、 avifile



関数への引数がavifile



れる方法に注目しavifile



。 最初の引数はファイル名、次に引数はペアになります-最初はパラメーターの名前、次に値です。 上記の例では、ファイル名に加えて、 avifile



関数は値XVIDの圧縮パラメーターavifile



渡します。



次のいずれかの識別子を圧縮パラメーターとして指定できます: 'None'、 'MSVC'、 'RLE'、 'C​​inepak'、 'Indeo3'または 'Indeo5'。 * nixシステムでは、「なし」オプションのみが使用可能です。 上記のオプションに加えて、目的のコンプレッサーのFourCCを指定することもできます(例のように)。 ここでは、ビデオエンコード用にシステムにインストールされているコーデックにすべて依存しています。 インストールされているすべてのコーデックがデコードとビデオエンコーディングの両方に適しているわけではないことに注意してください。 いくつかの試行されたオプションの私のシステムでは、XVIDだけが獲得しました。



ワンピースのビデオ録画



フレームごとの記録に加えて、フレームの配列をトリミングして、それらを一度にすべてファイルに書き込むこともできます。 movie



機能を使用してビデオを再生する例と同じ形式で、フレームの配列を準備する必要があります。 よりうまく:配列は構造体で構成され、構造体メンバーの1つは画像のビットマップを格納するcdataフィールドであり、2つ目はインデックス付きの画像のパレットを格納するカラーマップフィールドです:



 %%ビデオ読書
ファイル名= 'd:\ test \ 1.avi';
 video = mmreader(ファイル名);
 nFrames = 200;

 %情報が読み込まれる構造を準備します
 mov(1:nFrames)= struct( 'cdata'、[]、 'colormap'、[]);

 %ビデオの最初の200フレームを読み取り、変更します
 se = strel( 'rectangle'、[3 3]);
 k = 1:nFramesの場合
    フレーム=読み取り(ビデオ、k)
     mov(k).cdata = imdilate(frame、se);
終わり

 %%ビデオ録画
 movie2avi(mov、 'd:\ test \ result.avi'、 'compression'、 'XVID'、 'fps'、25);




movie2avi



の圧縮パラメーターは、前のセクションと同じです。



システムオブジェクトを使用してビデオを録画する



次のコードは、システムオブジェクトを使用してビデオを記録する方法を示しています。



 reader = video.MultimediaFileReader( 'Filename'、 'd:\ test \ 1.avi');
 %録画のためにビデオを開き、
 %filename = d:\ test \ result.avi
 %オーディオ-いいえ、ビデオ-は
 %ビデオコーデック= MJPEG
 writer = video.MultimediaFileWriter( 'Filename'、 'd:\ test \ result.avi'、...
     「AudioInputPort」、false、「VideoInputPort」、true、...
     'VideoCompressor'、 'MJPEG Compressor');
膨張の%構造要素
 se = strel( 'rectangle'、[3 3]);
 while〜isDone(リーダー)
    %読み取りフレーム
   フレーム=ステップ(リーダー);
    %フレームの膨張を実行
    frame = imdilate(フレーム、se);
    %書き込みフレーム
   ステップ(ライター、フレーム);
終わり

 %ライターを必ず閉じてください
閉じる(ライター);




video.MultimediaFileWriter



関数の引数は、「パラメーター名」とパラメーター値のペアです。 ファイル名もこの方法で送信されます(つまり、「ファイル名」と「ファイル名」のペアが指定されます)。



ここでのVideoCompressorパラメーターの可能な値は、 avifile



およびmovie2avi



指定できる値とはすでに異なりmovie2avi



。 VideoCompressorは「なし(非圧縮)」と指定できるため、「MJPEG Compressor」も獲得しました。 引数リストでVideoCompressorパラメーターが完全に省略されている場合、これは「なし(非圧縮)」を指定することと同じになります。



GNU Octaveに直面した無料の代替



一般に、Matlab製品は非常に高価ですが、部分的に互換性のある無料の代替品があります。 それらの1つはGNU Octaveです。



GNU Octaveは活発に開発されており、言語自体の構文はMatlabovskyとほぼ同じです。 構文の違いは、主にmatlabにいくつかの機能が既に登場しているが、まだOctaveに追加されていないという事実によるものです。



一連のライブラリを使用すると、事態はさらに悪化します。 GNU OctaveにはMatlabツールボックスがありませんが、一部の機能の代替が書かれています。



Ubuntu 10.04にGNU Octaveをインストールする



私はUbuntuでOctaveを使用したため、私の経験を繰り返したい人のために、インストール手順を説明します。



1.パッケージマネージャーを使用して、octave3.2 Linuxパッケージをインストールする必要があります。 octave3.2-doc; すべての依存関係を持つoctave3.2-headers。

2. mataveとは異なり、Octaveはインタープリターのみで構成されます。 したがって、グラフィカルインターフェイスを備えた開発環境が必要になる場合があります。 QtOctaveをUbuntu 10.04にインストールしました(パッケージマネージャーからも)。

3.ビデオを使用する場合は、Linuxパッケージlibavformat-dev、libavcodec-dev、libavutil-dev、libswscale-devをインストールする必要があります

4. Octave自体にもパッケージの概念があります。 Octaveパッケージには、Octaveの機能を拡張するさまざまな機能が含まれています。 Octaveパッケージは、 Octave-Forge Webサイトからダウンロードできます。

Octaveパッケージをインストールするには、管理者権限でOctaveを実行する必要があります: sudo octave



。 そして、Octaveでpkg install /path/to/package.tar.gz



実行します

画像とビデオを操作するには、Octaveパッケージの画像ビデオが必要です。



Octaveで実際にビデオを操作する



一般的に、Octaveでのビデオのロードと保存は、matlabでの方法と同様の方法で行われます。 以下は、ビデオの最初の25フレームを拡張するコードです。



ファイル名= '/home/alexey/octave/1.avi';
 result_file = '/home/alexey/octave/result.avi';

 %次の行のコメントを解除して、ビデオのプロパティにアクセスします
 %info = aviinfo(ファイル名);
 %width = info.Width
 %height = info.Height

 %オブジェクト録画ビデオを作成します
 writer = avifile(result_file);
 se = ones([3 3 3]);
 i = 1:25の場合
  ビデオからフレーム番号iを読み取る%
   frame = aviread(ファイル名、i);
   %フレームの膨張を実行
   frame = imdilate(フレーム、se);
   %書き込みフレーム
   addframe(ライター、フレーム);
終わり




ここで、 avifile(filename, frameNo)



関数は、 filename



という名前のビデオファイルからframeNo



番号のフレームを読み取りfilename



。 事前にオブジェクトを作成してファイルを開く必要はありません。 この関数はmatlabにもありますが、非推奨です。



ビデオに関する情報を見つける必要がある場合は、 aviinfo(filename)



関数を使用してこれを行うことができます。 その結果、ビデオのサイズと形式、フレーム数などに関する情報を格納する構造が返されます。 matlabでは、この関数は非推奨です。



ビデオはavifile



およびaddframe



を使用して記録されaddframe



が、matlabおよびOctaveでは、これらの関数の構文がわずかに異なります。 さらに、Octaveでは、ビデオを記録するオブジェクトを閉じる必要はありません(さらに、それを閉じるメソッドすらありません)。



その結果、上記のOctaveのコードをmatlabで機能させるには、次のように変更する必要があります。



 %%ビデオ読書
ファイル名= 'd:\ test \ result.avi';
 result_file = 'd:\ test \ result2.avi';

 %info = aviinfo(ファイル名);
 %width = info.Width;
 %height = info.Height;

 writer = avifile(result_file、 'compression'、 'xvid');
 se = strel( 'rectangle'、[3 3]);
 i = 1:25の場合
    frame = aviread(ファイル名、i);
    frame.cdata = imdilate(frame.cdata、se);
    writer = addframe(writer、frame.cdata);
終わり
 writer = close(ライター);




したがって、ビデオおよび画像処理に関しては、現在、Matlab関数とGNU Octave関数の構文に違いがあります。



All Articles