디지털영상처리_영상처리와CxImage(2)

Download Report

Transcript 디지털영상처리_영상처리와CxImage(2)

1장. 디지털 영상처리의
개념(2)
임은경
2주차 - 디지털영상처리의개념
1
영상처리 – 영상처리 개념 및 구현하기
차례 및 목적

차례
 영상처리의


개념
영상처리에 대한 이야기
영상 데이터에 대한 이해
 영상처리의
응용분야
 영상처리의 전망
2주차 - 디지털영상처리의개념
2
영상처리 – 영상처리 개념 및 구현하기
차례 및 목적

차례
 오픈소스











CxImage로 영상다루기
영상처리 프로그래밍 패턴
CxImage 소개
CxImage 라이브러리 만들기
CxImage와 연계를 위한 프로그램 뼈대 만들기
CxImage 라이브러리 연동하기
영상 읽기
영상 보기
영상 저장
CxImage 기반 영상 처리 프로그램 작성 – 지터 효과(jitter effect)
CxImage 기반 visualGS 라이브러리 작성과 지터 효과 프로그램 작
성
수행시간 측정하기
 CxImage
제공 함수 목록
2주차 - 디지털영상처리의개념
3
영상처리 – 영상처리 개념 및 구현하기
CxImage로 영상다루기

영상 포맷
 RAW
 JPEG
 BMP
 PNG
 GIF
 다양한


포맷이 나온 이유?
영상의 대용량 처리
압축 기술에 차이
 압축 기술은 영상의 특성을 잘 반영하여 표현
2주차 - 디지털영상처리의개념
4
영상처리 – 영상처리 개념 및 구현하기
CxImage로 영상다루기

영상 포맷의 차이
 BMP,
RAW 비교
HEAD
HEAD 없음
영상 데이터
영상 데이터
BMP, JPG, GIF, 등의
헤드가 있는 파일들
RAW 파일(헤드가 없음)
* 헤드 내에는 영상의 크기, 컬러의 수, 팔레트 등의 다양한 정보가
들어 있음
* RAW 파일은 헤드 정보가 없으며 파일을 읽기 위해서는 영상의
크기를 미리 알고 있어야 함.
영상처리 – 영상처리 개념 및 구현하기
CxImage로 영상다루기
 BMP,

GIF, JPEG 헤더 정보 비교
그림 1.22를 통해서 헤더 정보의 내용 차이를 알수 있음
2주차 - 디지털영상처리의개념
6
영상처리 – 영상처리 개념 및 구현하기
CxImage 라이브러리 만들기

CxImage 의 최신 버전과 최근 버전을 다운로드
 http://www.xdp.it
 강의
홈페이지를 통해서 다운 가능
 CxImage599c_full.zip 다운로드 받기

압축 풀기
 영상처리
프로젝트를 개발할 폴더와 같은 위치에 압
축 풀기


d:\dip\cximage599c_full\
라이브러리 생성하기
 압축
푼 폴더 내에 CxImageLib.dsw를 마우스로 더블
클릭하여 실행
2주차 - 디지털영상처리의개념
7
영상처리 – 영상처리 개념 및 구현하기
CxImage 라이브러리 만들기
 Workspace
창의 [File View]탭을 클릭하기
 CxImage file ~ demoDll File 까지 정적 링크 라이브
러리를 생성하기 위해 빌드함






생성되는 정적 링크 라이브러리
CxImage.Lib
CxImageCrtDll.Lib
cximaged.dll
Demod.exe
Demoddll.exe
 Demod.exe
실행하기

2주차 - 디지털영상처리의개념
8
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기

프로그램 뼈대 만들기
 비주얼
c++ 실행하기
 메뉴 File – New 를 선택
 프로젝트 생성 창에 프로젝트 탭을 선택하고, MFC
AppWizard(exe) 를 선택

프로젝트 폴더 : d:\dip\
 확인버튼
클릭하여 다음단계로 넘어감
 프로젝트 생성 6단계 창에서…

Base class를 CScrallView로 선택하고 마침 버튼 클릭
 프로젝트
생성 후, 실행하기
2주차 - 디지털영상처리의개념
9
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기

윈도우 프로그램 작성
 Visual
C++에서는 윈도우 프로그램 작성을 도와주는
마법사를 제공

몇 가지 선택 사항을 입력하면 자동으로 기본적인 윈도우 프
로그램이 생성됨

