해당 포스트는 "OpenCV로 배우는 영상 처리 및 응용", "C++ API OpenCV 프로그래밍" 책의 내용을 요약한 것이다.
※ 단위 행렬 및 대칭 행렬
void setIdentity(InputOutputArray mtx, const Scalar& s=Scalar(1))
: mtx의 대각 요소값을 스칼라 s로 초기화한다.
void completeSymm(InputOutputArray mtx, bool lowerToUpper=false)
: mtx 행렬을 대칭행렬로 만든다. false이면 대각선 위쪽 부분을 다각선 아래쪽 부분으로 복사한다. true이면 대각선 아래쪽 부분을 대각선 위쪽 부분으로 복사한다. 대각선 요소는 복사하지 않는다. mtx 행렬은 행과 열의 크기가 같은 정방행렬이다.
※ 행렬의 놈
double norm(InputArray src1, int normType=NORM_L2, InputArray mask=noArray())
: src1의 절대 놈을 normType에 따라 계산한다.
double norm(InputArray src1, InputArray src2, int normType=NORM_L2, InputArray mask = noArray())
: src1과 src2의 상대 놈을 normType에 따라 계산한다.
void normalize(InputArray src, OutputArray dst, double alpha=1, double beta=0, int norm_type=NORM_L2, int dtype=-1, InputArraymask=noArray())
: src의 놈 또는 값의 범위를 정규화한다. 밑에 사진에서 normType이 위 조건과 맞는다면 noreType에 따라 생성된 src의 놈이 alpha 값과 같도록 만들어 준다. normType이 사진에서 밑의 조건에 해당한다면 행렬을 정규화하는 데 alpha 값에서 beta값의 범위로 정규화하여 dst에 저장한다.
※ 행렬의 곱셈 및 변환
void gemm(InputArray src1, InputArray src2, double alpha, InputArray src3, double gamma, OutputArray dst, int flags=0)
: dst = alpha*op(src1)*op(src2) + gamma*op(src3) 이다. 만약 flags 가 GEMM_1_T 라면 op(src1)은 src1의 전치행렬이 된다. flags가 GEMM_2_T 라면 op(src2)가 src2의 전치행렬이고 GEMM_3_T라면 op(src3)가 src3의 전치행렬이다.
void transform(InputArray src, OutputArray dst, InputArray m)
: src의 모든 원소에 행렬 변환을 수행한다. 회전 변환과 같은 변환을 할 때 사용된다. 수식은 다음과 같다.
dst(i) = m*src(i), if m.cols = src.channels() || m.cols = src.channels()+1
void perspectiveTransform(InputArray src, OutputArray dst, InputArray m)
: src에 투영 변환 행렬 m을 적용하여 dst에 저장한다.
※ 행렬의 트레이스, 전치행렬, 행렬식
- Scalar trace(InputArray mtx)
: mtx의 대각 요소의 합계인 행렬의 트레이스를 반환한다.
- void transpose(InputArray src, OutputArray dst)
: src의 전치행렬을 dst에 저장한다.
- double determinant(InputArray mtx)
: mtx의 행렬식을 반환한다. 행렬식을 계산해야 해서 mtx는 행과 열의 크기가 같은 정방행렬이어야 한다.
※ 역행렬과 연립 방정식 해 구하기
double invert(InputArray src, OutputArray dst, int flags=DECOMP_LU)
: dst에 src의 역행렬을 저장한다. flags 값에 따라 역행렬을 계산하는 방식이 달라진다.
bool solve(InputArray src1, InputArray src2, OutputArray dst, int flags=DECOMP_LU)
: src1은 연립방정식의 왼쪽 행렬이고 src2는 오른쪽 행렬이다. dst는 연립 방정식 해를 저장하는 행렬이다. 행렬을 통해 연립 방정식 해를 구하려면 역행렬을 계산해야 하는 데 계산 방식은 flags에 따라 달라진다.
'OpenCV 프로그래밍' 카테고리의 다른 글
| OpenCV 히스토그램 생성, 평활화, 역투영 (0) | 2017.06.24 |
|---|---|
| OpenCV 반전/임계값, 선형, 로그, 거듭제곱 변환 영상 (0) | 2017.06.24 |
| LUT, 행렬(Mat)의 절대값, 비교, 수치, 통계 함수 (0) | 2017.06.23 |
| cvarrToMat, flip, repeat, merge, split, mixChannels (0) | 2017.06.23 |
| OpenCV 키보드/마우스/트랙바 처리, 영상 파일 읽기/쓰기 (0) | 2017.06.23 |
LUT, 행렬(Mat)의 절대값, 비교, 수치, 통계 함수
해당 포스트는 "OpenCV로 배우는 영상 처리 및 응용", "C++ API OpenCV 프로그래밍" 책의 내용을 요약한 것이다.
※ LUT 함수
void LUT(InputArray src, InputArray lut, OutputArray dst, int interpolation=0)
: "dst(i) = lut(src(i) + d)"로 룩업 테이블 lut를 이용하여 입력 src를 출력 dst로 계산한다. src는 8비트 입력행렬이고 lut는 256개의 원소를 갖는 참조표이다.
※ 행렬의 절댓값
※ 행렬의 비교 및 범위 연산
void compare(InputArray src1, InputArray src2, OutputArray dst, int cmpop)
: src1과 src2 행렬 사이의 비교연산을 수행해 dst에 저장한다. cmpop로는 CMP_EQ, CMP_GT, CMP_GE 등이 있다. 만약 cmpop에 해당 하는 비교연산에 충족할 경우 255가 행렬요소에 저장되고 충족 못 할 경우 0이 저장된다.
bool checkRange(InputArray src, bool quiet=true, Point* pos=0, double minVal = -DBL_MAX, double maxMal=DBL_MAX)
: 입력 행렬의 모든 요소가 NaN 또는 무한대 값을 갖는 지를 확인하고 minVal<= src(i) < maxVal 범위의 값인지를 확인한다. 범위 밖의 요소값이 하나라도 있으면 함수는 예외를 발생하거나, quiet = true이면 false를 반환한다. pos에는 첫 번째로 범위를 벗어난 행렬 요소의 포인터를 지정한다.
void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst)
: 입력 행렬 요소가 lowerb(i) <= src(i) <= upperb(i) 범위에 있으면 dst(i) = 255, 그렇지 않으면 dst(i)=0이다. dst는 src와 같은 크기의 CV_8U 자료형이다.
※ 수치 관련 함수
- void magnitude(InpuArray x, InputArray y, OutputArray mag)
- void phase(InputArray x, InputArray y, OutputArray angle, bool angleInDegrees = false)
: angle(i) = atan2(y(i),x(i))이다. 만약 angleInDegrees가 true이면 atan2(y(i),x(i)) * 180 / PI 를 하여 angle(i)에 각도를 저장한다.
- void cartToPolar(InputArray x, InputArray y , OutputArray magnitude, OutputArray angle, bool angleInDegrees =false)
: 좌표를 극좌표로 변환하여 크기는 magnitude에 위상각은 라디안으로 계산해서 angle에 저장한다. angleInDegrees가 true 일 경우 각도를 저장한다.
- void polarToCart(InputArray magnitude, InputArray angle, OutputArray x, OutputArray y, bool angleInDegrees = false)
: 극좌표의 크기와 위상각 행렬 magitude와 angle을 직교좌표로 변환하여 x, y 행렬에 저장한다.
- int solveCubic(InputArray coeffs, OutputArray roots)
: 3차 방정식의 실근을 계산한다. roots는 1 또는 3개의 요소를 갖는 실근의 출력행렬이다. coeffs는 3차 방정식의 계수 행렬로 3 또는 4개의 요소를 갖고 3일 경우 x^3의 계수가 1이다. coeffs의 0번 째 인덱스는 x^3의 계수이고 4번 째 인덱스가 상수항이다.
- double solvePoly(InputArray coeffs, OutputArray roots, int maxIters)
: 다항식의 실근, 복소수 근을 구한다. solveCubic 함수와 거의 같으며 다른 점은 coeffs 행렬이 방정식의 계수인데 slovePoly의 경우 0번 째 인덱스가 상수항이고 마지막 인덱스가 제일 큰 제곱항의 계수이다.
※ 통계 함수
- int countNonZero(InputArray src)
: 행렬 src에서 0이 아닌 요소의 개수를 반환한다.
- Scalar mean(InputArray src, InputArray mask = noArray())
: src의 평균을 계산해서 반환한다. 만약 mask 행렬이 지정되었으면 mask(i)가 0이 아닌 i 요소들의 평균을 계산하는 데 나누는 값은 countNonZero(mask) 이다. mask 행렬 요소가 모두 0이면 0을 반환한다.
- void meanStdDev(InputArray src, OutputArray mean, OutputArray stddev, InputArray mask=noArray())
: src의 평균과 표준편차를 채널별로 mean과 stddev에 계산한다.
- void minMaxIdx(InputArray src, double* minVal, double* maxVal, int* minIdx=0, int* maxIdx=0, InputArray mask = noArray())
: 행렬 src에서 최소값 minVal과 최대값 maxVal을 계산하고 각각의 위치를 minIdx와 maxIdx 배열에 저장한다.
- void minMaxLoc(InputArray src, double* minVal, double* maxVal, Point* minIdx=0, Point* maxIdx=0, InputArray mask = noArray())
: 행렬 src에서 최소값 minVal과 최대값 maxVal을 계산하고 각각의 위치를 minIdx와 maxIdx Point에 저장한다.- reduce(InputArray src, OutputArray dst, int dim, int rtype, int dtype=-1)
: dim=0 이면 수직(열) 방향으로 rtype 연산을 수행하여 결과를 dst에 저장한다. dim=1이면 수평(행) 방향으로 rtype 연산을 수행한다. rtype은 연산의 종류를 나타내고 REDUCE_SUM, REDUCE_AVG 등이 있다.
- void sort(InputArray src, OutputArray dst, int flags)
: src의 행 또는 열을 오름차순 또는 내림차순으로 정렬한 후 dst에 저장한다.
- void sortIdx(InputArray src, OutputArray dst, int flags)
: src의 행 또는 열을 오름차순 또는 내림차순으로 정렬한다. 하지만 sort와 달리 정렬한 행렬 요소를 dst에 저장하는 게 아니라 행렬 요소의 인덱스를 dst에 저장한다.
- void randShuffle(InputOutputArray dst, double iterFactor=1, RNG* rng=0)
: 행렬의 요소를 난수에 의해 무작위로 섞는다. iterFactor는 무작위로 섞는 연산의 회수를 결정한다. rng는 난수 발생 함수로 rng=0이면 theRNG 함수이다.
'OpenCV 프로그래밍' 카테고리의 다른 글
| OpenCV 반전/임계값, 선형, 로그, 거듭제곱 변환 영상 (0) | 2017.06.24 |
|---|---|
| OpenCV 선형대수 함수 (0) | 2017.06.23 |
| cvarrToMat, flip, repeat, merge, split, mixChannels (0) | 2017.06.23 |
| OpenCV 키보드/마우스/트랙바 처리, 영상 파일 읽기/쓰기 (0) | 2017.06.23 |
| OpenCV 윈도우 관련 함수 (0) | 2017.06.23 |