このページの内容

カメラの概要

Qt Multimedia API は、モバイルデバイスのカメラやウェブカメラから画像や動画にアクセスできるようにするための、カメラ関連のクラスを多数提供しています。一般的なタスクには、C++ API と QML API の両方が用意されています。

カメラの機能

カメラクラスを使用するには、カメラの仕組みについて簡単に理解しておく必要があります。すでにこの点についてご存知の場合は、「カメラの実装の詳細」までスキップしてください。カメラの仕組みに関するより詳細な説明については、以下のYouTube動画をご覧ください。

レンズアセンブリ

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

フォーカスの仕組みを説明するアニメーション

レンズアセンブリの中には、カメラから異なる距離にある被写体を常にピントに合わせられるよう、自動的に調整されるものもあります。これは通常、フレーム内の特定の領域の鮮明度を測定し、鮮明度が最大になるようレンズアセンブリを調整することで行われます。場合によっては、カメラは常にフレームの中心をこの調整の基準として使用します。 また、カメラによっては、このピント合わせの対象領域を指定できる場合もあります。この機能の例としては、次のようなものがあります:

  • フェイスズーム:コンピュータビジョンを用いて1つ以上の顔を検出し、ターゲットとして使用する機能。
  • タッチズーム:ユーザーがプレビュー画面上で手動で領域を選択できるようにする機能。

センサー

光がセンサーに到達すると、デジタルピクセルに変換されます。このプロセスはさまざまな要因に左右されますが、最終的には以下の2つの要素に帰着します:

  • 変換に許容される時間。これは露光時間とも呼ばれます。
  • 光の明るさ。

変換に許容される時間が長ければ長いほど、得られる画像の品質は向上します。フラッシュを使用すると、より多くの光をセンサーに当てるのに役立ち、センサーがピクセルをより速く変換できるようになるため、同じ時間でもより高品質な画像が得られます。 逆に、変換時間を長く設定すれば、カメラが安定している限り、より暗い環境でも撮影が可能になります。センサーが記録中にカメラが動くと、画像はブレてしまいます。

画像処理

センサーによって画像が取り込まれた後、カメラのファームウェアは、センサーの特性、現在の照明条件、および望ましい画像特性を補正するために、さまざまな画像処理を行います。センサーのピクセル変換時間が速いほどデジタルノイズが発生しやすくなるため、カメラのセンサー設定に基づいて、これを除去するための画像処理が一定程度行われることがあります。

また、この段階で画像の色を調整し、異なる光源の影響を補正することも可能です。蛍光灯と太陽光では、同じ被写体でも見た目が大きく異なるため、光源の色温度の違いに応じて、画像のホワイトバランスを調整することができます。

さまざまな画像処理技術の5つの例。

また、この段階で「特殊効果」を施すことも可能です。白黒、セピア、あるいは「ネガ」風の画像を作成することができます。

後世に残すための記録

最後に、ピントが完璧に合い、適切な露出で現像された画像が完成したら、それを有効に活用することができます。カメラで撮影した画像は、アプリケーションコードによってさらに処理(例えば、バーコードの検出やパノラマ画像の合成など)を行ったり、JPEGなどの一般的な形式で保存したり、動画の作成に利用したりすることができます。 これらの作業の多くには、それを支援するクラスが用意されています。

カメラの実装の詳細

カメラの検出と選択

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

bool checkCameraAvailability()
{
    return !QMediaDevices::videoInputs().isEmpty();
}

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++では、カメラ情報ではなく物理的な向きに基づいてカメラデバイスを選択することも可能です。これは、前面カメラと背面カメラを備えていることが多いモバイルデバイスで役立ちます。

C++ では:

camera = new QCamera(QCameraDevice::FrontFace);

QCameraDevice が指定されていない場合、デフォルトのデバイスが使用されます。デフォルトのデバイスは、オペレーティングシステムから提供される情報に基づいて選択されます。デスクトッププラットフォームでは、通常、エンドユーザーがシステム設定でデフォルトのカメラを設定します。 モバイルデバイスでは、通常、背面カメラがデフォルトのカメラデバイスとなります。デフォルトのカメラデバイスは、C++ではQMediaDevices::defaultVideoInput()、QMLではMediaDevices.defaultVideoInput を使用して取得できます。

デフォルトのカメラデバイスは、エンドユーザーが現在のデフォルトのカメラデバイスを切断した結果など、時間の経過とともに変更される場合があります。アプリケーション開発者は、シグナル `QMediaDevices::videoInputsChanged ` が発火した際に、デフォルトのカメラデバイスを再度照会することで、この変更を追跡できます。

プレビュー

厳密には必須ではありませんが、カメラが何を捉えているかを確認できると便利な場合がよくあります。これは「プレビュー」と呼ばれます。

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 クラスが使用され、QGraphicsView を使用する場合はQGraphicsVideoItem が役立ちます。

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

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

静止画

ファインダーを設定し、被写体を見つけたら、画像を撮影するために新しい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;
captureSession.setRecorder(recorder);

camera->start();

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

// 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 mode (自動露出)」と「flash 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

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

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.