28
1 Visual C++ 을 이용한 디지털 영상처리 4장. MFC를 이용한 영상처리 프로그래밍 2006. 9. 강남대학교 컴퓨터미디어공학부

4장. MFC를이용한영상처리 프로그래밍pds2.egloos.com/pds/200610/25/55/4.mfc programming.pdf · 4장. MFC 프로그래밍 1. Application Wizard MFC Programming (Microsoft

  • Upload
    others

  • View
    29

  • Download
    1

Embed Size (px)

Citation preview

1

Visual C++을 이용한디지털 영상처리

4장. MFC를 이용한 영상처리프로그래밍

2006. 9.

강남대학교 컴퓨터미디어공학부

2

4장. MFC 프로그래밍

Agenda

1. Application Wizard를 이용한 MFC 프로젝트 작성

2. MFC를 이용한 영상처리 프로그램의 작성

3. 역상 계산을 위한 메뉴와 함수의 추가

4. 장치 독립 비트맵을 이용한 고속 화면 출력

5. MFC 프로그램의 구조

3

Application Wizard를 이용한MFC 프로젝트의 작성

4장. MFC 프로그래밍1. Application Wizard

MFC Programming (Microsoft Foundation Class)

- Visual C++의 클래스 라이브러리

Application Wizard : Project type, Application type, 기타 옵션들을 설정해

줌으로써 프로그래밍을 위한 기본적인 준비를 도와주는 도구

Visual C++의 [File]-[New] 메뉴 선택

[Project] 탭 – ‘MFC AppWizard(exe)’ 클릭

Project name 입력(‘WinTest’)

Location 지정 : 프로젝트 저장 위치

4

4장. MFC 프로그래밍1. Application WizardApplication Wizard : step-1

Step-1. Application type : Multiple documents

5

4장. MFC 프로그래밍1. Application WizardApplication Wizard : step-1

<옵션에 따른 프로젝트 타입>

메시지 박스나 버튼 등을 이용하는 구조

ex) 계산기Dialog based

하나의 프로그램 내에 여러 개의 창이나 문서를 열 수 있는 구조. ex) PaintShop

Multiple Documents (MDI)

하나의 프로그램에 하나의 창만 존재하는 구조.

ex) Internet ExplorerSingle Documents (SDI)

설 명옵 션

<Dialog based><SDI> <MDI>

6

4장. MFC 프로그래밍1. Application WizardApplication Wizard : step-2

Step-2. Database 기능 추가 여부 : None

7

4장. MFC 프로그래밍1. Application WizardApplication Wizard : step-3

Step-3. OLE(Object Linking and Embedding) 관련 선택 : None

study

study

8

4장. MFC 프로그래밍1. Application WizardApplication Wizard : step-4

Step-4. 툴바, 상태바, 프린트 기능 등 : Default

실행 시 메뉴에서읽어들일 영상파일의 확장자 프로그램 타이틀

바에 나타날 이름

9

4장. MFC 프로그래밍1. Application WizardApplication Wizard : step-5

Step-5. MFC 라이브러리 사용 방식 : As a shared DLL

study

10

4장. MFC 프로그래밍1. Application WizardApplication Wizard : step-6

Step-6. 옵션 선택 : CScrollView

자동으로스크롤바 생성

11

4장. MFC 프로그래밍1. Application WizardApplication Wizard : step-7

Step-7. 생성할 프로젝트에 대한 정보 표시

12

4장. MFC 프로그래밍1. Application Wizard프로젝트 모습, 실행 화면

<실행 화면><생성된 프로젝트 모습>

13

4장. MFC 프로그래밍1. Application Wizard탭에 따른 Workspace 정보

<클래스 정보> <파일 정보><리소스 정보>

14

MFC 프로그램의 구성 요소 3가지

메인 프레임 윈도우 : 메뉴, 툴바,

상태바 등 뼈대

문서 객체 : 데이터 저장, 변환, 처리,

삭제 등을 담당, 안 보임

뷰 개체 : 데이터를 윈도우에 출력

객체들간의 메시지 통신

MFC 프로그램의 주요 객체

Document/View Structure : 데이터 처리와 출력을 분리

Application Class

Document Class

영상 데이터Read/write

문서를 창을통해 나타냄

ViewClass

MainFrameClass

상호 참조를위한 함수들

Study : 객체지향 언어의특징 5가지

4장. MFC 프로그래밍1. Application Wizard

15

MFC를 이용한 영상처리프로그램의 작성

4장. MFC 프로그래밍2. 영상처리 프로그램 작성

[Class] 탭 – CWinTestDoc 객체 위에서 마우스 <R-Button>

- <Add Member Variable>

입력 대화 창에 아래와 같이 입력

같은 방법으로 m_OutImg[256][256] 도 추가

16

4장. MFC 프로그래밍2. 영상처리 프로그램 작성Serialize() 코드 입력

