99
2 주주 - 주주주주주주주주주주 1 1 장 . 장장장 장장장장장 장장 (2) 주주주

1 장 . 디지털 영상처리의 개념 (2)

Embed Size (px)

DESCRIPTION

1 장 . 디지털 영상처리의 개념 (2). 임은경. 차례 및 목적. 차례 영상처리의 개념 영상처리에 대한 이야기 영상 데이터에 대한 이해 영상처리의 응용분야 영상처리의 전망. 차례 및 목적. 차례 오픈소스 CxImage 로 영상다루기 영상처리 프로그래밍 패턴 CxImage 소개 CxImage 라이브러리 만들기 CxImage 와 연계를 위한 프로그램 뼈대 만들기 CxImage 라이브러리 연동하기 영상 읽기 영상 보기 영상 저장 - PowerPoint PPT Presentation

Citation preview

Page 1: 1 장 .  디지털 영상처리의                  개념 (2)

2 주차 - 디지털영상처리의개념 1

1 장 . 디지털 영상처리의 개념 (2)

임은경

Page 2: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

2 주차 - 디지털영상처리의개념2

차례 및 목적 차례

영상처리의 개념 영상처리에 대한 이야기 영상 데이터에 대한 이해

영상처리의 응용분야 영상처리의 전망

Page 3: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

2 주차 - 디지털영상처리의개념3

차례 및 목적 차례

오픈소스 CxImage 로 영상다루기 영상처리 프로그래밍 패턴 CxImage 소개 CxImage 라이브러리 만들기 CxImage 와 연계를 위한 프로그램 뼈대 만들기 CxImage 라이브러리 연동하기 영상 읽기 영상 보기 영상 저장 CxImage 기반 영상 처리 프로그램 작성 – 지터 효과 (jitter effect) CxImage 기반 visualGS 라이브러리 작성과 지터 효과 프로그램

작성 수행시간 측정하기

CxImage 제공 함수 목록

Page 4: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

CxImage 로 영상다루기 영상 포맷

RAW JPEG BMP PNG GIF

다양한 포맷이 나온 이유 ? 영상의 대용량 처리 압축 기술에 차이

압축 기술은 영상의 특성을 잘 반영하여 표현

2 주차 - 디지털영상처리의개념4

Page 5: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

CxImage 로 영상다루기 영상 포맷의 차이

BMP, RAW 비교

HEAD

영상 데이터

BMP, JPG, GIF, 등의헤드가 있는 파일들

HEAD 없음

영상 데이터

RAW 파일 ( 헤드가 없음 )

* 헤드 내에는 영상의 크기 , 컬러의 수 , 팔레트 등의 다양한 정보가 들어 있음* RAW 파일은 헤드 정보가 없으며 파일을 읽기 위해서는 영상의 크기를 미리 알고 있어야 함 .

Page 6: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

CxImage 로 영상다루기 BMP, GIF, JPEG 헤더 정보 비교

그림 1.22 를 통해서 헤더 정보의 내용 차이를 알수 있음

2 주차 - 디지털영상처리의개념6

Page 7: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

CxImage 라이브러리 만들기 CxImage 의 최신 버전과 최근 버전을 다운로드

http://www.xdp.it 강의 홈페이지를 통해서 다운 가능 CxImage599c_full.zip 다운로드 받기

압축 풀기 영상처리 프로젝트를 개발할 폴더와 같은 위치에 압축

풀기 d:\dip\cximage599c_full\

라이브러리 생성하기 압축 푼 폴더 내에 CxImageLib.dsw 를 마우스로

더블클릭하여 실행

2 주차 - 디지털영상처리의개념7

Page 8: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

CxImage 라이브러리 만들기 Workspace 창의 [File View] 탭을 클릭하기 CxImage file ~ demoDll File 까지 정적 링크

라이브러리를 생성하기 위해 빌드함 생성되는 정적 링크 라이브러리 CxImage.Lib CxImageCrtDll.Lib cximaged.dll Demod.exe Demoddll.exe

