※ 추상화

: 사물들의 공통된 특징, 즉 추상적(보편적) 특징을 파악해 해당 특성으로 각각의 사물을 하나의 집합으로 파악하는 것

 

ex) 갤럭시 s8, g6, v20이 있다고 하면 이들은 스마트폰이라는 개념을 사용해 추상화할 수 있다. 만약 스마트폰 종류마다 배터리 충전 방식이 다르다고 하면 밑에 있는 소스코드와 같을 수 있다.

switch(스마트폰 종류) case 갤럭시 s8: //배터리 충전 방식 기술 case g6: //배터리 충전 방식 기술 end

 

 

여기서 새로운 종류의 스마트폰 v20을 추가하라고 하면 아래의 소스코드와 같이 case 문을 더 추가해야 한다.

switch (스마트폰 종류) case 갤럭시 s8: //배터리 충전 방식 기술 case g6: //배터리 충전 방식 기술 case v20: //배터리 충전 방식 기술 end

하지만 추상화 개념인 스마트폰을 이요할 경우 코드는 다음과 같을 것이다.

 

void chargeBattery(SmartPhone sp){
    sp.chargeBattery();
}

 

위와 같이 다형성의 원리를 이용해 코드를 작성하면 구체적인 스마트폰의 종류에 대한 부분을 찾을 수 없다. 따라서 특정 스마트폰이 추가되어도 코드의 수정이 필요없다.

 

 

=> 각 사물의 구체적인 개념에 의존하지 말고 추상적 개념에 의존해야 설계를 유연하게 변경 가능하다.

해당 포스트는 "OpenCV로 배우는 영상 처리 및 응용", "C++ API OpenCV 프로그래밍" 책의 내용을 요약한 것이다.



- int cvSampleLine(const CvArr* image, CvPoint pt1, CvPoint pt2, void* buffer, int connectivity=8)

: 영상 image에서 pt1에서 pt2까지의 직선 위의 화소들의 값을 buffer에 읽어온다. connectivity = 8이면 length = max(abs(pt2.x-pt1.x)+1, abs(pt2.y-pt1.y)+1)의 직선 위의 좌표의 화소값을 읽어온다. 메모리 buffer의 크기는 length*image->nChannels 바이트이다.


- void getRectSubPix(InputArray image, Size patchSize, Point2f center, OutputArray patch, int patchType=-1)

: 영상 image에서 center를 중심점으로 하는 patchSize 크기의 화소값을 읽어 patch 행렬에 저장한다. patchType은 patch의 깊이를 나타내며, 디폴트로 patchType=-1이면 image와 같은 깊이를 갖는다.


- void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation = INTER_LINEAR)

: 입력영상 src를 interpolation에 제시된 방법을 사용하여 dsize 크기로 보간해 출력영상 dst에 저장한다. dst의 자료형은 src와 같고, dst 영상의 크기는 dsize이다. 만약 dsize가 0이면 dsize = Size(cvRound(fx*src.cols) , cvRound(fy*src.rows))로 계싼한다. fx는 수평축의 스케일로 fx=0이면 fx=(double)dsize.width/src.cols로 계산한다. fy는 수직축의 스케일로 fy=0이면 fy=(double)dsize.height/src.rows로 계산한다. interpolation은 보간 방법으로 INTER_NEAREST이면 최근접 이웃보간, INTER_LIEAR이면 양방향 선형보간, INTER_AREA이면 화소 영역 관계를 사용한 재샘플링, INTER_CUBIC이면 4*4 이웃을 이용한 양방향 3차 보간, INTER_LANCZOS4이면 8*8 이웃을 이용한 Lanczos 보간법으로 보간한다.


- Mat getRotationMatrix2D(Point2f center, double angle, double scale)

: 2D 회전 및 확대를 위한 어파인 변환 행렬을 계산한다. center을 중심으로 angle 각도 회전하고, scale 확대 축솧는 2*3 변환 행렬을 반환한다. 


- Mat getAffineTransform(InputArray src, InputArray dst) / Mat getAffineTransform(const Point2f src[], const Point dst[]) 

: 동일 직선 위에 있지 않는 삼각형을 이루는 3점의 좌표 배열 src에서 배열 dst로의 2*3 어파인 변환 행렬을 반환한다. 


- void invertAffineTransform(InputArray M, Output m)

:2*3 어파인 변환 행렬 M의 2*3 역변환 행렬 iM을 계산한다.


- void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode = BORDER_CONSTANT, const Scalar& borderValue = Scalar())

: src에서 어파인 변환 행렬 M을 적용하여 출력영상 dst에 저장한다. dsize는 dst의 크기이다. flags는 보간 방법으로 WAPP_INVERSE_MAP이 지정되면 변환 행렬 M이 dst에서 src로의 역어파인 변환 행렬을 의미한다. 

flags=INTER_LINEAR;
warpAffine(srcImage, dstImage, rotMat, Size(), flags);
invertAffineTransform(rotMat, iM);
flags=INTER_LINEAR + WARP_INVERSE_MAP;
warpAffine(srcImage, dstImage, iM, Size(), flags);

위 두 코드에서 dstImage는 서로 같다.


+ Recent posts