CWinTestDoc의 멤버 함수인 Serialize()를 <Double Click> 후 아래 코드를 입력

void CWinTestDoc::Serialize(CArchive& ar){

if (ar.IsStoring()) // Storing code// 처리된 영상배열 m_OutImg를 파일로 저장ar.Write(m_OutImg, 256*256);

else { // Loading codeCFile *infile = ar.GetFile(); // 입력할 파일의 포인터를 가져옴if (infile->GetLength() != 256*256) { // 파일 크기를 검사

AfxMessageBox("파일 크기가 256x256 사이즈가 아닙니다.");return;

}// 영상 파일을 읽어서 m_InImg 배열에 저장ar.Read(m_InImg, infile->GetLength());

}}

CArchive 클래스 : 외부 데이터를 읽고 저장하는 기능 지원

Serialize()CDocument 클래스 CMemFile 클래스

CFile 클래스

CSocketFile 클래스

디스크 저장

메모리 저장

네트웤 연결

<CArchive 클래스를 통한 데이터의 입출력>

17

4장. MFC 프로그래밍2. 영상처리 프로그램 작성OnDraw() 코드 입력

CWinTestView의 멤버 함수인 OnDraw()를 <Double Click> 후 아래 코드를 입력

void CWinTestView::OnDraw(CDC* pDC){

// Document 클래스 인스턴스 포인터를 가져옴CWinTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);

for (int i=0; i<256; i++) // 세로 인텍스 : ifor (int j=0; j<256; j++) { // 가로 인덱스 : j

unsigned char InVal = pDoc->m_InImg[i][j];unsigned char OutVal = pDoc->m_OutImg[i][j];

pDC->SetPixel(j, i, RGB(InVal, InVal, InVal));pDC->SetPixel(j+300, i, RGB(OutVal, OutVal, OutVal));

}}

CDC 클래스GDI(Graphic Device Interface) : 디바이스 드라이브를 통해 하드웨어에 독립적

인 프로그래밍 가능. 이러한 윈도우 제공 그래픽 환경을 의미

DC(Device Context) : 그래픽에 필요한 모든 옵션을 모아놓은 구조체

CDC(Calss of DC) : MFC에서 제공하는 DC 클래스

ex) CDC *pDC = GetDC(); // 인스턴스를 얻어옴

pDC->TextOut(100,100,”문자 출력의 예”);

ReleaseDC(pDC);

study

18

4장. MFC 프로그래밍2. 영상처리 프로그램 작성영상 출력 결과

프로그램을 실행시킨 후 “Citrus.raw” 파일을 읽어들여 화면에 출력한 예

19

역상 계산을 위한 메뉴와함수의 추가

4장. MFC 프로그래밍3. 역상 계산 메뉴&함수 추가

메뉴 방식의 명령 입력으로 역상 계산 함수를 작성

(2) Class Wizard를 이용한 메뉴 처리 함수 구현

(1) Resource 편집기를 이용한 메뉴 수정

눈에 보이는 메뉴 작성 메뉴가 눌러졌을 때 실행되는 함수 작성

20

4장. MFC 프로그래밍3. 역상 계산 메뉴&함수 추가(1) Resource 편집기를 이용한 메뉴 수정

영상 처리 캡션 입력창

메뉴 생성

메뉴 아이템 내용 추가 추가된 메뉴 명령

실행창의 상태바에 표시

단축키

21

4장. MFC 프로그래밍3. 역상 계산 메뉴&함수 추가(2) Class Wizard를 이용한 메뉴 처리 함수 구현

Class Wizard 실행 : [View]-[ClassWizard] 또는 <Ctrl>+<W>

22

4장. MFC 프로그래밍3. 역상 계산 메뉴&함수 추가(2) Class Wizard를 이용한 메뉴 처리 함수 구현

멤버 함수 입력부

소스 코드 입력

void CWinTestDoc::OnReverseImg() {

for (int i=0; i<256; i++)for (int j=0; j<256; j++)

m_OutImg[i][j] = 255 - m_InImg[i][j];

UpdateAllViews(NULL); // 현재 출력된 윈도우 화면을 갱신하여 다시 출력}

cf) View Class에서는Invalidate() 함수 이용

23

4장. MFC 프로그래밍3. 역상 계산 메뉴&함수 추가(2) Class Wizard를 이용한 메뉴 처리 함수 구현

(Option) 추가할 역상처리 함수를 View Class에 두는 경우

소스 코드 입력

