Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ステレオ ビデオからの深度推定のためのコード生成

この例では、MATLAB® Coder™ を使用して MATLAB 関数の C コードを生成する方法を説明します。このコードは、ステレオ カメラ キャリブレーター アプリまたは関数 estimateCameraParameters で作成された stereoParameters オブジェクトを使用します。ここではステレオ ビデオからの深度推定の例にある MATLAB コードを変更して、コード生成がサポートされるようにする方法を説明します。

この例には MATLAB Coder のライセンスが必要です。

コード生成

MATLAB® Coder™ を使用したコード生成の基礎については、特徴のマッチングとレジストレーションを使ったコード生成の紹介の例を参照してください。

C コード生成のための MATLAB コードの再構成

MATLAB Coder で C コードを生成するには、MATLAB コードが関数の形式を取っていなければなりません。また、関数の引数が MATLAB オブジェクトであってはなりません。

これは MATLAB コードからコードを生成する際に問題となります。MATLAB コードでは cameraParameters オブジェクトまたは stereoParameters オブジェクトが使用され、これは通常、カメラのキャリブレーション時にあらかじめ作成されます。この問題を解決するには、toStruct() メソッドを使用して cameraParameters オブジェクトまたは stereoParameters オブジェクトを struct に変換します。この struct は、その後、生成されたコードに渡すことができます。

ステレオ ビデオからの深度推定の例のメイン アルゴリズムを再構成したコードは、depthEstimationFromStereoVideo_kernel.m という関数内にあります。depthEstimationFromStereoVideo_kernel は、stereoParameters オブジェクトから作成された struct を受け取る関数であることに注意してください。また、showPointCloudFunction はコード生成をサポートしないため、再構成された 3 次元点群は表示されません。

ステレオ カメラのパラメーターの読み込み

stereoParameters オブジェクトを読み込みます。このオブジェクトは stereoCameraCalibrator アプリまたは関数 estimateCameraParameters を使用してカメラのキャリブレーションを行った結果です。

% Load the stereoParameters object.
load('handshakeStereoParams.mat');

% Visualize camera extrinsics.
showExtrinsics(stereoParams);

% Convert the object into a struct, which can be passed into generated
% code.
stereoParamsStruct = toStruct(stereoParams);

ビデオ ファイルの非圧縮化

Macintosh では、圧縮されたビデオを読み取るためのコード生成が VideoReader でサポートされていません。ビデオ ファイルを非圧縮化して、一時ディレクトリに保存します。

if strcmp(computer(), 'MACI64') || strcmp(computer(), 'MACA64')
    % Uncompress the left video.
    videoFileLeft = 'handshake_left.avi';
    reader = VideoReader(videoFileLeft);
    writer = vision.VideoFileWriter(videoFileLeft);
    while hasFrame(reader)
        frame = readFrame(reader);
        step(writer, frame);
    end
    release(writer);

    % Uncompress the right video.
    videoFileRight = 'handshake_right.avi';
    reader = VideoReader(videoFileRight);
    writer = vision.VideoFileWriter(videoFileRight);
    while hasFrame(reader)
        frame = readFrame(reader);
        step(writer, frame);
    end
    release(writer);
end

MATLAB 関数の MEX ファイルへのコンパイル

関数 codegen を使用して、関数 depthEstimationFromStereoVideo_kernel を MEX ファイルにコンパイルします。コンパイル レポートを生成するには '-report' オプションを指定します。このレポートには元の MATLAB コードと、C コードの生成時に作成された関連ファイルが含まれています。必要に応じて、生成されたファイルを MATLAB Coder が保存できる一時ディレクトリを作成します。生成される MEX ファイルの名前は、-o オプションを使って実行可能ファイルの名前を指定した場合を除き、元の MATLAB ファイルに _mex を追加したものになることに注意してください。

MATLAB Coder では、すべての入力パラメーターのプロパティを指定しなければなりません。これを簡単に行うには、コマンド ラインで -args オプションを使用して、入力プロパティを例で定義します。詳細については、コマンド ラインでの例による入力プロパティの定義 (MATLAB Coder)を参照してください。

compileTimeInputs  = {coder.typeof(stereoParamsStruct)};

% Generate code.
codegen depthEstimationFromStereoVideo_kernel -args compileTimeInputs;
Code generation successful.

生成されたコードの実行

player = vision.VideoPlayer('Position', [100 200 750 560]);
eofReached = false;
while ~eofReached
    [eofReached, dispFrame] = depthEstimationFromStereoVideo_kernel_mex(stereoParamsStruct);

    % Hold the last frame.
    if ~eofReached
      step(player, dispFrame);
    end
end

クリーンアップ

clear depthEstimationFromStereoVideo_kernel_mex;
release(player);

まとめ

この例では、cameraParameters オブジェクトまたは stereoParameters オブジェクトを入力として受け取る MATLAB コードから C コードを生成する方法を説明しました。