カメラの概要

Qt Multimedia API にはカメラ関連のクラスが多数用意されており、携帯端末のカメラや Web カメラの画像や動画にアクセスすることができます。一般的なタスクには C++ と QML の両方の API があります。

カメラの機能

カメラクラスを使うには、カメラの動作について簡単に説明する必要があります。すでにご存知の方は、カメラの実装の詳細まで読み飛ばしてもかまいません。カメラがどのように動作するかのより詳しい説明については、次のYouTubeクリップをご覧ください。

レンズ・アセンブリ

カメラアセンブリの一端には、レンズアセンブリ(センサーに光を集めるために配置された1つまたは複数のレンズ)があります。レンズ自体は、フォーカスやズームなどを調整するために動かすことができる。また、フォーカスの維持とコストのバランスを考慮して、レンズを固定することもある。

"An animation of how focus works"

一部のレンズアセンブリは、カメラから異なる距離にある物体にピントを合わせ続けることができるように自動的に調整することができます。これは通常、フレームの特定の領域がどのくらいシャープかを測定し、ピークシャープネスを見つけるためにレンズアセンブリを調整することによって行われます。場合によっては、カメラは常にフレームの中心を使用する。また、ターゲットフォーカス領域を指定できるカメラもあります。この機能の例としては、以下のようなものがある:

  • 顔ズーム:コンピュータ・ビジョンを使って1つまたは複数の顔を検出し、ターゲットとして使用する。
  • タッチでズーム:プレビュー画面でユーザーが手動で領域を選択できるようにする。

センサー

光がセンサーに到達すると、デジタルピクセルに変換される。このプロセスは様々なものに左右されますが、最終的には以下の2つに集約されます:

  • 変換にかかる時間の長さ。露出時間とも呼ばれる。
  • 光の明るさ。

変換にかかる時間が長ければ長いほど、画質は向上する。フラッシュを使えば、より多くの光をセンサーに当てることができ、ピクセルをより速く変換できるため、同じ時間でもより良い画質が得られます。逆に、変換時間を長くすれば、カメラが安定している限り、暗い環境でも写真を撮ることができる。センサーが記録している間にカメラが動くと、得られる画像は不鮮明になる。

画像処理

画像がセンサーに取り込まれた後、カメラのファームウェアは様々な画像処理タスクを実行し、様々なセンサー特性、現在の照明、希望の画像特性を補正します。センサーの画素変換時間が速くなるとデジタルノイズが発生することがあるため、カメラのセンサー設定に基づいて、これを除去するためにある程度の画像処理を行うことができます。

蛍光灯と太陽光では、同じ被写体でも見え方が大きく異なるため、画像のホワイトバランス(光源の色温度の違いによる)に基づいて調整することができます。

"5 examples of various image processing techniques."

また、この段階で「特殊効果」をかけることもできる。モノクロ、セピア、または「ネガ」スタイルの画像を作成することができる。

後世に残すための記録

最後に、完璧にピントが合い、露出され、処理された画像が作成されたら、それを有効活用することができる。カメラ画像は、アプリケーションコードでさらに処理したり(例えば、バーコードの検出やパノラマ画像のつなぎ合わせなど)、JPEGのような一般的なフォーマットに保存したり、ムービーを作成したりすることができます。これらのタスクの多くには、それを支援するクラスがあります。

カメラ実装の詳細

カメラの検出と選択

カメラAPIを使用する前に、実行時にカメラが利用可能かどうかを確認する必要があります。利用可能なカメラがない場合、アプリケーションのカメラ関連機能を無効にすることができます。C++でこのチェックを行うには、以下の例に示すようにQMediaDevices::videoInputs ()関数を使用します:

bool checkCameraAvailability()
{
    if (QMediaDevices::videoInputs().count() > 0)
        return true;
    else
        return false;
}

C++ ではQCamera クラスを、QML ではCamera 型を使用してカメラにアクセスします。

複数のカメラを使用できる場合、どのカメラを使用するかを指定できます。