생성된 윈도우 프로그램을 확장하여 개별적인 응용 프로그램
을 작성할 수 있도록 해주는 기능이 제공됨
4주차 - MFC를 이용한 영상처리 프로그래밍
10
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기
1.
Visual C++ 프로그램 실행한 다음 [File] 메뉴에서
[New] 항목 선택
4주차 - MFC를 이용한 영상처리 프로그래밍
11
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기
2. [Projects] 탭을 선택한 다음 “MFC AppWizard(exe)”를 선택. Project name
상자에 프로그램 이름 “Hello”를입력. Location 상자에서 폴터 위치 지정
4주차 - MFC를 이용한 영상처리 프로그래밍
12
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기
3. 1단계 부터 6단계 까지의 선택 사양 설정을 해야 하는데, 여기에서는 기본 설
정을 사용해도 되므로 1단계에서 바로 [Finish] 버튼 선택해도 상관없다.
4주차 - MFC를 이용한 영상처리 프로그래밍
13
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기
 옵션에
따른 프로그램 타입의 종류
Single Document
Multiple Document
4주차 - MFC를 이용한 영상처리 프로그래밍
Dialog based 타입
14
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기
4. 2단계 – database 기능을 추가할 것인지 아닌지를 설정하는 단계를 나
타냄
4주차 - MFC를 이용한 영상처리 프로그래밍
15
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기
5. 3단계 – OLE와 관련된 선택 사항들을 설정하는 단계
4주차 - MFC를 이용한 영상처리 프로그래밍
16
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기
6. 4단계 – 툴바, 상태바, 프린트기능 등을 부여할 것인지 여부를 설정하는 단계
4주차 - MFC를 이용한 영상처리 프로그래밍
17
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기
앞의 대화상자에서 [Advanced…]를 클릭하면,
4주차 - MFC를 이용한 영상처리 프로그래밍
18
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기
앞의 대화상자에 존재하는 옵션과 설명…
옵션
설명
File Extension
실행파일의 메뉴에서 읽어들일 영상파일의 확장자를
지정해줌. 이 프로젝트에서 읽을 파일은 RAW파일이
므로 확장자 “raw”를 적어줌
File type ID
시스템 레지스트리에 등록될 문서 타입 ID
Main frame caption
프로그램 타이틀 바에 나타날 이름 설정
Doc type name
새로운 Doc 템플릿 추가시 사용하는 Doc 타입 이름
지정
4주차 - MFC를 이용한 영상처리 프로그래밍
19
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기
7. 5단계 – 실행될 프로그램의 스타일과 설명문(주석문)을 자동으로 삽입할 것
인지 여부, MFC 라이브러리를 어떤 방식으로 사용할 것인지 여부 등을 설정
함
4주차 - MFC를 이용한 영상처리 프로그래밍
20
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기
8. 6단계
4주차 - MFC를 이용한 영상처리 프로그래밍
21
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기
8. 마지막 단계 – 생성될 프로젝트의 정보를 나타냄
4주차 - MFC를 이용한 영상처리 프로그래밍
22
영상처리 – 영상처리 개념 및 구현하기
애플리케이션 마법사를 이용한 MFC 프로젝
트의 작성
9. 생성된 프로젝트의 모습
4주차 - MFC를 이용한 영상처리 프로그래밍
23
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기
10. 실행결과
4주차 - MFC를 이용한 영상처리 프로그래밍
24
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기

탭의 전환에 따른 workspace 정보들

탭에 대한 설명
탭 선택
설명
클래스 정보
프로젝트에 포함된 클래스들의 종류와 멤버변수, 함수등의 정보를 보
여줌
리소스 정보
프로젝트에 사용될 메뉴, 버튼, 아이콘 등의 작성과 관리
파일 정보
프로젝트에 포함된 파일이름과 헤드 파일들을 보여주고 관리함
4주차 - MFC를 이용한 영상처리 프로그래밍
25
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기

MFC프로그램의 구성요소 세가지
 메인프레임


윈도우
윈도우 내부의 오픈된 창 부분을 제외한 나머지 부분을 가리킴
메뉴, 툴바, 상태바 등의 프로그램을 뼈대를 가짐
 문서객체


데이터의 저장, 변환, 처리, 삭제 등을 담당하는 객체
눈에 보이지 않음
 뷰객체


문서객체의 데이터를 화면(열린창)에 출력하는 역할을 담당하
는 객체
MFC 프로그래밍

데이터의 처리와 데이터의 출력을 분리된 두개의 다른 클래스에서 담당
4주차 - MFC를 이용한 영상처리 프로그래밍
26
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기

View 클래스의 OnDraw() 함수

데이터를 화면에 출력하는 기능을 담당하는 함수
4주차 - MFC를 이용한 영상처리 프로그래밍
27
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기

객체들간의 메시지 통신


세가지 객체들은 서로 통신되어야 함
HOW?

객체들 사이에서 데이터나 함수의 상호참조를 위해 유용한 함수를
제공함
4주차 - MFC를 이용한 영상처리 프로그래밍
28
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기

