이미지 워핑과 모핑

Similar documents
Chapter 03 영역기반처리 2장의픽셀기반처리에서는각픽셀의값을처리할때주위픽셀의값은전혀고려하지않고단지현재의픽셀값만을참조하였다. 이에반해영역기반처리는입력픽셀과그주위픽셀값을고려하여출력픽셀의값을결정한다. 영역기반처리는영상을흐리게하거나, 영상을선명하게하거나, 영상의경계선을검

PowerPoint 프레젠테이션

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

<B9CCB5F0BEEE20C1A4BAB8C3B3B8AE2E687770>

105È£4fš

untitled

Microsoft PowerPoint - chap06-2pointer.ppt

PowerPoint 프레젠테이션

슬라이드 1

Microsoft PowerPoint - C++ 5 .pptx

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

02장.배열과 클래스

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

11장 포인터

PowerPoint Template

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

KNK_C_05_Pointers_Arrays_structures_summary_v02

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

Microsoft PowerPoint - additional01.ppt [호환 모드]

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

금오공대 컴퓨터공학전공 강의자료

히스토그램구하기 사전준비 : 히스토그램을저장할메모리가필요함 필요한메모리개수 à 전체영상의픽셀은그값이 0 ~ 255이므로 256 개의메모리필요함 영상을구성하는픽셀의개수는매우크므로메모리형식은 unsigned long으로해야함 ( unsigned 란 +/- 를고려하지않는다는

#편집인협회보381호_0422

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

윈도우시스템프로그래밍

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

Microsoft PowerPoint - ch07 - 포인터 pm0415

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

PowerPoint 프레젠테이션

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

Microsoft PowerPoint - Java7.pptx

C 언어 프로그래밊 과제 풀이

영상 처리 프로그래밍 By Visual C++

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

PowerPoint Presentation

fprintf(fp, "clf; clear; clc; \n"); fprintf(fp, "x = linspace(0, %d, %d)\n ", L, N); fprintf(fp, "U = [ "); for (i = 0; i <= (N - 1) ; i++) for (j = 0

PowerPoint 프레젠테이션

<4D F736F F F696E74202D204347C3E2BCAEBCF6BEF D325FC4C4C7BBC5CDB1D7B7A1C7C8BDBA20B1E2BABBBFE4BCD22E >

OCW_C언어 기초

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

C++ Programming

Frama-C/JESSIS 사용법 소개

API 매뉴얼

Microsoft PowerPoint - IP11.pptx

PowerPoint Presentation

歯Lecture2.PDF

Microsoft PowerPoint - chap10-함수의활용.pptx

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

BMP 파일 처리

Microsoft PowerPoint - Chapter 6.ppt

윤성우의 열혈 TCP/IP 소켓 프로그래밍

Microsoft PowerPoint - chap06-1Array.ppt

Microsoft PowerPoint - 제11장 포인터

중간고사

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

chap 5: Trees

Microsoft PowerPoint - [2009] 02.pptx

Microsoft PowerPoint - chap11-포인터의활용.pptx

쉽게 풀어쓴 C 프로그래밍

Chapter 4. LISTS

8장.ppt

Microsoft PowerPoint - chap06-5 [호환 모드]

제4장 기본 의미구조 (Basic Semantics)

금오공대 컴퓨터공학전공 강의자료

03_queue

; struct point p[10] = {{1, 2, {5, -3, {-3, 5, {-6, -2, {2, 2, {-3, -3, {-9, 2, {7, 8, {-6, 4, {8, -5; for (i = 0; i < 10; i++){ if (p[i].x > 0 && p[i

Chap 6: Graphs

Microsoft PowerPoint - 제11장 포인터(강의)

adfasdfasfdasfasfadf

Microsoft PowerPoint - chap03-변수와데이터형.pptx

untitled

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

PowerPoint 프레젠테이션

Microsoft Word - PLC제어응용-2차시.doc

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

Microsoft PowerPoint - 8ÀÏ°_Æ÷ÀÎÅÍ.ppt

윈도우시스템프로그래밍

PowerPoint Presentation

컴파일러

K&R2 Reference Manual 번역본

슬라이드 1

Microsoft PowerPoint - additional06.ppt [호환 모드]

멀티미디어시스템특강5

Microsoft PowerPoint - es-arduino-lecture-03

PowerPoint 프레젠테이션

Lab 3. 실습문제 (Single linked list)_해답.hwp

슬라이드 1

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

슬라이드 1

03장.스택.key

다음제시문을읽고물음에답하시오. 가 < 표 1> 은남아메리카국가연합에소속된 12개국의면적과인구의통계자료이다. 여기에나타나는 24개의숫자자료중첫번째자리의숫자가 1로시작하는항목은모두 8개이고, 2로시작하는항목은총 5개로첫번째자리의숫자가 8이나 9로시작하는항목보다훨씬자주나타나

Microsoft PowerPoint - 07-Data Manipulation.pptx

Microsoft PowerPoint - 11주차_Android_GoogleMap.ppt [호환 모드]

Transcription:

제 6 장영상워핑과모핑

학습목표 다음기하학적처리의개념을설명할수있고프로그램을작성할수있다 영상워핑 영상모핑 2014-11-11 영상처리 2

영상워핑 (Warpng) 픽셀의위치를이동하는기하학적처리 회전, 이동, 확대 / 축소등의기하학적처리와의차이점 픽셀별로이동정도가다름 고무종이위에그려진영상을임의로구부리는효과를낼수있음 2014-11-11 영상처리 3

영상워핑 (Warpng) 사용예 인공위성이나우주선에서보내온일그러진영상을복원하는데처음사용 TV 나영화에서물체, 동물, 배우의모습을변형하는데사용 미아의성장모습을생성 2014-11-11 영상처리 4

영상워핑 2014-11-11 영상처리 5

영상워핑 입력영상과출력영상의대응관계기술 제어선, 제어점, 그물망, 다각형등다양한방법이있음 < 제어선 > < 제어점 > 2014-11-11 영상처리 6

제어선을이용한워핑 출력영상의픽셀 V 에대응되는입력영상의픽셀 V 을찾아서픽셀값복사 수직교차점이제어선내부에존재 Q V C C 위치 변위 P 입력영상 출력영상 2014-11-11 영상처리 7

제어선을이용한워핑 수직교차점이제어선외부에존재 C 입력영상 C 출력영상 2014-11-11 영상처리 8

제어선을이용한워핑 제어선이여러개인경우 제어선은영상내의모든화소들에영향을미침 각제어선에대한가중치고려 가중치 = 제어선의길이 p (a+ 픽셀과제어선의거리 ) b p : 선의길이에대한가중치 (0 p 1) a : 0 으로나누는것을방지 b : 거리의증가에대한가중치의감소율 (0.5 b 2.0) 2014-11-11 영상처리 9

제어선을이용한영상워핑알고리즘 warpng() { 출력영상의각픽셀 V(,) 에대하여 { t = 0 // 방향변위의합을나타내는변수를초기화한다 t = 0 // 방향변위의합을나타내는변수를초기화한다 totalweght = 0 // 가중치의합을나타내는변수를초기화한다각제어선 L 에대하여 { V 와 L 의수직교차점의위치 u 를계산한다. V 와 L 의수직변위 h 를계산한다 u 와 h 를이용하여입력영상에서의대응위치 V (, ) 을구한다. V 와 L 사이의거리를 d 를계산한다. weght = (( 제어선의길이 p )/(a+d)) b t = t + ( -) * weght t = t + ( -) * weght totalweght = totalweght + weght } X = + t / totalweght Y = + t / totalweght 입력영상의 V (X,Y) 픽셀의값을출력영상의 V(,) 픽셀에복사한다. } } 2014-11-11 영상처리 10

제어선을이용한워핑 수직교차점의위치계산 Q( +1, +1 ) C( c, c ) L P(, ) u V(, ) 2014-11-11 영상처리 11

제어선을이용한워핑 수직교차점의위치계산 u 는수직교차점의위치에따라다음과같은범위의값을가짐 u < 0 : P 바깥에위치 0 <= u <= 1 : 제어선내부에위치 u > 1 : Q 외부에위치 u 값의계산 u ( )( 1 ) ( )( 1 2 2 ( 1 ) ( 1 ) ) 2014-11-11 영상처리 12

제어선을이용한워핑 제어선으로부터의변위계산 픽셀을지나면서제어선과수직으로교차하는점과픽셀사이의변위 변위 (h) 의값 변위 < 0 : 픽셀이제어선아래쪽에있음 변위 = 0 : 픽셀이제어선에있음 변위 > 0 : 픽셀이제어선위쪽에있음 Q Q V h h P P V (a) h > 0 인경우 (b) h < 0 인경우 2014-11-11 영상처리 13

2014-11-11 영상처리 14 제어선을이용한워핑제어선으로부터의변위계산 2 1 2 1 1 1 ) ( ) ( ) )( ( ) )( ( h

2014-11-11 영상처리 15 제어선을이용한워핑입력영상에서대응픽셀위치계산 ), ( ') ', ( ' 1 ' 1 과 2 ' 1 2 ' 1 ' 1 ' 1 2 ' 1 2 ' 1 ' 1 ' 1 ') ( ') ( ') ( ') ( ' ' ') ( ') ( ') ( ') ( ' ' h u h u : 제어선 L 의양끝점좌표

제어선을이용한워핑 픽셀과제어선의거리계산 (a) 수직교차점이제어선내부에있는경우 (b) 수직교차점이제어선외부에있는경우 2014-11-11 영상처리 16

2014-11-11 영상처리 17 제어선을이용한워핑픽셀과제어선사이의거리계산 1 0 1 0 ) ( ) ( ) ( ) ( 2 1 2 1 2 2 u u u h d

2014-11-11 영상처리 18 제어선을이용한워핑제어선의가중치계산 2 0.75 2 1 2 1 ) (0.001 ) ( ) ( ) ( d d a weght b p 제어선길이

제어선을이용한워핑 입력영상대응픽셀의변위누적 t t t t ( ' ) weght ( ' ) weght totalwegh t totalwegh t weght 2014-11-11 영상처리 19

제어선을이용한워핑 입력영상의대응픽셀위치계산 t X totalwegh t Y t totalwegh t 2014-11-11 영상처리 20

모핑 (Morphng) 두개의서로다른입력영상에대하여한영상을다른영상으로변환 2014-11-11 영상처리 21

모핑의단계 모핑은워핑과합병의두단계로구성 2014-11-11 영상처리 22

두영상사이의대응관계기술 모핑을위해서는두영상사이의대응위치를기술해야함 2014-11-11 영상처리 23

워핑 중간프레임에대한제어선생성 두입력영상의제어선으로부터보간법을사용하여생성 2014-11-11 영상처리 24

2014-11-11 영상처리 25 워핑 K 번째중간프레임에대한제어선계산식 ) ( ) ( ) ( ) ( / 2 4 2 2 4 2 1 3 1 1 3 1 u u u u N k u q q p p N : 전체프레임수입력영상 1 입력영상 2 ( 1, 1 ) ( 2, 2 ) ( 3, 3 ) ( 4, 4 ) ( p, p ) ( q, q ) K 번째중간프레임

2014-11-11 영상처리 26 합병영상합병 ), ( ), ( ) (1 ), ( / 2 1 I u I u O N k u I 1 (,) : 입력영상 1 로부터복사되는픽셀값 I 2 (,) : 입력영상 2 로부터복사되는픽셀값

실습

워핑 기하학적처리메뉴에워핑연산부메뉴추가 이름 : 워핑 ID : ID_GEOMETRY_WARPING

워핑 CImageProVew 클래스에 OnGeometrWarpng() 함수를추가하고편집한다. vod CImageProVew::OnGeometrWarpng() { CImageProDoc* pdoc = GetDocument(); ASSERT_VALID(pDoc); } f (pdoc->nputimg == NULL) return; pdoc->geometrwarpng(); vewmode = TWO_IMAGES; Invaldate(FALSE);

워핑 CImageProDoc 클래스에 GeometrWarpng() 함수를추가 반환형식 : vod 함수이름 : GeometrWarpng

워핑 tpedef struct { nt P; nt P; nt Q; nt Q; } control_lne; #nclude <math.h> vod CImageProDoc::GeometrWarpng() { control_lne source_lnes[23] = {{116,7,207,5},{34,109,90,21},{55,249,30,128},{118,320,65,261}, {123,321,171,321},{179,319,240,264},{247,251,282,135},{281,114,228,8}, {78,106,123,109},{187,115,235,114},{72,142,99,128},{74,150,122,154}, {108,127,123,146},{182,152,213,132},{183,159,229,157},{219,131,240,154}, {80,246,117,212},{127,222,146,223},{154,227,174,221},{228,252,183,213}, {114,255,186,257},{109,258,143,277},{152,278,190,262}};

워핑 control_lne dest_lnes[23] = {{120,8,200,6},{12,93,96,16},{74,271,16,110},{126,336,96,290}, {142,337,181,335},{192,335,232,280},{244,259,288,108},{285,92,212,13}, {96,135,136,118},{194,119,223,125},{105,145,124,134},{110,146,138,151}, {131,133,139,146},{188,146,198,134},{189,153,218,146},{204,133,221,140}, {91,268,122,202},{149,206,159,209},{170,209,181,204},{235,265,208,199}, {121,280,205,284},{112,286,160,301},{166,301,214,287}}; double u; // 수직교차점의위치 double h; // 제어선으로부터픽셀의수직변위 double d; // 제어선과픽셀사이의거리 double t, t; // 결과영상픽셀에대응되는입력영상픽셀사이의변위의합 double p, p; // 각제어선에대해계산된입력영상의대응되는픽셀위치 double weght; // 각제어선의가중치 double totalweght; // 가중치의합 double a=0.001; double b=2.0; double p=0.75;

워핑 nt 1, 2, 1, 2; nt src_1, src_1, src_2, src_2; double src_lne_length, dest_lne_length; nt num_lnes = 23; nt lne; nt, ; nt source_, source_; nt last_row, last_col; // 제어선의수 last_row = mageheght-1; last_col = magewdth-1;

워핑 // 출력영상의각픽셀에대하여 for(=0; <mageheght; ++) { for(=0; <magewdth; ++) { totalweght = 0.0; t = 0.0; t = 0.0; // 각제어선에대하여 for (lne = 0; lne < num_lnes; lne++) { 1 = dest_lnes[lne].p; 1 = dest_lnes[lne].p; 2 = dest_lnes[lne].q; 2 = dest_lnes[lne].q; dest_lne_length = sqrt((double) (2-1)*(2-1)+(2-1)*(2-1));

워핑 // 수직교차점의위치및픽셀의수직변위계산 u = (double) ((-1)*(2-1)+(-1)*(2-1)) / (double) ((2-1)*(2-1)+(2-1)*(2-1)); h = (double) ((-1)*(2-1)-(-1)*(2-1)) / dest_lne_length; // 제어선과픽셀사이의거리계산 f (u < 0 ) d = sqrt((double) (-1) * (-1) + (-1) * (-1)); else f (u > 1) d = sqrt((double) (-2) * (-2) + (-2) * (-2)); else d = fabs(h); src_1 = source_lnes[lne].p; src_1 = source_lnes[lne].p; src_2 = source_lnes[lne].q; src_2 = source_lnes[lne].q; src_lne_length=sqrt((double) (src_2-src_1)*(src_2-src_1)+ (src_2-src_1)*(src_2-src_1));

워핑 } // 입력영상에서의대응픽셀위치계산 p = src_1+u*(src_2 - src_1) - h * (src_2 - src_1) / src_lne_length; p = src_1+u*(src_2 - src_1) + h * (src_2 - src_1) / src_lne_length; // 제어선에대한가중치계산 weght = pow((pow((double)(dest_lne_length),p) / (a + d)), b); // 대응픽셀과의변위계산 t += (p - ) * weght; t += (p - ) * weght; totalweght += weght;

워핑 source_ = + (nt) (t / totalweght + 0.5); source_ = + (nt) (t / totalweght + 0.5); // 영상의경계를벗어나는지검사 f (source_ < 0) source_ = 0; f (source_ > last_col) source_ = last_col; f (source_ < 0) source_ = 0; f (source_ > last_row) source_ = last_row; } } } resultimg[][] = nputimg[source_][source_];

워핑 Warp.pgm 파일을열어서워핑을적용

모핑 기하학적처리메뉴에모핑부메뉴추가 Capton : 모핑 ID : ID_GEOMETRY_MORPHING

모핑 CImageProVew 클래스에 OnGeometrMorphng() 함수추가 vod CImageProVew::OnGeometrMorphng() { CImageProDoc* pdoc = GetDocument(); ASSERT_VALID(pDoc); } pdoc->geometrmorphng(); vewmode = MORPHING; Invaldate(FALSE);

모핑 CImageProVew.cpp 파일의위부분에 MORPHING 상수에대한정의를추가 -- 추가하기전 #defne TWO_IMAGES 1 #defne THREE_IMAGES 2 #defne TWO_IMAGES_SCALED 4 -- 추가한다음 #defne TWO_IMAGES 1 #defne THREE_IMAGES 2 #defne TWO_IMAGES_SCALED 4 #defne MORPHING 8

모핑 CImageProDoc 클래스의정의에모핑과정에서생성되는중간프레임을저장하기위한변수 morphedimg 를선언 // Attrbutes publc: unsgned char **nputimg; // 입력영상의기억장소에대한포인터변수 unsgned char **nputimg2; // 입력영상의기억장소에대한포인터변수 unsgned char **resultimg; // 출력영상의기억장소에대한포인터변수 nt magewdth; // 영상의가로크기 nt mageheght; // 영상의세로크기 nt depth; // 1 = 흑백영상, 3 = 컬러영상 nt gimagewdth; // 크기가변한결과영상의가로크기 nt gimageheght; // 크기가변한결과영상의세로크기 unsgned char **gresultimg; // 크기가변한결과영상에대한포인터변수 // 모핑결과저장을위해새로이추가되는코드 unsgned char **morphedimg[10];

모핑 CImageProDoc 클래스에 GeometrMorphng() 함수를추가 반환형식 : vod 함수이름 : GeometrMorphng

모핑 #defne NUM_FRAMES 10 vod CImageProDoc::GeometrMorphng() { control_lne source_lnes[23] = {{116,7,207,5},{34,109,90,21},{55,249,30,128},{118,320,65,261}, {123,321,171,321},{179,319,240,264},{247,251,282,135},{281,114,228,8}, {78,106,123,109},{187,115,235,114},{72,142,99,128},{74,150,122,154}, {108,127,123,146},{182,152,213,132},{183,159,229,157},{219,131,240,154}, {80,246,117,212},{127,222,146,223},{154,227,174,221},{228,252,183,213}, {114,255,186,257},{109,258,143,277},{152,278,190,262}}; control_lne dest_lnes[23] = {{120,8,200,6},{12,93,96,16},{74,271,16,110},{126,336,96,290}, {142,337,181,335},{192,335,232,280},{244,259,288,108},{285,92,212,13}, {96,135,136,118},{194,119,223,125},{105,145,124,134},{110,146,138,151}, {131,133,139,146},{188,146,198,134},{189,153,218,146},{204,133,221,140}, {91,268,122,202},{149,206,159,209},{170,209,181,204},{235,265,208,199}, {121,280,205,284},{112,286,160,301},{166,301,214,287}};

모핑 double u; // 수직교차점의위치 double h; // 제어선으로부터픽셀의수직변위 double d; // 제어선과픽셀사이의거리 double t, t; // 결과영상픽셀에대응되는입력영상픽셀사이의변위의합 double p, p; // 각제어선에대해계산된입력영상의대응되는픽셀위치 double weght; // 각제어선의가중치 double totalweght; // 가중치의합 double a=0.001, b=2.0, p=0.75; unsgned char **warpedimg; unsgned char **warpedimg2; nt frame; double fweght; control_lne warp_lnes[23]; double t2, t2, p2, p2; nt dest_1, dest_1, dest_2, dest_2, source_2, source_2; nt 1, 2, 1, 2, src_1, src_1, src_2, src_2; double src_lne_length, dest_lne_length; nt, j; nt num_lnes = 23; // 제어선의수 nt lne,,, source_, source_, last_row, last_col;

모핑 // 두입력영상을읽어들임 LoadTwoImages(); // 중간프레임의워핑결과를저장을위한기억장소할당 warpedimg = (unsgned char **) malloc(mageheght * szeof(unsgned char *)); for ( = 0; < mageheght; ++) { warpedimg[] = (unsgned char *) malloc(magewdth * depth); } warpedimg2 = (unsgned char **) malloc(mageheght * szeof(unsgned char *)); for ( = 0; < mageheght; ++) { warpedimg2[] = (unsgned char *) malloc(magewdth * depth); }

모핑 for ( = 0; < NUM_FRAMES; ++) { morphedimg[]=(unsgned char **) malloc(mageheght*szeof(unsgned char *)); for (j = 0; j < mageheght; j++) { morphedimg[][j] = (unsgned char *) malloc(magewdth * depth); } } last_row = mageheght-1; last_col = magewdth-1;

모핑 // 각중간프레임에대하여 for(frame=1; frame <= NUM_FRAMES; frame++) { // 중간프레임에대한가중치계산 fweght = (double)(frame) / NUM_FRAMES; // 중간프레임에대한제어선계산 for(lne=0; lne<num_lnes; lne++) { warp_lnes[lne].p = (nt) (source_lnes[lne].p + (dest_lnes[lne].p - source_lnes[lne].p)*fweght); warp_lnes[lne].p =(nt) (source_lnes[lne].p + (dest_lnes[lne].p - source_lnes[lne].p)*fweght); warp_lnes[lne].q = (nt) (source_lnes[lne].q + (dest_lnes[lne].q - source_lnes[lne].q)*fweght); warp_lnes[lne].q = (nt) (source_lnes[lne].q + (dest_lnes[lne].q - source_lnes[lne].q)*fweght); }

모핑 // 출력영상의각픽셀에대하여 for(=0; <mageheght; ++) { for(=0; <magewdth; ++) { totalweght = 0.0; t = 0.0; t = 0.0; t2 = 0.0; t2 = 0.0; // 각제어선에대하여 for (lne = 0; lne < num_lnes; lne++) { 1 = warp_lnes[lne].p; 1 = warp_lnes[lne].p; 2 = warp_lnes[lne].q; 2 = warp_lnes[lne].q; dest_lne_length = sqrt((double) (2-1)*(2-1)+(2-1)*(2-1));

모핑 // 수직교차점의위치및픽셀의수직변위계산 u = (double) ((-1)*(2-1)+(-1)*(2-1))/ (double) ((2-1)*(2-1)+(2-1)*(2-1)); h = (double) ((-1)*(2-1)-(-1)*(2-1))/ dest_lne_length; // 제어선과픽셀사이의거리계산 f (u < 0 ) d = sqrt((double) (-1) * (-1) + (-1) * (-1)); else f (u > 1) d = sqrt((double) (-2) * (-2) + (-2) * (-2)); else d = fabs(h); src_1 = source_lnes[lne].p; src_1 = source_lnes[lne].p; src_2 = source_lnes[lne].q; src_2 = source_lnes[lne].q; src_lne_length = sqrt((double) (src_2-src_1)*(src_2-src_1) + (src_2-src_1)*(src_2-src_1));

모핑 dest_1 = dest_lnes[lne].p; dest_1 = dest_lnes[lne].p; dest_2 = dest_lnes[lne].q; dest_2 = dest_lnes[lne].q; dest_lne_length = sqrt((double) (dest_2-dest_1)*(dest_2-dest_1) + (dest_2-dest_1)*(dest_2-dest_1)); // 입력영상 1 에서의대응픽셀위치계산 p = src_1 + u * (src_2 - src_1) - h * (src_2 - src_1) / src_lne_length; p = src_1 + u * (src_2 - src_1) + h * (src_2 - src_1) / src_lne_length; // 입력영상 2 에서의대응픽셀위치계산 p2 = dest_1 + u * (dest_2 - dest_1) - h * (dest_2 - dest_1) / dest_lne_length; p2 = dest_1 + u * (dest_2 - dest_1) + h * (dest_2 - dest_1) / dest_lne_length;

모핑 // 제어선에대한가중치계산 weght = pow((pow((double)(dest_lne_length),p) / (a + d)), b); // 입력영상 1 의대응픽셀과의변위계산 t += (p - ) * weght; t += (p - ) * weght; // 입력영상 2 의대응픽셀과의변위계산 t2 += (p2 - ) * weght; t2 += (p2 - ) * weght; } totalweght += weght;

모핑 // 입력영상 1 의대응픽셀위치계산 source_ = + (nt) (t / totalweght + 0.5); source_ = + (nt) (t / totalweght + 0.5); // 입력영상 2 의대응픽셀위치계산 source_2 = + (nt) (t2 / totalweght + 0.5); source_2 = + (nt) (t2 / totalweght + 0.5); // 영상의경계를벗어나는지검사 f (source_ < 0) source_ = 0; f (source_ > last_col) source_ = last_col; f (source_ < 0) source_ = 0; f (source_ > last_row) source_ = last_row; f (source_2 < 0) source_2 = 0; f (source_2 > last_col) source_2 = last_col; f (source_2 < 0) source_2 = 0; f (source_2 > last_row) source_2 = last_row;

모핑 } } // 워핑결과저장 warpedimg[][] = nputimg[source_][source_]; warpedimg2[][] = nputimg2[source_2][source_2]; } // 모핑결과합병 for(=0; <mageheght; ++) for(=0; <magewdth; ++) { nt val = (nt) ((1.0 - fweght) * warpedimg[][] + fweght * warpedimg2[][]); f (val < 0) val = 0; f (val > 255) val = 255; morphedimg[frame-1][][] = val; } }

모핑 OnDraw() 함수를수정 vod CImageProVew::OnDraw(CDC* pdc) { CImageProDoc* pdoc = GetDocument(); ASSERT_VALID(pDoc); f (pdoc->nputimg == NULL) return; f (pdoc->depth == 1) { for(nt =0; < pdoc->mageheght; ++) // 입력영상출력 for(nt =0; < pdoc->magewdth; ++) pdc->setpel(,, RGB(pDoc->nputImg[][], pdoc->nputimg[][], pdoc->nputimg[][]));

모핑 f (vewmode == THREE_IMAGES) { for(nt =0; < pdoc->mageheght; ++) // 두번째입력영상출력 for(nt =0; < pdoc->magewdth; ++) pdc->setpel(+pdoc->magewdth+30,, RGB(pDoc->nputImg2[][], pdoc->nputimg2[][], pdoc->nputimg2[][])); for(nt =0; < pdoc->mageheght; ++) // 결과영상출력 for(nt =0; < pdoc->magewdth; ++) pdc->setpel(+pdoc->magewdth*2+60,, RGB(pDoc->resultImg[][], pdoc->resultimg[][], pdoc->resultimg[][])); }

모핑 else f (vewmode == TWO_IMAGES_SCALED) { for(nt =0; < pdoc->gimageheght; ++) // 크기가변한결과영상출력 for(nt =0; < pdoc->gimagewdth; ++) pdc->setpel(+pdoc->magewdth+30,, RGB(pDoc->gResultImg[][], pdoc->gresultimg[][], pdoc->gresultimg[][])); }

모핑 else f (vewmode == MORPHING) { for(nt =0; < pdoc->mageheght; ++) // 두번째입력영상출력 for(nt =0; < pdoc->magewdth; ++) pdc->setpel(+pdoc->magewdth+30,, RGB(pDoc->nputImg2[][], pdoc->nputimg2[][], pdoc->nputimg2[][])); for (nt = 0; < 10; ++) for(nt =0; < pdoc->mageheght; ++) // 모핑결과출력 for(nt =0; < pdoc->magewdth; ++) pdc->setpel(+pdoc->magewdth*2+60,, RGB(pDoc->morphedImg[][][], pdoc->morphedimg[][][], pdoc->morphedimg[][][])); }

모핑 else { for(nt =0; < pdoc->mageheght; ++) // 결과영상출력 for(nt =0; < pdoc->magewdth; ++) pdc->setpel(+pdoc->magewdth+30,, RGB(pDoc->resultImg[][], pdoc->resultimg[][], pdoc->resultimg[][])); } } else f (pdoc->depth == 3) { for(nt =0; < pdoc->mageheght; ++) // 입력영상출력 for(nt =0; < pdoc->magewdth; ++) pdc->setpel(,, RGB(pDoc->nputImg[][3*], pdoc->nputimg[][3*+1], pdoc->nputimg[][3*+2]));

모핑 f (vewmode == THREE_IMAGES) { for(nt =0; < pdoc->mageheght; ++) // 두번째입력영상출력 for(nt =0; < pdoc->magewdth; ++) pdc->setpel(+pdoc->magewdth+30,, RGB(pDoc->nputImg2[][3*], pdoc->nputimg2[][3*+1], pdoc->nputimg2[][3*+2])); for(nt =0; < pdoc->mageheght; ++) // 결과영상출력 for(nt =0; < pdoc->magewdth; ++) pdc->setpel(+pdoc->magewdth*2+60,, RGB(pDoc->resultImg[][3*], pdoc->resultimg[][3*+1], pdoc->resultimg[][3*+2])); }

모핑 } } else f (vewmode == TWO_IMAGES_SCALED) { for(nt =0; < pdoc->gimageheght; ++) // 크기가변한결과영상출력 for(nt =0; < pdoc->gimagewdth; ++) pdc->setpel(+pdoc->magewdth+30,, RGB(pDoc->gResultImg[][3*], pdoc->gresultimg[][3*+1], pdoc->gresultimg[][3*+2])); } else { for(nt =0; < pdoc->mageheght; ++) // 결과영상출력 for(nt =0; < pdoc->magewdth; ++) pdc->setpel(+pdoc->magewdth+30,, RGB(pDoc->resultImg[][3*], pdoc->resultimg[][3*+1], pdoc->resultimg[][3*+2])); }

모핑 프로그램을컴파일하고모핑실행 두입력영상선택 첫번째 : "morph_src.pgm, 두번째 : morph_dest.pgm"