제 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"