Document 클래스(CtestDoc)에 마우스를 두고 오른쪽
버튼을 누르면 메뉴가 나타남


이 메뉴상에서 <Add Member Variable…>을 선택
클래스에 새로운 멤버변수를 추가하고자 할 경우에 사용함
4주차 - MFC를 이용한 영상처리 프로그래밍
29
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기

입력대화상자가 나타나고, 각 변수 타입과 변수이름, 접
근 방법을 물어본다.

다음과 같이 설정하라.
변수 타입
변수명
접근방법
unsigned char
m_InImg[256][256]
Public
unsigned char
m_OutImg[256][256]
Public
4주차 - MFC를 이용한 영상처리 프로그래밍
30
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기

다음과 같이 나타남
4주차 - MFC를 이용한 영상처리 프로그래밍
31
영상처리 – 영상처리 개념 및 구현하기
프로그램 뼈대 만들기
 프로그램

Single Document




SDI
하나의 프로그램에 하나의 창만 존재하는 구조
Internet Explorer는 대표적인 SDI 구조
Multiple Document




타입
MDI
PaintShop과 같이 프로그램 내에 여러 개의 창이나 문서를 열
수 있는 구조
많은 응용 프로그램들이 이 구조를 사용함
Dialog based 타입의 Document

메시지 박스나 이와 같은 구조를 사용하는 프로그램
4주차 - MFC를 이용한 영상처리 프로그래밍
32
영상처리 – 영상처리 개념 및 구현하기
CxImage 라이브러리 연동하기

헤더 파일 복사하기
 FirstCxImage
프로젝트의 폴더 공간에 include 폴더
를 만듬
 Cximage599c_full/CxImage의 모든 헤더파일(*.h)를
앞의 include 폴더로 복사하기
2주차 - 디지털영상처리의개념
33
영상처리 – 영상처리 개념 및 구현하기
CxImage 라이브러리 연동하기

헤더 파일 디렉토리를 프로젝트 설정에 포함하
기
2주차 - 디지털영상처리의개념
34
영상처리 – 영상처리 개념 및 구현하기
CxImage 라이브러리 연동하기

StdAfx.h에 CxImage의 헤더 파일인 xImage.h 추가하기
2주차 - 디지털영상처리의개념
35
영상처리 – 영상처리 개념 및 구현하기
CxImage 라이브러리 연동하기

CxImage 정적 링크 라이브러리 연동하기
 CxImage
정적 라이브러리와 연동할 영상 포맷 관련
라이브러리 복사하기



윈도우 검색 메뉴를 이용하여, Cximage599c_full 폴더에서
제공된 *.lib 를 찾아보자
여러 개의 파일 중 영상 포맷 관련 라이브러리를 복사하자
 파일들…
 J2k.lib , Jasper.lib , Jbig.lib , Jpeg.lib ,
Png.lib , Tiff.lib , Zlib.lib
자신이 생성한 프로젝트 FirstCxImage 폴더 안에 lib 폴더를
만들고 그 안에 복사하여 붙여 넣자.
2주차 - 디지털영상처리의개념
36
영상처리 – 영상처리 개념 및 구현하기
CxImage 라이브러리 연동하기
 CxImage


정적 링크 라이브러리 복사하기
Cximage599c_full 폴더 내에 있는 CxImage 폴더 내에 있는
debug 폴더 내에
 Cximage.lib 를 복사하기
FirstCxImage 폴더 내에 debug 폴더 안에
 복사한 CxImage.lib 를 붙여넣기
2주차 - 디지털영상처리의개념
37
영상처리 – 영상처리 개념 및 구현하기
CxImage 라이브러리 연동하기
 CxImage
정적 링크 파이브러리명과 영상 포맷 관련
라이브러리 명을 프로젝트에 설정하기

Object/library modules 밑의 입력 창에 다음을 입력
 Debug/cximage.lib ./lib/png.lib ./lib/Jpeg.lib
./lib/zlib.lib ./lib/Tiff.lib ./lib/j2k.lib ./lib/jbig.lib
./lib/jasper.lib
2주차 - 디지털영상처리의개념
38
영상처리 – 영상처리 개념 및 구현하기
CxImage 라이브러리 연동하기
 FirstCxImage
재빌드 시키고 실행하기
2주차 - 디지털영상처리의개념
39
영상처리 – 영상처리 개념 및 구현하기
영상 읽기

MFC 구현
 영상을

수행은…?
 읽은

영상 데이터를 우리 눈에 보여주는 곳…?
수행은…?
 View와


읽고 저장할때 필요한 변수를 관리하는 곳…?
Document 클래스
Document 클래스
 데이터의 저장, 변환, 처리를 위한 역할
