카메라 개요
Qt Multimedia API는 다양한 카메라 관련 클래스를 제공하므로, 모바일 기기 카메라나 웹캠에서 촬영한 이미지 및 동영상에 접근할 수 있습니다. 일반적인 작업을 수행하기 위한 C++ 및 QML API가 모두 제공됩니다.
카메라 기능
카메라 클래스를 사용하려면 카메라의 작동 원리에 대한 간략한 개요가 필요합니다. 이미 이에 대해 잘 알고 계신다면 ‘카메라 구현 세부 사항’ 섹션으로 건너뛸 수 있습니다. 카메라 작동 방식에 대한 더 자세한 설명은 다음 YouTube 동영상을 참조하십시오.
렌즈 어셈블리
카메라 어셈블리의 한쪽 끝에는 렌즈 어셈블리(빛을 센서에 집중시키도록 배열된 하나 이상의 렌즈)가 있습니다. 렌즈 자체는 초점이나 줌 등을 조정하기 위해 때때로 이동될 수 있습니다. 또한 초점 유지와 비용 간의 적절한 균형을 맞추기 위해 고정된 배열로 구성될 수도 있습니다.

일부 렌즈 어셈블리는 카메라로부터 거리가 다른 피사체도 초점이 맞도록 자동으로 조정될 수 있습니다. 이는 일반적으로 프레임의 특정 영역이 얼마나 선명한지 측정한 다음, 렌즈 어셈블리를 조정하여 선명도가 가장 높은 지점을 찾는 방식으로 이루어집니다. 경우에 따라 카메라는 이를 위해 항상 프레임의 중심을 사용합니다. 다른 경우에는 카메라에서 이 목표 초점 영역을 직접 지정할 수 있도록 허용하기도 합니다. 이 기능의 예로는 다음과 같은 것들이 있습니다:
- 얼굴 줌: 컴퓨터 비전을 사용하여 하나 이상의 얼굴을 감지하고 이를 대상으로 활용합니다.
- 터치 줌: 사용자가 미리보기 화면을 통해 수동으로 영역을 선택할 수 있도록 하는 기능.
센서
빛이 센서에 도달하면 디지털 픽셀로 변환됩니다. 이 과정은 여러 요인에 따라 달라질 수 있지만, 궁극적으로는 다음 두 가지로 귀결됩니다:
- 변환에 허용되는 시간, 즉 노출 시간.
- 빛의 밝기.
변환에 허용되는 시간이 길수록 결과물의 화질이 더 좋아집니다. 플래시를 사용하면 센서에 더 많은 빛이 닿도록 도와주어, 센서가 픽셀을 더 빠르게 변환할 수 있게 함으로써 동일한 시간 내에 더 나은 화질을 얻을 수 있습니다. 반대로, 변환 시간을 더 길게 설정하면 카메라가 흔들리지 않는 한 더 어두운 환경에서도 사진을 찍을 수 있습니다. 센서가 기록하는 동안 카메라가 움직이면 결과 이미지가 흐릿해집니다.
이미지 처리
센서가 이미지를 포착한 후, 카메라 펌웨어는 다양한 센서 특성, 현재 조명 조건 및 원하는 이미지 특성을 보정하기 위해 해당 이미지에 대해 다양한 이미지 처리 작업을 수행합니다. 센서 픽셀 변환 속도가 빠를수록 디지털 노이즈가 발생할 수 있으므로, 카메라 센서 설정에 따라 이를 제거하기 위한 일정 수준의 이미지 처리가 이루어질 수 있습니다.
이 단계에서 다양한 광원을 보정하기 위해 이미지의 색상을 조정할 수도 있습니다. 형광등과 햇빛은 동일한 피사체를 매우 다르게 보이게 하므로, 광원의 색온도 차이에 따라 사진의 화이트 밸런스를 기반으로 이미지를 조정할 수 있습니다.

이 단계에서는 일부 “특수 효과”도 적용할 수 있습니다. 흑백, 세피아, 또는 “네거티브” 스타일의 이미지를 생성할 수 있습니다.
후세를 위한 기록
마지막으로, 초점과 노출이 완벽하게 맞춰지고 처리된 이미지가 생성되면 이를 유용하게 활용할 수 있습니다. 카메라로 촬영한 이미지는 애플리케이션 코드를 통해 추가 처리(예: 바코드 인식 또는 파노라마 이미지 합성)하거나, 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 클래스를 사용하면 파이프라인의 이미지 처리 부분을 조정할 수 있습니다. 이러한 설정에는 다음이 포함됩니다:
- white balance (색온도라고도 함)
대부분의 카메라는 이 모든 항목에 대한 자동 설정을 지원하므로, 사용자가 특정 설정을 원하지 않는 한 직접 조정할 필요는 없습니다.
예시
C++ 및 QML 예제가 모두 제공됩니다.
C++ 예제
정지 이미지를 캡처하거나 동영상을 녹화하는 방법을 보여줍니다. |
QML 예제
이 Qt Quick 기반 애플리케이션은 API를 사용하여 정지 이미지나 동영상을 캡처하는 방법을 보여줍니다. | |
Qt Quick 를 사용하여 오디오 및 동영상 녹화하기. |
참조 문서
C++ 클래스
시스템 카메라 장치용 인터페이스 | |
카메라 장치에 대한 일반 정보 | |
카메라 장치에서 지원하는 비디오 형식을 설명합니다 | |
미디어 콘텐츠 녹화에 사용됨 |
QML 유형
초점 및 줌과 관련된 카메라 설정을 위한 인터페이스 | |
카메라 이미지 캡처를 위한 인터페이스 |
© 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.