카메라 개요

Qt Multimedia API는 다양한 카메라 관련 클래스를 제공하므로 모바일 디바이스 카메라 또는 웹 카메라의 이미지와 동영상에 액세스할 수 있습니다. 일반적인 작업을 위한 C++ 및 QML API가 모두 있습니다.

카메라 기능

카메라 클래스를 사용하려면 카메라 작동 방식에 대한 간략한 개요가 필요합니다. 이미 익숙하다면 카메라 구현 세부 사항으로 건너뛰셔도 됩니다. 카메라 작동 방식에 대한 자세한 설명은 다음 YouTube 동영상을 참조하세요.

렌즈 어셈블리

카메라 어셈블리의 한쪽 끝에는 렌즈 어셈블리(센서에 빛을 집중시키기 위해 배열된 하나 이상의 렌즈)가 있습니다. 렌즈 자체를 이동하여 초점 및 줌과 같은 기능을 조정할 수 있습니다. 초점 유지와 비용 사이의 균형을 맞추기 위해 렌즈를 고정할 수도 있습니다.

"An animation of how focus works"

일부 렌즈 어셈블리는 카메라에서 다른 거리에 있는 피사체의 초점을 유지할 수 있도록 자동으로 조정할 수 있습니다. 이는 일반적으로 프레임의 특정 영역이 얼마나 선명한지 측정한 다음 렌즈 어셈블리를 조정하여 최대 선명도를 찾는 방식으로 이루어집니다. 어떤 경우에는 카메라가 항상 프레임의 중앙을 사용합니다. 다른 경우에는 카메라가 이 목표 초점 영역을 지정할 수도 있습니다. 이 기능의 몇 가지 예는 다음과 같습니다:

  • 얼굴 줌: 컴퓨터 비전을 사용하여 하나 이상의 얼굴을 감지하고 타겟으로 사용합니다.
  • 터치하여 확대합니다: 사용자가 미리 보기 화면을 통해 수동으로 영역을 선택할 수 있도록 합니다.

센서

빛이 센서에 도달하면 디지털 픽셀로 변환됩니다. 이 과정은 여러 가지 요소에 따라 달라질 수 있지만 궁극적으로 두 가지로 요약됩니다:

  • 변환에 걸리는 시간. 노출 시간이라고도 합니다.
  • 빛의 밝기.

변환에 걸리는 시간이 길수록 결과 이미지 품질이 좋아집니다. 플래시를 사용하면 센서에 더 많은 빛이 닿도록 하여 픽셀을 더 빨리 변환할 수 있으므로 같은 시간 동안 더 좋은 화질을 얻을 수 있습니다. 반대로 변환 시간을 길게 설정하면 카메라가 안정적으로 작동하는 한 어두운 환경에서도 사진을 촬영할 수 있습니다. 센서가 촬영하는 동안 카메라가 움직이면 결과 이미지가 흐려집니다.

이미지 처리

센서로 이미지를 캡처한 후 카메라 펌웨어는 다양한 센서 특성, 현재 조명 및 원하는 이미지 속성을 보정하기 위해 다양한 이미지 처리 작업을 수행합니다. 센서 픽셀 변환 시간이 빨라지면 디지털 노이즈가 발생할 수 있으므로 카메라 센서 설정에 따라 이를 제거하기 위해 일정량의 이미지 처리가 수행될 수 있습니다.

또한 이 단계에서 이미지의 색상을 조정하여 다양한 광원을 보정할 수 있습니다. 형광등과 햇빛은 같은 물체라도 매우 다르게 보이므로 (광원의 색온도가 다르기 때문에) 사진의 화이트 밸런스에 따라 이미지를 조정할 수 있습니다.

"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로 검색할 수 있습니다.

로 검색할 수 있습니다:

Camera {
    position: Camera.FrontFace
}

QCameraDevice 및 위치가 모두 지정되지 않은 경우 기본 카메라가 사용됩니다. 데스크톱 플랫폼의 경우 기본 카메라는 사용자가 시스템 설정에서 설정합니다. 모바일 디바이스에서는 일반적으로 뒷면 카메라가 기본 카메라로 설정됩니다. 기본 카메라는 QMediaDevices::defaultVideoInput() 또는 MediaDevices.defaultVideoInput을 사용하여 QML에서 가져올 수 있습니다.

미리보기

반드시 필요한 것은 아니지만 카메라가 무엇을 가리키고 있는지 확인할 수 있으면 유용할 때가 많습니다. 이를 미리보기라고 합니다.

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 클래스가 사용되며, QGraphicsVideoItemQGraphicsView 에 유용합니다.

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() 슬롯에 의해 제어됩니다.

이미징 파이프라인 제어하기

이제 이미지와 동영상 캡처의 기본 사항을 살펴보았으므로 이미징 파이프라인을 제어하여 몇 가지 흥미로운 기술을 구현할 수 있는 여러 가지 방법이 있습니다. 앞서 설명한 것처럼 여러 물리적 요소와 전자적 요소가 결합하여 최종 이미지를 결정하며, 다양한 클래스를 사용하여 이를 제어할 수 있습니다.

초점 및 줌

QCameraFocusMode, FocusModeQCamera::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

카메라 이미지 캡처를 위한 인터페이스

© 2025 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.