View 클래스
 도큐먼트 클래스의 데이터를 화면에 출력하는 역할
2주차 - 디지털영상처리의개념
40
영상처리 – 영상처리 개념 및 구현하기
영상 읽기

도큐먼트 클래스에 멤버 변수 추가
 CFirstCxImageDoc
선택 후, 오른쪽 마우스 버튼을
누르면 팝업 메뉴가 나타남
 Add Member Variable…을 선택
 입력 대화창에 변수 이름과 데이터형을 입력한다.



데이터형 : CxImage*
변수 이름 : m_pImage
확인버튼 클릭하면, workspace창이나 소스의 헤더 파일에
추가됨.
 추가된


m_Image를 초기화하기
FirstCxImageDoc.cpp의 생성자 파일 CFirstCxImageDoc()
에서 초기화하기
m_pImage = NULL;
2주차 - 디지털영상처리의개념
41
영상처리 – 영상처리 개념 및 구현하기
영상 읽기
 영상


파일을 읽어 오는 함수 재정의
읽거나 저장하는 방법
 Serialize 멤버 변수를 사용하는 것
 MFC 클래스 내 데이터를 직접 읽거나 저장하는 가장
손쉬운 방식
 OnOpenDocument 함수를 재정의(overriding)하는 것
 가상 함수를 추가
 영상 데이터의 파일 포맷별 고유 특징 때문에
OnOpenDocument(), OnSaveDocument()함수를 재
정의한 후, 파일명을 넘겨 받아 처리하는 루틴 추가
OnOpenDocument() 함수를 추가
 CFirstCxImageDoc.cpp 문서에 팝업 메뉴에서 [Add
Virtual Funtion]을 선택하기
 OnOpenDocument를 선택하고 OnNewDocument를 선
택하여 [Add & Edit] 버튼을 클릭
2주차 - 디지털영상처리의개념
42
영상처리 – 영상처리 개념 및 구현하기
영상 읽기


함수 내에 다음을 추가하기
 m_pImage = new CxImage;
 m_pImage->Load(lpszPathName, 0);
앞에서 메모리 할당 받음… 삭제해주는 Virtual 함수도 추가해
야 함..
2주차 - 디지털영상처리의개념
43
영상처리 – 영상처리 개념 및 구현하기
영상 읽기
 DeleteDocuments



함수 추가
CFirstCxImageDoc.cpp 문서에 팝업 메뉴에서 [Add Virtual
Funtion]을 선택하기
DeleteDocuments를 선택하고 OnNewDocument를 선택하
여 [Add & Edit] 버튼을 클릭
함수 내에 다음을 추가하기
 if(m_pImage ) delete m_pImage;
2주차 - 디지털영상처리의개념
44
영상처리 – 영상처리 개념 및 구현하기
영상 읽기

파일 열기 함수 OnFileOpen() 재정의
 다양한
확장자를 갖는 영상 파일을 지원하기 위해
OnFileOpen() 즉 메뉴의 열기를 지원하기
 프레임 윈도우(frame window) 클래스


메뉴, 툴바, 상태바 등 프로그램을 구성하는 부분을 담당하는
클래스
CFirstCxImageApp 클래스를 의미함
 메뉴에




프로그램 추가하기
Workspace 창의 Resource View의 메뉴 중
IDC_MAINFRAME을 선택하기
[파일]-[열기]를 선택하고 오른쪽 마우스를 클릭
메뉴 중 [class wizard]를 선택
다음과 같이 셋팅하기
2주차 - 디지털영상처리의개념
45
영상처리 – 영상처리 개념 및 구현하기
영상 읽기



Add Function을 클릭하면
[OK]버튼 클릭하면 member functions에 함수가 추가됨
Edit Code를 클릭하면 소스 작성 창으로 접근
2주차 - 디지털영상처리의개념
46
영상처리 – 영상처리 개념 및 구현하기
영상 읽기

다음과 같이 작성하기

char szFilter[] = "지원 영상 파일(*.bmp, *.jpg, *.gif,
*png, *.tif)|*.bmp;*.jpg;*.gif;*.png;*.tif||";
2주차 - 디지털영상처리의개념
47
영상처리 – 영상처리 개념 및 구현하기
영상 읽기

영상 보기
 도큐먼트
클래스에서 넘어온 입력 파일에서 읽어 들
인 영상 데이터는 m_pImage에 저장됨
 이를 보여주기 위해 뷰 클래스 사용함


OnDraw 멤버 함수를 호출하여 프로그램 작성하기
OnDraw ()
 화면에 결과를 출력하는 Cview 클래스의 대부분 역할을
담당하는 멤버 함수
 영상