void CWinTestView::OnReverseImg() {

CWinTestDoc *pDoc = GetDocument();ASSERT_VALID(pDoc);

for (int i=0; i<256; i++)for (int j=0; j<256; j++)

pDoc->m_OutImg[i][j] = 255 - pDoc->m_InImg[i][j];

Invalidate(FALSE); // 화면 갱신}

FALSE : 서로 다른 부분만을 갱신TRUE : 화면 전체를 갱신

24

SetPixel() 함수 : 편리하지만 속도가 느림 -> 장치 독립 비트맵을 이용한 고속 출력

4장. MFC 프로그래밍4. 장치독립 비트맵 이용

장치독립 비트맵을 이용한고속 화면 출력

(1) 멤버 변수 추가

CWinTestView 클래스에서 <R-Button>

아래 3개의 변수도 추가

Publicm_RevImg

[256][256]

unsigned char

Publicwidthint

Publicheightint

Access변수이름변수타입

CWinTestView.h

25

4장. MFC 프로그래밍4. 장치독립 비트맵 이용(2) 흑백 BMP 파일의 영상 헤드 및 팔레트 설정

CWinTestView 클래스의 생성자 맴버 함수 CWinTestView()에 아래 코드 추가

CWinTestView::CWinTestView(){

height = width = 256;int rwsize = (((width)+31)/32*4); // 영상 폭은 항상 4byte의 배수

BmInfo = (BITMAPINFO *)malloc(sizeof(BITMAPINFO)+256*sizeof(RGBQUAD));

BmInfo->bmiHeader.biBitCount = 8;BmInfo->bmiHeader.biClrImportant = 256;BmInfo->bmiHeader.biClrUsed = 256;BmInfo->bmiHeader.biCompression = 0;BmInfo->bmiHeader.biHeight = height;BmInfo->bmiHeader.biPlanes = 1;BmInfo->bmiHeader.biSize = 40;BmInfo->bmiHeader.biSizeImage = rwsize*height;BmInfo->bmiHeader.biWidth = width;BmInfo->bmiHeader.biXPelsPerMeter = 0;BmInfo->bmiHeader.biYPelsPerMeter = 0;

for (int i=0; i<256; i++) {BmInfo->bmiColors[i].rgbRed =

BmInfo->bmiColors[i].rgbGreen = BmInfo->bmiColors[i].rgbBlue = i;

BmInfo->bmiColors[i].rgbReserved = 0;}

}

256 level

8bit

gray scale

256x256 이미지

26

4장. MFC 프로그래밍4. 장치독립 비트맵 이용(2) 흑백 BMP 파일의 영상 헤드 및 팔레트 설정

BITMAPINFO 구조체 : 장치 독립 비트맵 표현을 위한 구조체

영상 헤드(BITMAPINFORHEADER) + 팔레트(GRBQUAD)

typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1];

} BITMAPINFO;

BITMAPINFOHEADER 구조체

typedef struct tagBITMAPINFOHEADER{DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant;

} BITMAPINFOHEADER;

할당된 메모리를 소멸자에서 해제 CWinTestView::~CWinTestView(){

free(BmInfo);}

27

4장. MFC 프로그래밍4. 장치독립 비트맵 이용(3) OnDraw() 함수의 작성

OnDraw() 함수 내에 아래 코드를 추가

void CWinTestView::OnDraw(CDC* pDC){

// Document 클래스 인스턴스 포인터를 가져옴CWinTestDoc *pDoc = GetDocument();ASSERT_VALID(pDoc);

int i, j;

// 원 영상(m_InImg)의 화면 출력for (i=0; i<height; i++)

for (j=0; j<width; j++)m_RevImg[i][j] = pDoc->m_InImg[height-i-1][j]; // 상하 반전

SetDIBitsToDevice(pDC->GetSafeHdc(), 0, 0, width, height, 0, 0, 0, height, m_RevImg, BmInfo, DIB_RGB_COLORS);

// 처리한 결과 영상(m_OutImg)의 화면 출력for (i=0; i<height; i++)

for (j=0; j<width; j++)m_RevImg[i][j] = pDoc->m_OutImg[height-i-1][j]; // 상하 반전

SetDIBitsToDevice(pDC->GetSafeHdc(), 300, 0, width, height, 0, 0, 0, height,m_RevImg, BmInfo, DIB_RGB_COLORS);

}

28

4장. MFC 프로그래밍4. 장치독립 비트맵 이용(3) OnDraw() 함수의 작성

SetDIBitsToDevice() 함수 : 장치 독립 비트맵 영상 데이터를 화면의 특정한 영역에

출력하기 위한 함수

int SetDIBitsToDevice(HDC hdc, // handle to DCint XDest, // x-coord of destination upper-left cornerint YDest, // y-coord of destination upper-left corner DWORD dwWidth, // source rectangle widthDWORD dwHeight, // source rectangle heightint XSrc, // x-coord of source lower-left cornerint YSrc, // y-coord of source lower-left cornerUINT uStartScan, // first scan line in arrayUINT cScanLines, // number of scan linesCONST VOID *lpvBits, // array of DIB bitsCONST BITMAPINFO *lpbmi, // bitmap informationUINT fuColorUse // RGB or palette indexes

);

실행 결과 확인

5. MFC 프로그램의 구조 : 각자 study