Demod.exe 실행하기

2 주차 - 디지털영상처리의개념8

Page 9: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

프로그램 뼈대 만들기 프로그램 뼈대 만들기

비주얼 c++ 실행하기 메뉴 File – New 를 선택 프로젝트 생성 창에 프로젝트 탭을 선택하고 , MFC

AppWizard(exe) 를 선택 프로젝트 폴더 : d:\dip\

확인버튼 클릭하여 다음단계로 넘어감 프로젝트 생성 6 단계 창에서…

Base class 를 CScrallView 로 선택하고 마침 버튼 클릭 프로젝트 생성 후 , 실행하기

2 주차 - 디지털영상처리의개념9

Page 10: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍10

프로그램 뼈대 만들기 윈도우 프로그램 작성

Visual C++ 에서는 윈도우 프로그램 작성을 도와주는 마법사를 제공

몇 가지 선택 사항을 입력하면 자동으로 기본적인 윈도우 프로그램이 생성됨

생성된 윈도우 프로그램을 확장하여 개별적인 응용 프로그램을 작성할 수 있도록 해주는 기능이 제공됨

Page 11: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍11

프로그램 뼈대 만들기

1. Visual C++ 프로그램 실행한 다음 [File] 메뉴에서 [New] 항목 선택

Page 12: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍12

프로그램 뼈대 만들기2. [Projects] 탭을 선택한 다음 “MFC AppWizard(exe)”를 선택 . Project

name 상자에 프로그램 이름 “Hello”를입력 . Location 상자에서 폴터 위치 지정

Page 13: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍13

프로그램 뼈대 만들기3. 1 단계 부터 6 단계 까지의 선택 사양 설정을 해야 하는데 , 여기에서는 기본

설정을 사용해도 되므로 1 단계에서 바로 [Finish] 버튼 선택해도 상관없다 .

Page 14: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍14

프로그램 뼈대 만들기 옵션에 따른 프로그램 타입의 종류

Single Document Multiple Document Dialog based 타입

Page 15: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍15

프로그램 뼈대 만들기4. 2 단계 – database 기능을 추가할 것인지 아닌지를 설정하는 단계를

나타냄

Page 16: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍16

프로그램 뼈대 만들기5. 3 단계 – OLE 와 관련된 선택 사항들을 설정하는 단계

Page 17: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍17

프로그램 뼈대 만들기6. 4 단계 – 툴바 , 상태바 , 프린트기능 등을 부여할 것인지 여부를 설정하는

단계

Page 18: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍18

프로그램 뼈대 만들기앞의 대화상자에서 [Advanced…] 를 클릭하면 ,

Page 19: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍19

프로그램 뼈대 만들기앞의 대화상자에 존재하는 옵션과 설명…

옵션 설명

File Extension 실행파일의 메뉴에서 읽어들일 영상파일의 확장자를 지정해줌 . 이 프로젝트에서 읽을 파일은 RAW파일이므로 확장자 “raw”를 적어줌

File type ID 시스템 레지스트리에 등록될 문서 타입 ID

Main frame caption

프로그램 타이틀 바에 나타날 이름 설정

Doc type name 새로운 Doc 템플릿 추가시 사용하는 Doc 타입 이름 지정

Page 20: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍20

프로그램 뼈대 만들기7. 5 단계 – 실행될 프로그램의 스타일과 설명문 ( 주석문 ) 을 자동으로 삽입할

것인지 여부 , MFC 라이브러리를 어떤 방식으로 사용할 것인지 여부 등을 설정함

Page 21: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍21

프로그램 뼈대 만들기8. 6 단계

Page 22: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍22

프로그램 뼈대 만들기

8. 마지막 단계 – 생성될 프로젝트의 정보를 나타냄

Page 23: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍23

애플리케이션 마법사를 이용한 MFC 프로젝트의 작성9. 생성된 프로젝트의 모습

Page 24: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍24

프로그램 뼈대 만들기10. 실행결과

Page 25: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍25