출력하기
뷰클래스(CFirstCxImageView) 내의 OnDraw()함수 선택
소스 다음과 같이 코딩하기
2주차 - 디지털영상처리의개념
48
영상처리 – 영상처리 개념 및 구현하기
영상 읽기

실행해보기
2주차 - 디지털영상처리의개념
49
영상처리 – 영상처리 개념 및 구현하기
영상 읽기
2주차 - 디지털영상처리의개념
50
영상처리 – 영상처리 개념 및 구현하기
영상 읽기

영상 크기에 맞추어 스크롤 지원하기
 Oninitialupdate()멤버
함수를 클릭하여 다음과 같이
코딩하기
 기본적인 Oninitialupdate() 함수의 내용
2주차 - 디지털영상처리의개념
51
영상처리 – 영상처리 개념 및 구현하기
영상 읽기
 다음과
같이 수정하시오.
2주차 - 디지털영상처리의개념
52
영상처리 – 영상처리 개념 및 구현하기
영상 읽기
 실행결과
2주차 - 디지털영상처리의개념
53
영상처리 – 영상처리 개념 및 구현하기
영상 읽기

처음 실행 시 나타나는 창 제거하기
 Workspace


창의 class View 탭에서 …
메인 프로임 윈도우 클래스인 CFirstCxImageApp의
InitInstance() 함수를 확인하기
다음과 같이 수정하기
2주차 - 디지털영상처리의개념
54
영상처리 – 영상처리 개념 및 구현하기
영상 읽기
그



외의 다른 방법
if (!ProcessShellCommand(cmdInfo))
return FALSE;
위의 내용을 주석 처리해서 실행하지 못하도록 막으면 새로
운 창이 나타나지 않음.
 실행해보기
2주차 - 디지털영상처리의개념
55
영상처리 – 영상처리 개념 및 구현하기
영상 읽기

드래그 앤 드롭으로 영상 파일 열기
 프로그램에
영상 파일을 끌어다 놓으면 이를 감지하
고 파일을 열어주기
 Instance() 함수에 다음을 추가하자.
2주차 - 디지털영상처리의개념
56
영상처리 – 영상처리 개념 및 구현하기
영상 읽기

영상의 크기에 맞춰 보여주기
 창의
크기와 영상의 원래 크기가 일치하지 않으므로 이를
수정하기
 영상의 크기에 맞춰 창이 보여지게끔 해보자.
 [Class
View]탭에서 CChildFrame 클래스를 선택하기
 마우스 오른쪽 버튼을 눌러 팝업 메뉴 중 [Add Virtual
Function]을 선택하기
 가상 함수 ActiveFrame 멤버 함수를 선택, [Add & Edit]
버튼 클릭

ActiveFrame 멤버 함수
 자식 프레임 클래스(child frame class)의 형태를 정의하는
것
57
 메인 프레임 2주차
클래스는
부모 프레임 클래스를 지칭함
- 디지털영상처리의개념
영상처리 – 영상처리 개념 및 구현하기
영상 읽기
 다음과
같이 소스 수정 및 추가하기
2주차 - 디지털영상처리의개념
58
영상처리 – 영상처리 개념 및 구현하기
영상 읽기
 앞의

클래스 내의 헤더파일 추가하기
#include "FirstCxImageDoc.h"
2주차 - 디지털영상처리의개념
59
영상처리 – 영상처리 개념 및 구현하기
영상 저장

영상 저장을 위해



OnSaveDocument() 함수를 재정의 하고, 파일명을 넘겨받아 처리하
는 루틴을 추가하기
도큐먼트 클래스의 소스인 CFirstCxImageDoc 에 추가하기
오른쪽 마우스 버튼 클릭 후, [Add Virtual Function] 선택하기
2주차 - 디지털영상처리의개념
60
영상처리 – 영상처리 개념 및 구현하기
영상 저장

가상 함수 중 OnSaveDocument()를 선택 하후, [Add &
Edit]버튼을 클릭하고 소스 작성하기
2주차 - 디지털영상처리의개념
61
영상처리 – 영상처리 개념 및 구현하기
영상 저장

사실상, CxImage에서는 총 15개의 포맷을 지원
 ximage.h












의 포맷 내용을 보면…
enum ENUM_CXIMAGE_FORMATS{
CXIMAGE_FORMAT_UNKNOWN,
CXIMAGE_FORMAT_BMP,
CXIMAGE_FORMAT_GIF,
CXIMAGE_FORMAT_JPG,
CXIMAGE_FORMAT_PNG,
CXIMAGE_FORMAT_MNG,
CXIMAGE_FORMAT_ICO,
CXIMAGE_FORMAT_TIF,
CXIMAGE_FORMAT_TGA,
CXIMAGE_FORMAT_PCX,
CXIMAGE_FORMAT_WBMP,
2주차 - 디지털영상처리의개념
62
영상처리 – 영상처리 개념 및 구현하기
영상 저장









CXIMAGE_FORMAT_WMF,
CXIMAGE_FORMAT_J2K,
CXIMAGE_FORMAT_JBG,
CXIMAGE_FORMAT_JP2,
CXIMAGE_FORMAT_JPC,
CXIMAGE_FORMAT_PGX,
CXIMAGE_FORMAT_PNM,
CXIMAGE_FORMAT_RAS,
};
 물론,
