ホーム > 製品情報 > SophiaFramework UNIVERSE > チュートリアル > BREW カメラアプリ

BREW カメラアプリ 〜 BREW C++ カメラプログラミング 〜

Camera クラスの利用

SimpleCamera クラス

Camera クラスを利用するアプリ本体のコーディングです。

SimpleCamera クラスのヘッダーファイルです。

- SimpleCamera.hpp -

#ifndef __SIMPLECAMERA_HPP
#define __SIMPLECAMERA_HPP

#include <SophiaFramework.hpp>
#include "SimpleCamera.bid"
#include "Camera.hpp"

SFMTYPEDEFCLASS(SimpleCamera)
class SimpleCamera : public SFCApplication {
  SFMSEALCOPY(SimpleCamera)
public:
  static SFCInvokerPtr Factory(Void);
private:
  Camera _camera;
  enum AppStatus { STATUS_NONE = 0, STATUS_PREVIEW, STATUS_SNAP };
  AppStatus _status;
  SInt16 _brightnessMin;  // 明るさの最小値
  SInt16 _brightnessMax;  // 明るさの最大値
  SInt16 _brightness;     // 現在の明るさ
  SInt16 _zoomMin;        // ズーム値の最小値
  SInt16 _zoomMax;        // ズーム値の最大値
  SInt16 _zoom;           // 現在のズーム値

  SimpleCamera(Void);
  virtual ~SimpleCamera(Void);
  virtual Bool Invoke(SFXEventConstRef event);
  Void OnAppStart(AEEAppStartPtr environment);
  Void OnAppStop(BoolPtr quitable);
  Bool OnKey(UInt16 key);
  // カメライベントのコールバック関数
  static Void CameraCallback(Camera::StatusEnum status,
                                   SFCError error, VoidPtr reference);
  // カメラ イベントのハンドラ
  Void OnCamera(Camera::StatusEnum status, SFCError error);
  // エラーメッセージ表示用
  Void PrintError(SFXWideStringConstRef msg);
  // プレビュー開始
  Void PreviewCamera(Void);
  // スナップ ショット モードで撮影された画像を加工して表示
  Void DisplayImage(Void);
  // 明るさ変更
  Void ChangeBrightness(Bool isBrighter);
  // ズーム
  Void ChangeZoom(Bool isZoomIn);
};

#endif // __SIMPLECAMERA_HPP //

イベントハンドラと画像の取得が重要です。

イベント ハンドラ

イベント ハンドラの登録

// アプリ開始ハンドラ
Void SimpleCamera::OnAppStart(AEEAppStartPtr environment)
{
  ...
  // ここにアプリ開始時の処理を記述します。

  // カメラの初期化を行う
  if (_camera.Initialize(
                     SFXGraphics::GetInstance()->GetDeviceRectangle(),
                     CameraCallback, this) != SFERR_NO_ERROR) {
    PrintError(SFXWideString("カメラの起動に失敗しました。"));
    return;
  }
  ...
}

イベント ハンドラ

Void SimpleCamera::CameraCallback(Camera::StatusEnum status,
                                    SFCError error, VoidPtr reference)
{
  SimpleCameraPtr p = reinterpret_cast<SimpleCameraPtr>(reference);
  p->OnCamera(status, error);
}

Void SimpleCamera::OnCamera(Camera::StatusEnum status, SFCError error)
{
  if (error != SFERR_NO_ERROR) {
    // エラーが発生
    _camera.Terminate();
    _status = STATUS_NONE;
    PrintError(SFXWideString("カメラに問題が発生しました。"));
    return;
  }

  if (status == Camera::STATUS_ENCODE) {
    // ビットマップが取得できる状態になった
    _status = STATUS_SNAP;
    DisplayImage();
  }
}

※ イベント ハンドラは静的関数なので、呼び出しは 2 段階です。

Camera クラスはそれ自身がイベント処理を行った後で、登録されたコールバック関数を呼び出します。

Camera::STATUS_ENCODE はスナップショット モードで撮影した画像が取得できる状態です。

SimpleCamera クラスはプレビュー時には何もしません。スナップショット モードでの撮影が完了したとき、DisplayImage 関数を呼び出します。

画像取得

Camera クラスの GetBitmap メンバ関数を呼び出して画像を取得します。

// スナップ ショット モードで撮影した画像を表示
Void SimpleCamera::DisplayImage(Void)
{
  // 取得した画像をネガにする
  SFXGraphicsPtr pg(SFXGraphics::GetInstance());
  SFBBitmapSmp displayBmp(pg->GetDestination());
  displayBmp->BltIn(pg->GetDeviceRectangle(),
                      _camera.GetBitmap(), SFXGrid(0, 0), AEE_RO_NOT);
  pg->Update();
}

この例では、ネガにして表示しています。画面のビットマップを取得し、そこにカメラで取得したビットマップをコピーする際、ラスタ オペレーションとして AEE_RO_NOT を指定することで実現できます。