프로그램 뼈대 만들기 탭의 전환에 따른 workspace 정보들

탭에 대한 설명

탭 선택 설명

클래스 정보 프로젝트에 포함된 클래스들의 종류와 멤버변수 , 함수등의 정보를 보여줌

리소스 정보 프로젝트에 사용될 메뉴 , 버튼 , 아이콘 등의 작성과 관리

파일 정보 프로젝트에 포함된 파일이름과 헤드 파일들을 보여주고 관리함

Page 26: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍26

프로그램 뼈대 만들기 MFC 프로그램의 구성요소 세가지

메인프레임 윈도우 윈도우 내부의 오픈된 창 부분을 제외한 나머지 부분을 가리킴 메뉴 , 툴바 , 상태바 등의 프로그램을 뼈대를 가짐

문서객체 데이터의 저장 , 변환 , 처리 , 삭제 등을 담당하는 객체 눈에 보이지 않음

뷰객체 문서객체의 데이터를 화면 ( 열린창 ) 에 출력하는 역할을

담당하는 객체

MFC 프로그래밍 데이터의 처리와 데이터의 출력을 분리된 두개의 다른 클래스에서 담당

Page 27: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍27

프로그램 뼈대 만들기 View 클래스의 OnDraw() 함수

데이터를 화면에 출력하는 기능을 담당하는 함수

Page 28: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍28

프로그램 뼈대 만들기 객체들간의 메시지 통신

세가지 객체들은 서로 통신되어야 함 HOW?

객체들 사이에서 데이터나 함수의 상호참조를 위해 유용한 함수를 제공함

Page 29: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍29

프로그램 뼈대 만들기 Document 클래스 (CtestDoc) 에 마우스를 두고

오른쪽 버튼을 누르면 메뉴가 나타남 이 메뉴상에서 <Add Member Variable…> 을 선택 클래스에 새로운 멤버변수를 추가하고자 할 경우에 사용함

Page 30: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍30

프로그램 뼈대 만들기 입력대화상자가 나타나고 , 각 변수 타입과 변수이름 , 접근 방법을 물어본다 . 다음과 같이 설정하라 .

변수 타입 변수명 접근방법

unsigned char m_InImg[256][256] Public

unsigned char m_OutImg[256][256] Public

Page 31: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍31

프로그램 뼈대 만들기 다음과 같이 나타남

Page 32: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

4 주차 - MFC 를 이용한 영상처리 프로그래밍32

프로그램 뼈대 만들기 프로그램 타입

Single Document SDI 하나의 프로그램에 하나의 창만 존재하는 구조 Internet Explorer 는 대표적인 SDI 구조

Multiple Document MDI PaintShop 과 같이 프로그램 내에 여러 개의 창이나 문서를 열

수 있는 구조 많은 응용 프로그램들이 이 구조를 사용함

Dialog based 타입의 Document 메시지 박스나 이와 같은 구조를 사용하는 프로그램

Page 33: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

CxImage 라이브러리 연동하기 헤더 파일 복사하기

FirstCxImage 프로젝트의 폴더 공간에 include 폴더를 만듬

Cximage599c_full/CxImage 의 모든 헤더파일(*.h) 를 앞의 include 폴더로 복사하기

2 주차 - 디지털영상처리의개념33

Page 34: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

CxImage 라이브러리 연동하기 헤더 파일 디렉토리를 프로젝트 설정에 포함하기

2 주차 - 디지털영상처리의개념34

Page 35: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

CxImage 라이브러리 연동하기 StdAfx.h 에 CxImage 의 헤더 파일인 xImage.h

추가하기

2 주차 - 디지털영상처리의개념35

Page 36: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

CxImage 라이브러리 연동하기 CxImage 정적 링크 라이브러리 연동하기

CxImage 정적 라이브러리와 연동할 영상 포맷 관련 라이브러리 복사하기

윈도우 검색 메뉴를 이용하여 , Cximage599c_full 폴더에서 제공된 *.lib 를 찾아보자

