안녕하세요.
이전 내용에서는 OpenCV 라이브러리를 이용해서 카메라 영상을 출력해 보았습니다. 그러나 한 가지 단점이 있는 것은 Qt 프로그램과 함께 OpenCV 라이브러리도 가지고 있어야 하고 실행파일의 용량도 커질 수 있다는 것이었습니다.
만약 단순한 영상 출력 프로그램을 만든다고 한다면 OpenCV를 사용하지 않고 Qt라이브러리를 이용해서 영상을 출력을 해줄 수 있다면 좀 더 가벼운 프로그램으로 만들 수 있을 것으로 생각되어 확인해 보았습니다.
1. 소스 추가
- 아래의 소스 내용은 일부분만 설명되었고 전체 소스는 첨부파일을 참고하시면 됩니다.
<mainwindow.h>
- 단순하게 Qt Library로 영상을 출력하기 위해서는 기존에 QGraphicSence와 QGraphicsView 오브젝트 대신해서 QCamera와 QCameraViewfinder 오브젝트를 이용해서 화면을 출력합니다.
- QCamera와 QCameraViewfinder 라이브러리를 Include 시키고 화면 출력해 줄 객체를 변수로 선언합니다. 선언할 때 "전처리 지시어"인 #ifdef #endif 사용하여 Qt라이브러리 사용할 때와 OpenCV 사용할 때를 구분할 수 있도록 합니다.
#include <QCamera>
#include <QCameraViewfinder>
...
#ifdef GAZER_USE_QT_CAMERA
QCamera *camera;
QCameraViewfinder *viewfinder;
#endif
<mainwindow.cpp>
- initUI() 함수 내에 기존에 QGraphicsScene, QGraphicsView 생성 코드 위쪽에 QCamera 클래스를 생성하는 코드를 GAZER_USE_QT_CAMERA 선언되어 있을 때와 아닐 때로 구분하여 정의합니다.
- settings.setResolution(QSize(800, 600)); 코드에서 가지고 있는 카메라 해상도보다 높게 설정할 경우 영상이 나오지 않을 수 있으니 확인하셔야 합니다.
#ifdef GAZER_USE_QT_CAMERA
QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
// I have two cameras and use the second one here
camera = new QCamera(cameras[0]);
viewfinder = new QCameraViewfinder(this);
QCameraViewfinderSettings settings;
// the size must be compatible with the camera
settings.setResolution(QSize(320, 240));
camera->setViewfinder(viewfinder);
camera->setViewfinderSettings(settings);
main_layout->addWidget(viewfinder, 0, 0, 12, 1);
#else
imageScene = new QGraphicsScene(this);
imageView = new QGraphicsView(imageScene);
main_layout->addWidget(imageView, 0, 0, 12, 1);
#endif
- openCamera() 함수도 GAZER_USE_QT_CAMERA가 선언되어 있을 때와 그렇지 않을 때를 구분해야 하는데, 편의상 동일한 이름의 함수를 두 개 만들어 선언 시 호출되는 것과 아닌 것으로 구분하였습니다. 이것이 가능한 이유는 #ifdef 가 전처리 지시어이기 때문에 컴파일 이전에 소스코드를 확인해서 필요한 내용을 구분한 후 컴파일하기 때문입니다.
#ifdef GAZER_USE_QT_CAMERA
void MainWindow::openCamera()
{
camera->setCaptureMode(QCamera::CaptureVideo);
camera->start();
}
#else
void MainWindow::openCamera()
{
int camID = 0;
capturer = new CaptureThread(camID, data_lock);
...
}
#endif
<GazerW.pro>
- 필요한 모듈과 GAZER_USE_QT_CAMERA 매크로를 선언해 줍니다. 그리고 OpenCV를 사용하지 않고 Qt Library를 사용하여 카메라를 영상을 출력하려면 GAZER_USE_QT_CAMERA=1로 OpenCV로 영상 출력하려면 맨 앞에 #을 붙여 주석으로 해서 빌드하면 됩니다. (#DEFINES += GAZER_USE_QT_CAMERA=1)
# Using OpenCV or QCamera
DEFINES += GAZER_USE_QT_CAMERA=1
QT += core gui multimedia multimediawidgets
2. 빌드하기
- 소스 추가 후 문제가 없다면 Build 하고 Run을 하면 문제없이 실행이 됩니다. 많은 기능들을 포함되지 않아서 그런지 큰 차이를 느끼지는 못했습니다.
- 향후 OpenCV를 사용하지 않고 카메라 영상만 출력한다면 이 방법으로 간단하게 소스를 만들면 되고, 영상처리 등을 고려하여 작업한다면 OpenCV 라이브러리를 이용해서 영상을 출력하면 될 것으로 생각됩니다.
감사합니다.
<참고사이트>
1. [BOOK] Qt-5-and-OpenCV-4-Computer-Vision-Projects