C++の場合:

const QList<QCameraDevice> cameras = QMediaDevices::videoInputs();
for (const QCameraDevice &cameraDevice : cameras) {
    if (cameraDevice.description() == "mycamera")
        camera = new QCamera(cameraDevice);
}

QML では、Camera::cameraDevice プロパティを設定することでカメラを選択できます。また、カメラ情報ではなく、システム上の物理的な位置でカメラを選択することもできます。これは、前面カメラと背面カメラを搭載していることが多いモバイル機器では便利です。

C++では

camera = new QCamera(QCameraDevice::FrontFace);

QML では、Camera cameraDevice プロパティを設定します。利用可能なカメラはMediaDevices.videoInputs で取得できます。

QMLでは

Camera {
    position: Camera.FrontFace
}

QCameraDevice と position の両方が指定されていない場合、デフォルトのカメラが使用されます。デスクトップ・プラットフォームでは、デフォルトのカメラはユーザーがシステム設定で設定します。モバイル機器では、通常、背面カメラがデフォルトのカメラになります。QMLのQMediaDevices::defaultVideoInput ()またはMediaDevices.defaultVideoInputでデフォルトカメラを取得できます。

プレビュー

厳密には必要ではありませんが、カメラが何を指しているかを確認できると便利なことがよくあります。これはプレビューとして知られています。

QMLを使うかC++を使うかによりますが、複数の方法でこれを行うことができます。QMLでは、Camera と videoOutputを一緒に使って、captureSessionを監視することができます。

Item {
    VideoOutput {
        id: output
        anchors.fill: parent
    }
    CaptureSession {
        videoOutput: output

        Camera {
            // You can adjust various settings in here
        }
    }
}

C++ の場合は、ウィジェットを使うか、QGraphicsView を使うかによって選択します。ウィジェットの場合はQVideoWidget クラスを使い、QGraphicsVideoItem の場合はQGraphicsView を使うと便利です。

QMediaCaptureSession captureSession;
camera = new QCamera;
captureSession.setCamera(camera);
viewfinder = new QVideoWidget;
captureSession.setVideoOutput(viewfinder);
viewfinder->show();

camera->start(); // to start the camera

高度な使い方(プレビュー・フレームを随時処理し、オブジェクトやパターンを検出できるようにする)をする場合は、独自のQVideoSink を使用し、それをQMediaCaptureSession の videoOutput として設定することもできます。 この場合、videoFrameChanged() シグナルから受信したデータを処理することで、プレビュー画像を自分でレンダリングする必要があります。

QMediaCaptureSession captureSession;
camera = new QCamera;
captureSession.setCamera(camera);
mySink = new QVideoSink;
captureSession.setVideoOutput(mySink);

camera->start();
// MyVideoSink::setVideoFrame(..) will be called with video frames

モバイル・デバイスでは、プレビュー画像はデフォルトでデバイスと同じ向きに表示されます。したがって、ユーザーがデバイスを回転させると、プレビュー画像は縦向きと横向きの間で切り替わります。録画を開始すると、向きは固定されます。ユーザーエクスペリエンスの低下を避けるため、録画中はアプリケーションのユーザーインターフェイスの向きもロックする必要があります。これは、QWindowcontentOrientation プロパティを使用して実現できます。

静止画像

ビューファインダーを設定し、写真になりそうなものを見つけたら、画像をキャプチャするために、新しいQImageCapture オブジェクトを初期化する必要があります。あとはカメラを起動して画像をキャプチャするだけだ。

QMediaCaptureSession captureSession;
camera = new QCamera;
captureSession.setCamera(camera);
imageCapture = new QImageCapture;
captureSession.setImageCapture(imageCapture);

camera->start(); // Viewfinder frames start flowing

//on shutter button pressed
imageCapture->capture();

動画

前回は静止画をキャプチャするコードを見た。動画を録画するには、QMediaRecorder