여러 개의 파일 중 영상 포맷 관련 라이브러리를 복사하자 파일들…

J2k.lib , Jasper.lib , Jbig.lib , Jpeg.lib , Png.lib , Tiff.lib , Zlib.lib

자신이 생성한 프로젝트 FirstCxImage 폴더 안에 lib 폴더를 만들고 그 안에 복사하여 붙여 넣자 .

2 주차 - 디지털영상처리의개념36

Page 37: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

CxImage 라이브러리 연동하기 CxImage 정적 링크 라이브러리 복사하기

Cximage599c_full 폴더 내에 있는 CxImage 폴더 내에 있는 debug 폴더 내에

Cximage.lib 를 복사하기 FirstCxImage 폴더 내에 debug 폴더 안에

복사한 CxImage.lib 를 붙여넣기

2 주차 - 디지털영상처리의개념37

Page 38: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

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

Page 39: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

CxImage 라이브러리 연동하기 FirstCxImage 재빌드 시키고 실행하기

2 주차 - 디지털영상처리의개념39

Page 40: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 읽기 MFC 구현

영상을 읽고 저장할때 필요한 변수를 관리하는 곳… ? 수행은… ?

읽은 영상 데이터를 우리 눈에 보여주는 곳… ? 수행은… ?

View 와 Document 클래스 Document 클래스

데이터의 저장 , 변환 , 처리를 위한 역할 View 클래스

도큐먼트 클래스의 데이터를 화면에 출력하는 역할

2 주차 - 디지털영상처리의개념40

Page 41: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 읽기 도큐먼트 클래스에 멤버 변수 추가

CFirstCxImageDoc 선택 후 , 오른쪽 마우스 버튼을 누르면 팝업 메뉴가 나타남

Add Member Variable… 을 선택 입력 대화창에 변수 이름과 데이터형을 입력한다 .

데이터형 : CxImage* 변수 이름 : m_pImage 확인버튼 클릭하면 , workspace 창이나 소스의 헤더 파일에

추가됨 . 추가된 m_Image 를 초기화하기

FirstCxImageDoc.cpp 의 생성자 파일 CFirstCxImageDoc() 에서 초기화하기

m_pImage = NULL;

2 주차 - 디지털영상처리의개념41

Page 42: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 읽기 영상 파일을 읽어 오는 함수 재정의

읽거나 저장하는 방법 Serialize 멤버 변수를 사용하는 것

MFC 클래스 내 데이터를 직접 읽거나 저장하는 가장 손쉬운 방식

OnOpenDocument 함수를 재정의 (overriding) 하는 것 가상 함수를 추가 영상 데이터의 파일 포맷별 고유 특징 때문에

OnOpenDocument(), OnSaveDocument() 함수를 재정의한 후 , 파일명을 넘겨 받아 처리하는 루틴 추가

OnOpenDocument() 함수를 추가 CFirstCxImageDoc.cpp 문서에 팝업 메뉴에서 [Add

Virtual Funtion] 을 선택하기 OnOpenDocument 를 선택하고 OnNewDocument 를

선택하여 [Add & Edit] 버튼을 클릭

2 주차 - 디지털영상처리의개념42

Page 43: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 읽기 함수 내에 다음을 추가하기

m_pImage = new CxImage; m_pImage->Load(lpszPathName, 0);

앞에서 메모리 할당 받음… 삭제해주는 Virtual 함수도 추가해야 함 ..

2 주차 - 디지털영상처리의개념43

Page 44: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 읽기 DeleteDocuments 함수 추가

CFirstCxImageDoc.cpp 문서에 팝업 메뉴에서 [Add Virtual Funtion] 을 선택하기

DeleteDocuments 를 선택하고 OnNewDocument 를 선택하여 [Add & Edit] 버튼을 클릭

함수 내에 다음을 추가하기 if(m_pImage ) delete m_pImage;

2 주차 - 디지털영상처리의개념44

Page 45: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 읽기 파일 열기 함수 OnFileOpen() 재정의