소스를 변경시키면 다른 포맷 역시도 지원 가능
함
2주차 - 디지털영상처리의개념
63
영상처리 – 영상처리 개념 및 구현하기
영상 저장


클래스의 역할
MFC AppWizard를 이용하여 FirstCxImage 프로
젝트를 생성하면 여섯 개의 클래스가 생성됨
C


C

FirstCxImageDoc 클래스
여기에서 Doc는 문서(Document)를 의미함
데이터의 저장이나 변환 등과 같이 실질적인 데이터 처리를
담당
FirstCxImageView 클래스
CImageProDoc 클래스에서 처리된 데이터를 출력 장치를 통
하여 보여주는 역할 수행
 CMainFrame

클래스
프로그램 전체 윈도우에 대한 관리 담당
2주차 - 디지털영상처리의개념
64
영상처리 – 영상처리 개념 및 구현하기
영상 저장
 CChildFrame

프로그램 윈도우 안에 생성되는 여러 개의 서브윈도우에 대
한 관리 담당
 CAboutDlg

C

클래스
클래스
프로그램의 [도움말] 메뉴의 “FirstCxImage 정보“라는 항목
을 선택하면 나타나는 대화상자에 대한 관리 담당
FirstCxImageApp 클래스
FirstCxImage 프로그램 전체에 대한 관리를 담당
2주차 - 디지털영상처리의개념
65
영상처리 – 영상처리 개념 및 구현하기
예제로 지터 효과 주기

지터 효과(jitter effect)
 이미지의
각 픽셀에서 각 랜덤 값을 추가함
 지터 효과를 제공하는 라이브러리 함수의 특징



Bool CxImage::Jitter(long radius = 2)[inherited]
Parameter
 Radius – maximum pixel displacement
Returns
 True if everthing is ok
2주차 - 디지털영상처리의개념
66
영상처리 – 영상처리 개념 및 구현하기
예제로 지터 효과 주기

Jitter() 소스
2주차 - 디지털영상처리의개념
67
영상처리 – 영상처리 개념 및 구현하기
예제로 지터 효과 주기
2주차 - 디지털영상처리의개념
68
영상처리 – 영상처리 개념 및 구현하기
예제로 지터 효과 주기

프로그램에 메뉴 추가하여 지터 메뉴 삽입
 [Resource
View]탭에서 메뉴 IDC_FIRSTCTYPE을
선택
 도움말 뒤에 메뉴 추가하기
 도움말 뒤에 마우스 커서를 가져다 놓고 오른쪽 마우
스 클릭하면 메뉴 중 [Properties]를 선택
 메뉴
1장 아래로 또 다시 메뉴를 추가하기
2주차 - 디지털영상처리의개념
69
영상처리 – 영상처리 개념 및 구현하기
예제로 지터 효과 주기
2주차 - 디지털영상처리의개념
70
영상처리 – 영상처리 개념 및 구현하기
예제로 지터 효과 주기

지터 함수 호출
 메뉴를
선택할때 jitter()함수를 호출하여 실행할 곳이
필요함.
 메뉴의 jitter – cximage를 선택하면 jitter()함수가 호
출되도록 설정하기
 연결할 메뉴를 선택
 오른쪽 마우스버튼 클릭하면 메뉴 중 [ClassWizard]
를 선택하기
2주차 - 디지털영상처리의개념
71
영상처리 – 영상처리 개념 및 구현하기
예제로 지터 효과 주기
 다음과
같이 설정하고, [Add Function]버튼을 클릭하
기
 [Add
Member Function]창이 뜨면…[ok]버튼 클릭
 Member functions에 앞의 함수 이름이 추가됨
 Edit Code버튼을2주차
눌러
소스 작성을 위해 포커스 이동72
- 디지털영상처리의개념
영상처리 – 영상처리 개념 및 구현하기
예제로 지터 효과 주기
 다음과
같이 JITTER함수를 호출할 소스 입력하기
2주차 - 디지털영상처리의개념
73
영상처리 – 영상처리 개념 및 구현하기
예제로 지터 효과 주기
 실행하기

