Programming/Qt

[도서 실습] Qt 5 and OpenCV 4 Computer Vision – The GazerW Application (Qt Library를 이용해서 카메라 영상 출력)

변화의 물결1 2024. 2. 15. 00:05

 

 

안녕하세요.

 

 이전 내용에서는 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

GazerW_day4.zip
0.01MB

반응형