다양한 확장자를 갖는 영상 파일을 지원하기 위해 OnFileOpen() 즉 메뉴의 열기를 지원하기

프레임 윈도우 (frame window) 클래스 메뉴 , 툴바 , 상태바 등 프로그램을 구성하는 부분을

담당하는 클래스 CFirstCxImageApp 클래스를 의미함

메뉴에 프로그램 추가하기 Workspace 창의 Resource View 의 메뉴 중

IDC_MAINFRAME 을 선택하기 [ 파일 ]-[열기 ] 를 선택하고 오른쪽 마우스를 클릭 메뉴 중 [class wizard] 를 선택 다음과 같이 셋팅하기

2 주차 - 디지털영상처리의개념45

Page 46: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 읽기

Add Function 을 클릭하면 [OK] 버튼 클릭하면 member functions 에 함수가 추가됨 Edit Code 를 클릭하면 소스 작성 창으로 접근

2 주차 - 디지털영상처리의개념46

Page 47: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 읽기 다음과 같이 작성하기

char szFilter[] = " 지원 영상 파일 (*.bmp, *.jpg, *.gif, *png, *.tif)|*.bmp;*.jpg;*.gif;*.png;*.tif||";

2 주차 - 디지털영상처리의개념47

Page 48: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 읽기 영상 보기

도큐먼트 클래스에서 넘어온 입력 파일에서 읽어 들인 영상 데이터는 m_pImage 에 저장됨

이를 보여주기 위해 뷰 클래스 사용함 OnDraw 멤버 함수를 호출하여 프로그램 작성하기 OnDraw ()

화면에 결과를 출력하는 Cview 클래스의 대부분 역할을 담당하는 멤버 함수

영상 출력하기 뷰클래스 (CFirstCxImageView) 내의 OnDraw() 함수

선택 소스 다음과 같이 코딩하기

2 주차 - 디지털영상처리의개념48

Page 49: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 읽기

실행해보기

2 주차 - 디지털영상처리의개념49

Page 50: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 읽기

2 주차 - 디지털영상처리의개념50

Page 51: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 읽기 영상 크기에 맞추어 스크롤 지원하기

Oninitialupdate() 멤버 함수를 클릭하여 다음과 같이 코딩하기

기본적인 Oninitialupdate() 함수의 내용

2 주차 - 디지털영상처리의개념51

Page 52: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 읽기 다음과 같이 수정하시오 .

2 주차 - 디지털영상처리의개념52

Page 53: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 읽기 실행결과

2 주차 - 디지털영상처리의개념53

Page 54: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 읽기 처음 실행 시 나타나는 창 제거하기

Workspace 창의 class View 탭에서 … 메인 프로임 윈도우 클래스인 CFirstCxImageApp 의

InitInstance() 함수를 확인하기 다음과 같이 수정하기

2 주차 - 디지털영상처리의개념54

Page 55: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 읽기 그 외의 다른 방법

if (!ProcessShellCommand(cmdInfo)) return FALSE;

위의 내용을 주석 처리해서 실행하지 못하도록 막으면 새로운 창이 나타나지 않음 .

실행해보기

2 주차 - 디지털영상처리의개념55

Page 56: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 읽기 드래그 앤 드롭으로 영상 파일 열기

프로그램에 영상 파일을 끌어다 놓으면 이를 감지하고 파일을 열어주기

Instance() 함수에 다음을 추가하자 .

2 주차 - 디지털영상처리의개념56

Page 57: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 읽기 영상의 크기에 맞춰 보여주기

창의 크기와 영상의 원래 크기가 일치하지 않으므로 이를 수정하기

영상의 크기에 맞춰 창이 보여지게끔 해보자 .

[Class View] 탭에서 CChildFrame 클래스를 선택하기 마우스 오른쪽 버튼을 눌러 팝업 메뉴 중 [Add Virtual

Function] 을 선택하기 가상 함수 ActiveFrame 멤버 함수를 선택 , [Add & Edit]

버튼 클릭 ActiveFrame 멤버 함수

