이번 시간에는 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
이번에는 자주 사용하는 기능인 C&P(Copy & Paste)를 구현해 보도록 하겠습니다. C&P를 구현하기 위해서는 이미지를 DIB(장치 독립 비트맵;Device Independent Bitmap)으로 변환하여 클립보드 영역에 넘겨주거나, 클립보드 영역에서 데이터를 받아오면 됩니다. 클립보드 영역으로 데이터를 넘겨주기 위하여 CopyClipBoard맴버함수, CopyToHandle 맴버 함수를 추가하여, ID_EDIT_COPY이벤트 핸들러에 등록합니다. 먼저 CopyClipBoard 맴버 함수를 Doc Class에 작성하겠습니다. 반환 형식 : void 함수 이름…
이제 슬슬 공부나 해볼까하고 마음먹던중;;; 그냥 갑자기 C를 하고 싶어졌습니다… 이제까지 하려고 하려고 해도… 귀찮아서 접어두었던 C 책 한권을 꺼내서;;; 첫장을 펼처보니 “Turbo C++”를 설치하라는 겁니다… 전 착한 학생이기 때문에(~ㅋ) 하라는데로 설치했죠;;; 설치하고 보니 이게 왼걸;;; 구석기시대에서나 볼수있는 인터페이스;;; ㄷㄷ;;; 그래서 부대안에 있을때 사용했던 AcroEdit과 연결하기로 마음먹었습니다… 열심히 컴파일러를 찾아 해매였는데…;;; 이게 왠걸;;; 도처히 못찾겠습니다.;;;…
고속 네트워크 프로토콜중leaky bucket, flowspec, RSVP, policing, admission control 등의 유기적인 관계를 정확히 쓰시오(수행 과정, 목적 등) 과 모임을 위하여 술집을 예약하는 과정을 빗대어서 설명.Application은 Network에게 질적인 정보나 양적인 정보를 준다. 질적인 정보는 쉽게 명세가 가능하지만 양적인 정보는 쉽게 명세가 불가능하다. Application이 Network에게 주는 이러한 정보를 flowspec이라고 한다. flowspec은 흐름의 트래픽 특성(양적인 정보)을 묘사하는 부분과…
이전 시간까지는 처음에 만들었던 “MFC_OpenCV”라는 프로젝트를 기준으로 진행하였습니다. 하지만, 이제부터는 새 프로젝트를 만들어서 진행하는 경우가 많이 생길텐데요… 이 때마다 프로젝트 설정을 바꿔줘야 하는게 여간 귀찮은게 아닙니다… 그. 래. 서. 이번 시간에는 이러한 설정을 파일로 저장하고, 가져오는 방법에 대해서 알아보겠습니다. 일단 첨부한 OpenCV210.props 파일을 적당한 디렉토리에 다운로드 하시구요… 먼저 이 파일을 어떻게 불러오는지부터 알아보겠습니다. 먼저 VS2010실행하셔서…
cfile28.uf.1804194F4F95B41B178B7C.pdf 관련된 글: 고속 네트워크에서의 메모리 병목 현상 TCP 폭주(혼잡)제어 Drag and Drop 지원하기 Face Detect
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하다가 안되니깐 설명탓할빠엔 블로그같은거 보질 말던가 -_-;;;
라고 하면 기분이 엄청 좋으시겠죠???
적어놓고 블로그 방치해놓긴 했지만… 빠진 부분은 없습니다. 혹여 빠진 부분이 있다면 그건 일반적인 프로그래밍 스킬이니 알아서 공부하시길…
감사합니다~ 덕분에 많이 알아가요