ビデオを録画するには、前回と同様にカメラ・オブジェクトを作成する必要がありますが、今回はビューファインダーを作成するだけでなく、メディア・レコーダー・オブジェクトも初期化します。

QMediaCaptureSession captureSession;
camera = new QCamera;
captureSession.setCamera(camera);
recorder = new QMediaRecorder(camera);
captureSession.setRecorder(recorder);

camera->start();

// setup output format for the recorder
QMediaFormat format(QMediaFormat::MPEG4);
format.setVideoCodec(QMediaRecorder::VideoCodec::H264);
format.setAudioCodec(QMediaRecorder::AudioCodec::MP3);
recorder->setMediaFormat(settings);

//on shutter button pressed
recorder->record();

// sometime later, or on another press
recorder->stop();

QMediaRecorderからのシグナルをスロットに接続して、エンコード・プロセスの状態の変化やエラー・イベントに反応させることができます。QMediaRecorder::record()がコールされると録画が開始される。これにより、シグナルrecorderStateChanged ()が発せられる。録画はQMediaRecorder の record(), stop(), pause() スロットによって制御される。

画像処理パイプラインの制御

画像や動画をキャプチャするための基本的なことは理解できたと思うが、画像処理パイプラインを制御して面白いテクニックを実現する方法はいくつもある。先に説明したように、いくつかの物理的・電子的要素が組み合わさって最終的な画像が決定されるので、さまざまなクラスを使ってそれらを制御することができます。

フォーカスとズーム

QCamera FocusMode FocusMode は や などの設定を扱います。QCamera::FocusModeAuto QCamera::FocusModeInfinity

これをサポートするカメラ・ハードウェアの場合、QCamera::FocusModeAutoNear 、センサーの近くにあるものを撮像することができます。これは、バーコード認識や名刺スキャンのような用途に便利です。

フォーカスに加えて、QCamera では、setZoomFactor() またはzoomTo() を使用して、利用可能なズーム機能を制御できます。利用可能なズーム範囲は制限されているか、完全にユニティー(1:1)に固定されている可能性があります。使用可能な範囲は、minimumZoomFactor() およびmaximumZoomFactor() で確認できます。

露出、シャッタースピード、フラッシュ

カメラのセンサーに当たる光の量、つまり得られる画像の品質に影響する設定がいくつかあります。

自動画像撮影の主な設定はexposure modeflash mode です。その他のいくつかの設定(ISO 設定や露出時間など)は通常自動で管理されますが、必要に応じて上書きすることもできます。

最後に、このクラスを使用してフラッシュハードウェア(存在する場合)を制御できます。場合によっては、ハードウェアはトーチとしても機能します。

画像処理

QCamera クラスでは、パイプラインの画像処理部分を調整できます。これらの設定には以下が含まれます:

ほとんどのカメラはこれらすべての自動設定をサポートしているので、ユーザーが特定の設定を望まない限り、調整する必要はありません。

非同期操作のキャンセル

画像の取り込みやオートフォーカスなど、さまざまな操作は非同期で行われます。これらの操作は、カメラがサポートしている限り、新しい操作の開始によってキャンセルできることがよくあります。

C++とQMLのサンプルがあります。

C++の例

Camera Example

静止画のキャプチャやビデオの録画方法を示しています。

QMLの例

QML Camera Application

このQt Quickベースのアプリケーションは、APIを使って静止画や動画をキャプチャする方法を示しています。

QML Video Recorder

Qt Quickを使って音声と動画を記録する。

参考ドキュメント

C++クラス

QCamera

システム・カメラ・デバイス用インターフェース

QCameraDevice

カメラ・デバイスに関する一般情報

QCameraFormat

カメラ・デバイスがサポートするビデオ・フォーマットを記述します。

QImageCapture

メディア・コンテンツの録画に使用

QMLタイプ

Camera

フォーカスやズームに関するカメラ設定のためのインターフェース

ImageCapture

カメラ画像をキャプチャするためのインターフェース

©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。