자식 프레임 클래스 (child frame class) 의 형태를 정의하는 것 메인 프레임 클래스는 부모 프레임 클래스를 지칭함

2 주차 - 디지털영상처리의개념57

Page 58: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 읽기 다음과 같이 소스 수정 및 추가하기

2 주차 - 디지털영상처리의개념58

Page 59: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 읽기 앞의 클래스 내의 헤더파일 추가하기

#include "FirstCxImageDoc.h"

2 주차 - 디지털영상처리의개념59

Page 60: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 저장 영상 저장을 위해

OnSaveDocument() 함수를 재정의 하고 , 파일명을 넘겨받아 처리하는 루틴을 추가하기

도큐먼트 클래스의 소스인 CFirstCxImageDoc 에 추가하기 오른쪽 마우스 버튼 클릭 후 , [Add Virtual Function] 선택하기

2 주차 - 디지털영상처리의개념60

Page 61: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 저장 가상 함수 중 OnSaveDocument() 를 선택 하후 , [Add &

Edit] 버튼을 클릭하고 소스 작성하기

2 주차 - 디지털영상처리의개념61

Page 62: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 저장 사실상 , 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

Page 63: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 저장 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

Page 64: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 저장 클래스의 역할 MFC AppWizard 를 이용하여 FirstCxImage

프로젝트를 생성하면 여섯 개의 클래스가 생성됨 C FirstCxImageDoc 클래스

여기에서 Doc 는 문서 (Document) 를 의미함 데이터의 저장이나 변환 등과 같이 실질적인 데이터 처리를

담당 C FirstCxImageView 클래스

CImageProDoc 클래스에서 처리된 데이터를 출력 장치를 통하여 보여주는 역할 수행

CMainFrame 클래스 프로그램 전체 윈도우에 대한 관리 담당

2 주차 - 디지털영상처리의개념64

Page 65: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

영상 저장 CChildFrame 클래스

프로그램 윈도우 안에 생성되는 여러 개의 서브윈도우에 대한 관리 담당

CAboutDlg 클래스 프로그램의 [ 도움말 ] 메뉴의 “FirstCxImage 정보“라는

항목을 선택하면 나타나는 대화상자에 대한 관리 담당 C FirstCxImageApp 클래스

FirstCxImage 프로그램 전체에 대한 관리를 담당

2 주차 - 디지털영상처리의개념65

Page 66: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

예제로 지터 효과 주기 지터 효과 (jitter effect)

이미지의 각 픽셀에서 각 랜덤 값을 추가함 지터 효과를 제공하는 라이브러리 함수의 특징

Bool CxImage::Jitter(long radius = 2)[inherited] Parameter

Radius – maximum pixel displacement Returns

True if everthing is ok

2 주차 - 디지털영상처리의개념66

Page 67: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

예제로 지터 효과 주기 Jitter() 소스

2 주차 - 디지털영상처리의개념67

Page 68: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

예제로 지터 효과 주기

2 주차 - 디지털영상처리의개념68

Page 69: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

예제로 지터 효과 주기 프로그램에 메뉴 추가하여 지터 메뉴 삽입

[Resource View] 탭에서 메뉴 IDC_FIRSTCTYPE 을 선택

도움말 뒤에 메뉴 추가하기 도움말 뒤에 마우스 커서를 가져다 놓고 오른쪽

마우스 클릭하면 메뉴 중 [Properties] 를 선택

메뉴 1 장 아래로 또 다시 메뉴를 추가하기2 주차 - 디지털영상처리의개념

69

Page 70: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

예제로 지터 효과 주기

2 주차 - 디지털영상처리의개념70

Page 71: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

예제로 지터 효과 주기 지터 함수 호출

메뉴를 선택할때 jitter() 함수를 호출하여 실행할 곳이 필요함 .

메뉴의 jitter – cximage 를 선택하면 jitter() 함수가 호출되도록 설정하기

연결할 메뉴를 선택 오른쪽 마우스버튼 클릭하면 메뉴 중 [ClassWizard]

