안녕하세요.
이번 내용은 Erode(부식, 침식)되는 기능을 플러그인 파일(.so 혹은 .dll)로 만들어서 메인 프로그램에서 사용할 수 있게 하는 것입니다. 내용과 순서가 약간 어려울 수 있습니다. 책을 보며 따라 하는데 잘 안되어서 시간이 조금 걸렸습니다.
1. Erode는?
용어 정리가 간단하게 정리된 글이 있어 가져와 보았습니다.
여러 가지 모폴로지 기법 중 기본적인 팽창과 침식에 대해서 알아본다. 이들 기법은 영상 내에서 잡음 제거, 또는 구성 요소들의 결합 또는 분리 등의 폭넓은 분야에서 널리 사용된다. 잡음이 존재하는 영상에 침식과 팽창을 적절하게 사용하여 잡음을 제거하고 완하 시킬 수 있다.
Erode 연산 : 필터 내부의 가장 낮은(어두운) 값으로 변환(and) - 침식 연산
Dilate 연산 : 필터 내부의 가장 높은(밝은) 값으로 변환(or) - 팽창 연산
두 연산은 순서에 따라 서로 다른 기능을 한다.
Erode - Dilate = Opening 연산 : 주로 작은 노이즈들을 제거하는 데 사용한다.
Dilate - Erode = Closing 연산 : 보통 한 객체를 추출했을 때 두 개 이상의 작은 부분으로 나올 경우 큰 객체로 합칠 때 사용한다.
출처: https://dyndy.tistory.com/252 [DY N DY]
2. 이미지 침식(Erode) 기능 플러그인 프로젝트 만들기
- ErodePlugin 폴더를 하나 만들어 그 안에 새로운 프로젝트를 생성합니다. Library -> C++ Library로 생성합니다.
- 파일 이름과 설정을 해줍니다. 파일 이름 형식은 편하게 만들면 됩니다.
- Erode_Plugin.pro 파일을 열어서 지난번 사용했던 OpenCV 경로를 마지막 줄에 추가해 줍니다.
win32 {
INCLUDEPATH += D:/opencv/release/install/include
LIBS += -Ld:/opencv/release/install/x64/mingw/bin \
-lopencv_core453 \
-lopencv_imgproc453
}
3. 플러그인 인터페이스 만들기(The plugin interface)
- Qt에 있는 플러그인 메커니즘은 기능 확장에 있어 강력한 기능입니다. 이 메커니즘을 사용하여 새로운 편집 기능을 쉽게 라이브러리 파일로 추가할 수 있기 때문입니다.
- 플러그인 기능을 구현하기 위해서 첫 번째로 애플리케이션과 플러그인 간에 프로토콜 인터페이스를 만들어야 합니다. 그래서 editor_plugin_interface.h로 새 파일을 하나 만들고 소스를 추가합니다.
- Headers에서 오른쪽 버튼을 눌러 "Add New..." 선택합니다. 그리고 C/C++에서 "Header File"을 추가합니다. 그리고 editor_plugin_interface.h 이름으로 파일을 생성합니다.
- 가상 함수로 클래스를 구성하고 Mat에 대한 작업 이름과 작업을 처리하므로 다음과 같이 인터페이스를 선언합니다. edit 함수는 Mat의 두 개의 입력 및 출력 인자를 사용하며 편집 작업에 사용됩니다. 각 플러그인은 이 인터페이스의 하위 클래스가 될 것입니다.
- EDIT_PLUGIN_INTERFACE_IID는 유일한 아이디로 현재 애플리케이션에서 고유한 값으로 지정되어야 합니다.
#ifndef EDITOR_PLUGIN_INTERFACE_H
#define EDITOR_PLUGIN_INTERFACE_H
#include <QObject>
#include <QString>
#include "opencv2/opencv.hpp"
class EditorPluginInterface
{
public:
virtual ~EditorPluginInterface() {};
virtual QString name() = 0;
virtual void edit(const cv::Mat &input, cv::Mat &output) = 0;
};
#define EDIT_PLUGIN_INTERFACE_IID "com.qt.editorplugininterface"
Q_DECLARE_INTERFACE(EditorPluginInterface, EDIT_PLUGIN_INTERFACE_IID);
#endif
4. 이미지 침식(Erode) 기능 플러그인 소스
- erode_plugin_global.h 파일이 같이 생성이 되는데 오른쪽 버튼을 눌러서 지워줍니다. (Remove-Delete file permanently 체크)
- erode_plugin.h 파일에 #include 부분과 기본 생성되는 생성자를 지워줍니다. 아래의 내용으로 바꿔줍니다.
#include <QObject>
#include <QtPlugin>
#include "editor_plugin_interface.h"
class ErodePlugin: public QObject, public EditorPluginInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID EDIT_PLUGIN_INTERFACE_IID);
Q_INTERFACES(EditorPluginInterface);
public:
QString name();
void edit(const cv::Mat &input, cv::Mat &output);
};
- erode_plugin.cpp 파일 소스 코드를 추가해 줍니다. 소스 자체는 간단합니다. plugin이름을 알려주고, OpenCV에서 제공해 주는 함수를 간단하게 호출만 해주고 있습니다. Erode는 이미지의 앞쪽이나 값이 1인 개체를 축소하는 과정입니다. 물체 경계를 부드럽게 하고 작은 물체를 제거합니다.
- & 참조 연산자를 사용해서 값에 접근해서 처리하기 때문에 결괏값을 별도로 리턴하지 않았습니다.
#include "erode_plugin.h"
QString ErodePlugin::name()
{
return "Erode";
}
void ErodePlugin::edit(const cv::Mat &input, cv::Mat &output)
{
erode(input, output, cv::Mat());
}
5. 결과 확인
- Run을 실행 컴파일을 시켜서 아무 문제가 없다면, 실행파일에 대한 이슈가 나타납니다. 이것은 무시하시고 실제 생성된 폴더가 이동해 봅니다.
- Erode_Plugin.dll 파일이 생성된 것을 알 수 있습니다.
- 리눅스에서 작업을 했다면, .so 파일이 생성되었을 겁니다. 나중에 이 dll 파일을 메인 프로그램에서 불러와서 작동시켜 보겠습니다.
감사합니다.
<참고자료>
1. [BOOK] Qt-5-and-OpenCV-4-Computer-Vision-Projects
2. opencv dilate/erode 연산 정리