해당 포스트는 "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