를 선택하기

2 주차 - 디지털영상처리의개념71

Page 72: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

예제로 지터 효과 주기 다음과 같이 설정하고 , [Add Function] 버튼을 클릭하기

[Add Member Function] 창이 뜨면… [ok] 버튼 클릭 Member functions 에 앞의 함수 이름이 추가됨 Edit Code 버튼을 눌러 소스 작성을 위해 포커스 이동

2 주차 - 디지털영상처리의개념72

Page 73: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

예제로 지터 효과 주기 다음과 같이 JITTER 함수를 호출할 소스 입력하기

2 주차 - 디지털영상처리의개념73

Page 74: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

예제로 지터 효과 주기 실행하기

Jitter 실행 결과 보기

2 주차 - 디지털영상처리의개념74

Page 75: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

예제로 지터 효과 주기 클립보드 복사 , 붙여넣기

원 영상에 jitter() 함수의 결과가 덮여쓰여짐원 영상과 jitter() 함수의 결과를 같이 비교할 수

있도록 새로운 창이 결과가 유도되도록 해보자 클립보드 복사와 붙여 넣기를 통해

원 영상을 미리 복사하기 새로운 창에 같은 원 영상을 붙여 넣기

클립보드 특정 프로그램의 데이터를 다른 프로그램으로 데이터를

넘겨줄 수 있도록 해주는 기능 데이터의 포맷을 제대로 지원한다면 어디서나 사용 가능

2 주차 - 디지털영상처리의개념75

Page 76: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

예제로 지터 효과 주기 클립보드 복사하기

[Class View] 탭을 선택하고 , CFirstCxImageDoc 를 선택하여 새로운 함수 CopyClipBoard() 를 추가하기

추가된 CopyClipBoard() 에 다음의 코드 삽입하기

2 주차 - 디지털영상처리의개념76

Page 77: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

예제로 지터 효과 주기

2 주차 - 디지털영상처리의개념77

Page 78: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

예제로 지터 효과 주기 앞의 소스를 통해서 클립보드 복사 영역의 소스를

구현했지만 이를 연결해야 함 . 메뉴 중 [ 편집 복사 ] 에 연결하기

메뉴 [ 편집 복사 ] 를 선택한 후 , 오른쪽 마우스 버튼 클릭하면 나타나는 메뉴 중 [ClassWizard] 를 선택

클래스 위저드를 다음과 같이 설정하고 , [Add Function] 버튼을 클릭한다 .

Add member function 창에 함수이름을 설정하고 [ok] 버튼을 클릭하면 , 클래스 위저드 창의 Member function 에 추가되고 Edit Code 버튼 클릭 후 , 소스를 작성하자 .

2 주차 - 디지털영상처리의개념78

Page 79: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

예제로 지터 효과 주기

2 주차 - 디지털영상처리의개념79

Page 80: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

예제로 지터 효과 주기 소스는 다음과 같이 작성

2 주차 - 디지털영상처리의개념80

Page 81: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

예제로 지터 효과 주기 클립보드 붙이기

[ 편집 ]-[붙여넣기 ] 메뉴를 통해서 소스를 작성하자 . 여기서는 도큐먼트 클래스가 아니라 프레임 윈도우를 이용함

2 주차 - 디지털영상처리의개념81

Page 82: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

예제로 지터 효과 주기 다음과 같이 코드 작업하기

2 주차 - 디지털영상처리의개념82

Page 83: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

예제로 지터 효과 주기 소스 (1)

void CFirstCxImageApp::OnEditPaste() {

// TODO: Add your command handler code herePOSITION 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();pDoc->m_pImage-

>CreateFromHANDLE(hBitmap);

2 주차 - 디지털영상처리의개념83

Page 84: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

예제로 지터 효과 주기 소스 (2)

POSITION pos = pDoc->GetFirstViewPosition();CFirstCxImageView *pView =

(CFirstCxImageView *)pDoc->GetNextView(pos);

CSize sizeTotal = CSize(pDoc->m_pImage->GetWidth(), pDoc->m_pImage->GetHeight());

pView->SetScrollSizes(MM_TEXT, sizeTotal);pView->ResizeParentToFit(FALSE);}

