안녕하세요.
이번 챕터 내용은 이전 ImageViewer 내용에 이어 프로젝트를 진행하려고 합니다.
Blur 기능으로 이미지를 흐리게 만드는 메뉴를 만들어 OpenCV 기능을 사용하는 것입니다.
그리고 windows 상에서 OpenCV를 설치해 보고 Qt5와 연동해서 작동해 보는 것 까지라고 생각하시면 됩니다.
책 내용은 리눅스로 되어 있지만 실제 컴파일하는 작업은 윈도우에서 테스트하므로 이점 참고하시면 좋을 듯합니다.
1. 두 번째 프로젝트 위한 작업
1) 프로젝트 이름 바꾸기
- ImageViewer 내용을 보신 분이라면, OpenCV를 사용하는 내용부터는 ImageEditor로 프로젝트명을 바꿔 진행합니다.
그래서 ImageViewer로 테스트했던 폴더를 복사한 후 폴더 이름과 Project 이름을 ImageViewer에서 ImageEditor로 바꿉니다.
- imageEditor.pro를 실행시켜서 .pro 파일내용에서 TARGET 부분을 ImageEditor로 바꿔줍니다.
그리고 main.cpp 에 window.setWindowTitle("ImageEditor")로 수정합니다.
Build 메뉴에 Clean All Projects 한번 해주고 Build All Projects를 실행해서 컴파일해 줍니다. 그러면 프로젝트 이름이 바뀐 상태로 실행됩니다.
2. OpenCV의 Blur 기능을 사용하기 위한 선작업
- 기존의 Viewer 프로젝트를 연이어서 불러온 이미지를 흐리게 만드는 것입니다. 그러기 위해서 메뉴를 하나 추가하고 OpenCV 처리하는 선 작업을 진행합니다.
1) 메뉴 만들어 놓기
- mainwindow.h 파일과 mainwindow.cpp 에 들어가서 새로운 메뉴를 위한 변수와 액션을 위한 함수들을 만들어줍니다. mainwindow.h 에 선언해 줍니다.
QMenu *editMenu;
QToolBar *editToolBar;
QAction *blurAction;
// for editting in the private slots
void blurImage();
mainwindow.cpp 에 구현해 줍니다.
- MainWindow::initUI() 내에 추가
editMenu = menuBar()->addMenu("&Edit");
editToolBar = addToolBar("Edit");
- MainWindow::createActions()
blurAction = new QAction("Blur", this);
editMenu->addAction(blurAction);
editToolBar->addAction(blurAction);
- 실제 기능이 들어가기 전에 테스트 메시지를 출력해 봅니다.
void MainWindow::blurImage() {
qDebug() << "Blurring the image!";
}
- mainwindow::createActions() 함수에 액션에 맞는 시그널을 연결합니다.
connect(blurAction, SIGNAL(triggered(bool)), this, SLOT(blurImage()));
- 실행하면 Blur 메뉴가 생성되고 클릭하면 Application Output 창에 메시지가 나오는 것을 확인할 수 있습니다.
2) OpenCV 설치하기
- https://opencv.org/releases.html 가서 windows 최신 버전을 다운로드하여 설치합니다. 책에 나와있는 것은 linux 받아 설치하는 것이므로 다를 수 있습니다.
- 현재 버전은 opencv-4.5.3이므로 이 버전을 설치합니다. 원하는 경로에 압축을 우선 풉니다. 푸는 폴더에 opencv폴더가 만들어집니다. D:\에 압축을 풀고 시작해 보았습니다.
- MinGW 환경변수를 등록해 줍니다. 내 컴퓨터 아이콘에서 오른쪽 마우스를 눌러 고급설정 -> 시스템 환경변수 설정에서 Path에 아래 경로를 추가해 줍니다. (본인이 설치한 Qt 경로 기준으로 하시면 됩니다.)
예) C:\Qt\Qt5.12.11\Tools\mingw730_64\bin
- opencv를 빌드하기 위해서 cmake 사이트로 가서 최신 파일(cmake-3.20.5-windows-x86_64)을 다운로드하여 설치합니다. (모든 사용자가 사용할 수 있게 PATH 경로 추가되도록 선택합니다.)
- C:\Program Files\CMake\bin 있는 cmake-gui를 실행합니다.
Source code 부분에 opencv 경로를 넣고 Binaries에 결과물 라이브러리가 나오는 경로를 선택합니다. 그리고 configure를 누르면 generator for this project 선택하는 것이 나오는데 여기서 사용하는 것이 mingw 이므로 MinGW makefile를 선택합니다. (생성되는데 시간이 조금 걸립니다.)
- 그러면 선택할 수 있는 옵션이 나오는데 여기서 우리가 필요한 것은 WITH_QT와 WITH_OPENGL를 선택해서 다시 Configure를 눌러서 진행을 합니다.
- Qt_DIR 경로를 잘못 입력하면 다음으로 넘어가지 않고 계속 에러 발생합니다. 그래서 구글링 해서 어떤 경로를 찾는지 확인해 보았습니다.
- C:\Qt\Qt5.12.11\5.12.11\mingw73_64\lib\cmake\Qt5 같이 경로를 입력하면 정상적으로 Configure이 된 것을 확인할 수 있습니다. 그리고 Generate를 눌러서 마무리합니다.
- configure 한 경로로 release 폴더로 이동을 합니다. 그리고 실제로 소스를 컴파일러 환경에 맞게 컴파일시키기 위해 프로세서를 4개로 만들어 컴파일을 수행합니다. (시간이 조금 걸립니다.)
mingw32-make -j 4
- 완료된 라이버러리를 설치합니다.
mingw32-make install
- 마지막으로 라이브러리 경로를 윈도우 환경변수에 추가해 줍니다.
내 컴퓨터 -> 속성-> 고급 시스템 설정 -> 환경변수-> Path에 추가
D:\opencv\release\install\x64\mingw\bin
3. Blur 기능 프로그램 하기
1) OpenCV 경로 설정해 주기
- ImageEditor.pro에 OpenCV 헤더 파일 경로와 사용할 라이브러리를 지정해 줍니다. 컴파일한 경로나 라이브러리를 경로 등을 잘못 설정하면 에러가 발생하면서 컴파일이 안되므로 주의해서 경로를 입력해주어야 합니다.
win32 {
INCLUDEPATH += D:/opencv/release/install/include
LIBS += -Ld:/opencv/release/install/x64/mingw/bin \
-lopencv_core453 \
-lopencv_imgproc453
}
2) mainwindow.cpp 소스 수정하기
- OpenCV 사용할 수 있도록 해더 파일을 추가해 줍니다.
#include "opencv2/opencv.hpp"
- blurImage() 함수를 실제 기능을 구현해 줍니다.
// 이미지를 불러왔는지 확인합니다.
if (currentImage == nullptr) {
QMessageBox::information(this, "Information", "No image to edit.");
return;
}
//OpenCV에서 이미지 작업을 하기 위해서 Matrix 타입으로 만들기 위해서 이미지 변환 작업을 해줍니다.
QPixmap pixmap = currentImage->pixmap();
QImage image = pixmap.toImage();
image = image.convertToFormat(QImage::Format_RGB888);
cv::Mat mat = cv::Mat(
image.height(),
image.width(),
CV_8UC3,
image.bits(),
image.bytesPerLine());
// OpenCV에 있는 blur() 함수를 실행합니다. imgproc 모듈 안에 있는 기능입니다.
// 첫 번째 인수는 원본 이미지, 두 번째 인수는 blur 된 이미지, 세 번째 인수는 커널의 크기입니다. 여기에서 커널은
// OpenCV에게 주어진 픽셀의 값을 서로 다른 양의 인접 픽셀과 결합하여 값을 변경하는 방법을 알려줍니다.
cv::Mat tmp;
cv::blur(mat, tmp, cv::Size(8, 8));
mat = tmp;
//다시 볼 수 있는 형태로 이미지를 복구시킵니다.
QImage image_blurred(
mat.data,
mat.cols,
mat.rows,
mat.step,
QImage::Format_RGB888);
pixmap = QPixmap::fromImage(image_blurred);
imageScene->clear();
imageView->resetMatrix();
currentImage = imageScene->addPixmap(pixmap);
imageScene->update();
imageView->setSceneRect(pixmap.rect());
// 결과 내용을 상태 표시줄에 출력해줍니다.
QString status = QString("(editted image), %1x%2")
.arg(pixmap.width()).arg(pixmap.height());
mainStatusLabel->setText(status);
4. 최종 결과
- 기본 이미지를 불러온 경우
- blur(흐리게 하는 기능)을 사용한 경우 원본 이미지에 비해 흐리게 변환 것을 볼 수 있습니다.
감사합니다.
<참고 사이트>
1. 윈도우(Windows)에서 CMake 설치하는 방법
https://ndb796.tistory.com/365
2. Qt5_DIR-NOTFOUND
https://forum.qt.io/topic/125831/qt5_dir-notfound/11
3. [QT] OpenCV 사용하기 - 환경 설정 방법 [For Windows]
https://iam777.tistory.com/419
4. Windows 10에 openCV 3.4.0와 Qt 설치하기
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=nortul&logNo=221178308242