Jitter 실행 결과 보기
2주차 - 디지털영상처리의개념
74
영상처리 – 영상처리 개념 및 구현하기
예제로 지터 효과 주기

클립보드 복사, 붙여넣기
원
영상에 jitter() 함수의 결과가 덮여쓰여짐
 원 영상과 jitter()함수의 결과를 같이 비교할 수 있도
록 새로운 창이 결과가 유도되도록 해보자

클립보드 복사와 붙여 넣기를 통해
 원 영상을 미리 복사하기
 새로운 창에 같은 원 영상을 붙여 넣기
 클립보드


특정 프로그램의 데이터를 다른 프로그램으로 데이터를 넘겨
줄 수 있도록 해주는 기능
데이터의 포맷을 제대로 지원한다면 어디서나 사용 가능
2주차 - 디지털영상처리의개념
75
영상처리 – 영상처리 개념 및 구현하기
예제로 지터 효과 주기
 클립보드
복사하기

[Class View] 탭을 선택하고, CFirstCxImageDoc를 선택하
여 새로운 함수 CopyClipBoard()를 추가하기

추가된 CopyClipBoard()에 다음의 코드 삽입하기
2주차 - 디지털영상처리의개념
76
영상처리 – 영상처리 개념 및 구현하기
예제로 지터 효과 주기
2주차 - 디지털영상처리의개념
77
영상처리 – 영상처리 개념 및 구현하기
예제로 지터 효과 주기
 앞의
소스를 통해서 클립보드 복사 영역의 소스를 구
현했지만 이를 연결해야 함.
 메뉴 중 [편집  복사]에 연결하기
[편집  복사]를 선택한 후, 오른쪽 마우스 버
튼 클릭하면 나타나는 메뉴 중 [ClassWizard]를 선택
 클래스 위저드를 다음과 같이 설정하고, [Add
Function]버튼을 클릭한다.
 Add member function 창에 함수이름을 설정하고
[ok]버튼을 클릭하면, 클래스 위저드 창의 Member
function에 추가되고 Edit Code 버튼 클릭 후, 소스
를 작성하자.
 메뉴
2주차 - 디지털영상처리의개념
78
영상처리 – 영상처리 개념 및 구현하기
예제로 지터 효과 주기
2주차 - 디지털영상처리의개념
79
영상처리 – 영상처리 개념 및 구현하기
예제로 지터 효과 주기
 소스는
다음과 같이 작성
2주차 - 디지털영상처리의개념
80
영상처리 – 영상처리 개념 및 구현하기
예제로 지터 효과 주기
 클립보드


붙이기
[편집]-[붙여넣기] 메뉴를 통해서 소스를 작성하자.
여기서는 도큐먼트 클래스가 아니라 프레임 윈도우를 이용함
2주차 - 디지털영상처리의개념
81
영상처리 – 영상처리 개념 및 구현하기
예제로 지터 효과 주기
 다음과
같이 코드 작업하기
2주차 - 디지털영상처리의개념
82
영상처리 – 영상처리 개념 및 구현하기
예제로 지터 효과 주기
 소스(1)
void CFirstCxImageApp::OnEditPaste()
{
// TODO: Add your command handler code here
POSITION pos = GetFirstDocTemplatePosition();
CDocTemplate *pTemplate = GetNextDocTemplate(pos);
CFirstCxImageDoc *pDoc = (CFirstCxImageDoc* )pTemplate>OpenDocumentFile(NULL);
if( pDoc ){
HANDLE hBitmap=NULL;
if (::OpenClipboard(AfxGetMainWnd()->GetSafeHwnd()))
hBitmap = ::GetClipboardData(CF_DIB);
if( hBitmap )
{
pDoc->m_pImage = new CxImage();
83
pDoc->m_pImage->CreateFromHANDLE(hBitmap);
2주차 - 디지털영상처리의개념
영상처리 – 영상처리 개념 및 구현하기
예제로 지터 효과 주기
 소스(2)
POSITION pos = pDoc->GetFirstViewPosition();
CFirstCxImageView *pView = (CFirstCxImageView
*)pDoc->GetNextView(pos);
>GetWidth(),
CSize sizeTotal = CSize(pDoc->m_pImagepDoc->m_pImage->GetHeight());
pView->SetScrollSizes(MM_TEXT, sizeTotal);
pView->ResizeParentToFit(FALSE);
}
::CloseClipboard();
}
}
2주차 - 디지털영상처리의개념
84
영상처리 – 영상처리 개념 및 구현하기
예제로 지터 효과 주기
 hBitmap
= ::GetClipboardData(CF_DIB)에서
CF_DIB 데이터가 존재해야 함.
 OnEditPaste() 함수 전에 호출되는
