이번 시간에는 Dialog Box기반으로 OpenCV를 이용하는 방법에 대해서 알아보겠습니다.
공간 필터링(Spatial Filtering)이란 영상에 있는 공간 주파수 대역을 제거하거나 강조하는 필터 처리입니다. 사용되는 필터의 계수에 따라 특정 주파수를 제거하거나 강조하게 되며, 필터 마스크(Filter Mask)또는 회선 마스크의 가중치 선택이 공간 필터의 행동을 결정하게 됩니다. 영상처리에 사용되는 회선 마스크는 홀수 차원의 정방형 마스크가 사용되게 됩니다.
필터는 입력되는 신호의 일부 성분을 제거하거나 일부 특성을 변경하려고 설계된 하나의 시스템이며 두 종류로 구분됩니다. 첫 번째는 필터의 길이가 한정된 유한임펄스응답(FIR ; Finite Impulse Response)필터이고, 두 번째는 필터의 길이가 무한정한 무한임펄스응답(IIR ; Infinite Impulse Respones)필터입니다. FIR필터는 필터를 설계하기가 쉬우며 따라서 신호도 쉽게 처리할 수 있는 장점을 가지고 있습니다. IIR필터는 필터를 설계하기가 어려우나 필터의 특성은 더 우수합니다. 영상처리에서는 FIR 필터를 더 많이 사용합니다.
컨벌루션(회선;Convolution)이란 선형 시불변 시스템에 입력되는 신호가 어떤 신호를 출력하는지 결정하는 식을 의미합니다.
영상처리는 가로방향과 세로 방향의 처리가 필요한 2차원 처리이며, 필터링을 이용한 영상처리는 2차원의 컨벌루션을 수행하는 것입니다.
OpenCV에서 마스크 모양의 커널(Kernel)을 회선하는 함수는 cvFilter2D입니다. 이 함수를 레퍼런스에서 찾아보면 다음과 같습니다.
cvFilter2D함수는 src영상을 받아 kernel을 가지고 필터링 한 후 dst로 출력해 줍니다. 여기서 anchor은 어느 지점부터 필터링을 시작할 지를 결정해 주는 값이며 기본으로 (-1, -1)위치가 지정됩니다. 이는 공간영역 필터링에서 주변에 테두리가 생기지 않게 됩니다.
이번에 구현할 필터 마스크(Kernel)은 다음과 같습니다.
1. soften filter – 부드러운 효과
2. Enhance focus filter – 물체를 둘러싼 것을 초점을 맞춘 효과
3. Enhance detail filter – 물체를 둘러싼 것을 상세히 드러냄
4. Blur light filter – 블러링 단점인 잡음 미제거 보안 효과
5. Gaussian filter – 블러링 단점인 잡음 미제거 보안 효과
먼저 DeiosImgUtil Class를 작성하도록 하겠습니다. 이 DeiosImgUtil Class에는 이미지의 너비가 4의 배수가 되도록 조정하는 멤버 함수와 이미지를 HBITMAP으로 변환하는 멤버 함수가 들어갑니다.
Class를 만든 후 Resize4Bitmap함수와 IplImage2Bitmap함수를 추가합니다. 원형은 다음과 같습니다.
[Shift + Alt + C]버튼을 눌러 Class 추가 마법사를 실행합니다. 클래스 이름은 FilterDlg로 합니다.
이번에는 Dialog의 각 Control에 대응하는 멤버 변수를 추가해 보겠습니다.
모든 Control의 멤버 변수를 추가할 필요는 없으며, 입력과 출력을 필요로 하는 Control의 멤버 변수만 추가하면 됩니다.
[Ctrl + Shift + X]키를 눌러 Class 마법사를 실행합니다.
CFilterDlg Class의 IDC_COMBO_FILTER_TYPE Control의 멤버 변수를 추가합니다.
클래스 이름과 멤버 변수를 확인 후, 변수 추가 버튼을 클릭합니다.
멤버 변수 이름을 m_combo_filter로 지정합니다.
동일한 방법으로 다음과 같은 멤버 변수를 추가합니다.
IDC_PREVIREW_IMAGE : m_preview_image
이번에는 Dialog 초기화 코드를 작성하겠습니다.
마찬가지 방법으로 OnDestroy멤버 함수도 추가해 줍니다.
이제 FilterDlg.h 파일을 열어 다음과 같은 멤버 변수를 추가합니다.
CvvImage d_org_cvvImage; // 원 영상
CvvImage d_cvvImage; // 필터링 결과 후의 영상
int picture_height; // Picture 컨트롤의 높이 기준
int picture_width; // Picture 컨트롤의 너비 기준(4의 배수)
float soften_mask[9]; // For Soften filtering
float ef_mask[9]; // For Enhance focus filtering
float ed_mask[9]; // For Enhance detail filtering
float bl_mask[9]; // For Blur light filtering
float bb_mask[9]; // For Blur blending filtering
이번 시간은 MFC와 OpenCV의 기본 사용법 마지막 내용이 되겠습니다. Cam 영상을 Dialog에 뿌려주는 부분에서 기본 사용법이 끝났어야 하지만… 조금 아쉬운 관계로 더 진행해 봤죠… 저도 아직 초보단계지만, MFC와 OpenCV의 기본 사용법은 뭐 없습니다… MFC야… GUI프로그래밍을 위해서 그냥 쓴 것이고… OpenCV는 영상을 받아오고, 출력하는 부분만 하면 기본은 끝난거 아닌가요? 지금까지 “오픈소스 OpenCV를 이용한 컴퓨터 비전…
이번에는 본격적으로 OpenCV를 사용하여 영상처리를 해 보겠습니다. 그 첫 단계로 메뉴기반 정지영상 처리를 해 볼 것이며, cvSplit함수를 사용하여 RGB 컬러공간을 분리하는 예제를 구현해 보겠습니다. 먼저 OpenCV 2.1 C API Reference에서 cvSplit함수를 찾아보면 다음과 같습니다. cvSplit함수는 다중 채널(Multi-channel)배열을 여러 개의 단일 채널(Single-channel) 배열로 분할하거나, 배열에서 단일 채널을 추출 할 수 있음을 알 수 있습니다. 또한,…
이번 시간에는 열려있는 모든 창을 닫는 기능을 구현해 보도록 하겠습니다. 먼저 리소스 뷰를 보기 좋게 꺼내어 두는게 좋겠죠? [보기] → [다른 창] → [리소스 뷰]를 클릭합니다. 이번엔 메뉴 바에 해당 기능을 추가할 예정입니다. 리소스 뷰에서 [Menu] → [IDR_*TYPE]을 선택한 후 그림과 같이 지정합니다. Caption : 모든 창 닫기 ID : ID_FILE_CLOSE_ALL Prompt : 열려진…
이번 시간에는 조금 더 재미있는 것을 해 보겠습니다. 바로 요놈입니다. 바로 HyVision System의 HVR-2000 Series입니다. 일반적인 웹캠이야 그냥 연결만 해주면 바로 써먹을 수 있었는데, 요놈은 조금 다릅니다. USB드라이버야 당연히 깔아줘야 하는거고… 별도의 SDK를 이용해서 Cam에 접근하게 됩니다. 하이비전시스템에서 HVR SDK Interface Guide를 친절하게 작성해 주셔서 별 무리 없이 실습을 진행 해 볼…
“Visual Studio 2010에서 OpenCV MFC 프로젝트 만들기(http://deios.kr/400)”에 이어 이번에는 파일 저장기능을 구현해 보도록 하겠습니다. 파일 열기는 OnOpenDocument()함수를 재정의 했던거 기억하시죠? 마찬가지로 파일 저장은 OnSaveDocument()함수를 재정의 하면 됩니다. 이젠 그림만 봐도 아시겠죠? return CDocument::OnSaveDocument(lpszPathName); 부분을 다음과 같이 수정합니다. USES_CONVERSION; return m_CvvImage.Save(W2A(lpszPathName)); 저번에도 말씀드렸지만 OpenCV 라이브러리가 char *형을 받기 때문에 W2A매크로를 사용해 줍니다. 이번에는 새…
이전 시간에 만들었던 모달(Modal) Dialog를 모덜리스(Modeless) Dialog로 변환해 보겠습니다. Modal Dialog는 Dialog가 실행되는 동안 다른 작업을 하지 못하고, Modeless Dialog는 프로그램 실행 흐름을 방해하지 않는다는 것 정도는 알고 계시죠? 자 그럼 이전 시간 “MFC – Cam 영상 출력해보기(http://deios.kr/420)”에 만들었던 View Dialog를 멋지게 바꿔 보겠습니다. OnCamView함수를 다음과 같이 수정합니다. void CMFC_OpenCVApp::OnCamView() { // TODO: 여기에 명령…
6 Comments
View Class에 ID_FILTER2D명령에 함수 추가하는 부분이 잘 안되네요. 저는 Visual Studio 2008을 사용하고 있는데요. Toolbar에 F2를 추가하였는데 View Class에서 ID_FILTER2D를 찾을 수가 없어요. 제가 어떤 부분을 실수한건지 모르겠네요. 작성해주신데로 차례차례 따라했는데… 쉽진 않네요. 아직 경험이 많이 부족해서요.. ^^… 이와 유사한 MFC를 이용한 Cam영상 출력부분도 이상하게 잘 안돼요…Dialog가 제대로 뜨질 않네요. 쩝~~~… 제가 혹시 중요한 무언가를 빠뜨렸을까요?
View Class에 ID_FILTER2D명령에 함수 추가하는 부분이 잘 안되네요. 저는 Visual Studio 2008을 사용하고 있는데요. Toolbar에 F2를 추가하였는데 View Class에서 ID_FILTER2D를 찾을 수가 없어요. 제가 어떤 부분을 실수한건지 모르겠네요. 작성해주신데로 차례차례 따라했는데… 쉽진 않네요. 아직 경험이 많이 부족해서요.. ^^… 이와 유사한 MFC를 이용한 Cam영상 출력부분도 이상하게 잘 안돼요…Dialog가 제대로 뜨질 않네요. 쩝~~~… 제가 혹시 중요한 무언가를 빠뜨렸을까요?
프로젝트 파일 압축해서 올려두었으니…
직접 작성하신거랑 무엇이 다른지 비교해 보시는것도 좋을것 같네요
나름올리셨겠지만 분명 빠진 부분이 있음
이럴바에 올리지말던가 – _ –
멍멍~
빠진부분도 찾지 못해서… 그냥 소스만 C&P하다가 안되니깐 설명탓할빠엔 블로그같은거 보질 말던가 -_-;;;
라고 하면 기분이 엄청 좋으시겠죠???
적어놓고 블로그 방치해놓긴 했지만… 빠진 부분은 없습니다. 혹여 빠진 부분이 있다면 그건 일반적인 프로그래밍 스킬이니 알아서 공부하시길…
감사합니다~ 덕분에 많이 알아가요