::CloseClipboard();}

}

2 주차 - 디지털영상처리의개념84

Page 85: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

예제로 지터 효과 주기 hBitmap = ::GetClipboardData(CF_DIB) 에서

CF_DIB 데이터가 존재해야 함 . OnEditPaste() 함수 전에 호출되는

OnUpdateEditPaster() 함수를 이용해서 CF_DIF 를 활성화시킴

[Add Function] 클릭 [Edit Code] 버튼 클릭

2 주차 - 디지털영상처리의개념85

Page 86: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

예제로 지터 효과 주기 다음과 같이 소스 작성하기

2 주차 - 디지털영상처리의개념86

Page 87: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

예제로 지터 효과 주기 실행하기

2 주차 - 디지털영상처리의개념87

Page 88: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

직접 구현한 지터 효과주기 앞의 방법

공개된 라이브러리를 통해서 작성한 방식 직접 구현해보자 .

파일 읽기 , 저장 , 보기 함수만을 이용하고 실제 다른 영상 처리 기법들은 우리가 구현해보도록 하자 .

2 주차 - 디지털영상처리의개념88

Page 89: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

직접 구현한 지터 효과주기 직접 구현하기 위한 작업

다양한 영상 처리를 지원해줄 클래스를 만들자 . 새로운 클래스 생성하기 클래스의 옵션을 다음과 같이 설정하기

클래스 타입 Generic Class

Name Cfilter

2 주차 - 디지털영상처리의개념89

Page 90: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

직접 구현한 지터 효과주기 Filter.h 헤더파일 작성하기

[File View] 탭에 접근하여 코드 추가하기

2 주차 - 디지털영상처리의개념90

Page 91: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

직접 구현한 지터 효과주기 Filter.cpp 작성하기

소스 내에 #include "math.h“ 를 추가하기 그리고 기본 소스는 다음과 같이 추가함

2 주차 - 디지털영상처리의개념91

Page 92: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

직접 구현한 지터 효과주기 소스 (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

Page 93: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

직접 구현한 지터 효과주기 소스 (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

Page 94: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

직접 구현한 지터 효과주기 작성한 지터 효과를 메뉴에 연결하기

2 주차 - 디지털영상처리의개념94

Page 95: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

직접 구현한 지터 효과주기 메뉴에서 클래스 위저드로 접근하여 다음과 같이

설정함

2 주차 - 디지털영상처리의개념95

Page 96: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

직접 구현한 지터 효과주기 다음과 같이 연결하기 위한 코드 작성하기먼저 , 헤더 파일 추가하기

Filter 클래스의 내용을 끌어다 사용하므로 헤더파일에 추가해야 함

2 주차 - 디지털영상처리의개념96

Page 97: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

직접 구현한 지터 효과주기 실제 지터함수를 연결하는 코드 작성하기

2 주차 - 디지털영상처리의개념97

Page 98: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

직접 구현한 지터 효과주기 실행하기

2 주차 - 디지털영상처리의개념98

Page 99: 1 장 .  디지털 영상처리의                  개념 (2)

영상처리 – 영상처리 개념 및 구현하기

수행 시간 측정하기 수행 시간 측정

메모리를 많이 차지하는 영상 처리 시간이 관건 다양한 알고리즘 중 성능을 평가하기 위한 의도로 수행

시간을 측정함각 영상 처리의 수행 시간을 Debug 결과를 통해서

알려주려 함 수행 시간을 보는 방법

TRACE 매크로를 이용하는 방법 디버그 모드가 아니라 릴리즈 모드에서 볼 수 있음

Debug View 를 통해서 확인하는 방법 사용할 방법 가벼운 디버깅 모니터링 도구인 Debug View 를 이용하여

수행 시간 확인2 주차 - 디지털영상처리의개념

99