OnUpdateEditPaster()함수를 이용해서 CF_DIF를 활
성화시킴
 [Add Function] 클릭
 [Edit Code] 버튼 클릭
2주차 - 디지털영상처리의개념
85
영상처리 – 영상처리 개념 및 구현하기
예제로 지터 효과 주기
 다음과
같이 소스 작성하기
2주차 - 디지털영상처리의개념
86
영상처리 – 영상처리 개념 및 구현하기
예제로 지터 효과 주기
 실행하기
2주차 - 디지털영상처리의개념
87
영상처리 – 영상처리 개념 및 구현하기
직접 구현한 지터 효과주기

앞의 방법
 공개된

라이브러리를 통해서 작성한 방식
직접 구현해보자.
 파일
읽기, 저장, 보기 함수만을 이용하고 실제 다른
영상 처리 기법들은 우리가 구현해보도록 하자.
2주차 - 디지털영상처리의개념
88
영상처리 – 영상처리 개념 및 구현하기
직접 구현한 지터 효과주기

직접 구현하기 위한 작업
 다양한




영상 처리를 지원해줄 클래스를 만들자.
새로운 클래스 생성하기
클래스의 옵션을 다음과 같이 설정하기
클래스 타입
 Generic Class
Name
 Cfilter
2주차 - 디지털영상처리의개념
89
영상처리 – 영상처리 개념 및 구현하기
직접 구현한 지터 효과주기
 Filter.h

헤더파일 작성하기
[File View] 탭에 접근하여 코드 추가하기
2주차 - 디지털영상처리의개념
90
영상처리 – 영상처리 개념 및 구현하기
직접 구현한 지터 효과주기
 Filter.cpp


작성하기
소스 내에 #include "math.h“를 추가하기
그리고 기본 소스는 다음과 같이 추가함
2주차 - 디지털영상처리의개념
91
영상처리 – 영상처리 개념 및 구현하기
직접 구현한 지터 효과주기

소스(1)
void CFilter::GS_Jitter( CxImage *m_pImage, long radius ){
RGBQUAD color;
int i, j;
int rnd_height, rnd_width;
int height = m_pImage->GetHeight();
int width = m_pImage->GetWidth();
for(i=0; i<height; i++)
{
for(j=0; j<width; j++) {
rnd_height = i+(long)((rand()/(float)RAND_MAX 0.5)*(radius*2));
rnd_width = j+(long)((rand()/(float)RAND_MAX 0.5)*(radius*2));
2주차 - 디지털영상처리의개념
92
영상처리 – 영상처리 개념 및 구현하기
직접 구현한 지터 효과주기

소스(2)
if( rnd_height > height || rnd_width > width ) {
rnd_height = height;
rnd_width = width;
}
color = m_pImage->GetPixelColor(rnd_width, rnd_height);
m_pImage->SetPixelColor(j, i, color);
}
}
return;
}
2주차 - 디지털영상처리의개념
93
영상처리 – 영상처리 개념 및 구현하기
직접 구현한 지터 효과주기

작성한 지터 효과를 메뉴에 연결하기
2주차 - 디지털영상처리의개념
94
영상처리 – 영상처리 개념 및 구현하기
직접 구현한 지터 효과주기
 메뉴에서
클래스 위저드로 접근하여 다음과 같이 설
정함
2주차 - 디지털영상처리의개념
95
영상처리 – 영상처리 개념 및 구현하기
직접 구현한 지터 효과주기
 다음과
같이 연결하기 위한 코드 작성하기
 먼저, 헤더 파일 추가하기

Filter 클래스의 내용을 끌어다 사용하므로 헤더파일에 추가
해야 함
2주차 - 디지털영상처리의개념
96
영상처리 – 영상처리 개념 및 구현하기
직접 구현한 지터 효과주기
 실제
지터함수를 연결하는 코드 작성하기
2주차 - 디지털영상처리의개념
97
영상처리 – 영상처리 개념 및 구현하기
직접 구현한 지터 효과주기

실행하기
2주차 - 디지털영상처리의개념
98
영상처리 – 영상처리 개념 및 구현하기
수행 시간 측정하기

수행 시간 측정
 메모리를
많이 차지하는 영상
 처리 시간이 관건
 다양한 알고리즘 중 성능을 평가하기 위한 의도로 수
행 시간을 측정함
 각 영상 처리의 수행 시간을 Debug 결과를 통해서 알
려주려 함
 수행 시간을 보는 방법


TRACE 매크로를 이용하는 방법
 디버그 모드가 아니라 릴리즈 모드에서 볼 수 있음
Debug View를 통해서 확인하는 방법
 사용할 방법
 가벼운 디버깅 모니터링 도구인 Debug View를 이용하여
99
수행 시간 확인
2주차 - 디지털영상처리의개념