Home OpenCV 행렬 계산
Post
Cancel

OpenCV 행렬 계산

해당 포스팅은 OpenCV 4로 배우는 컴퓨터 비전과 머신러닝 (황선규 저)를 보고 공부하며 개인적인 용도를 위해 정리한 글이다.

행렬 연산

  • 행렬과 스칼라간의 합, 곱
  • 행렬과 행렬간의 합, 곱 (수학적인 곱, 같은 위치의 원소간의 곱)
  • 역행렬
  • 전치행렬 등

역행렬

  • 정방형의 행렬 $A$에 대해 $A$의 역행렬 $A^{-1}$과의 곱 $AA^{-1}$은 단위 행렬 $E$가 나옴
  • cv::Mat.inv()로 역행렬 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include "opencv2/opencv.hpp"

#include <iostream>

int main(void)
{
    float data[] = {1, 2, 3, 4};

    cv::Mat mat1(2, 2, CV_8UC1, data);  // 행렬 선언 및 초기화
    cv::Mat mat2 = mat1.inv();  // mat1 에 대한 역행렬 생성
    
    std::cout << "mat1:\n" << mat1 << std::endl;
    std::cout << "mat2:\n" << mat2 << std::endl;
    std::cout << "mat1 * mat2:\n" << mat1 * mat2 << std::endl;

    return 0;
}

/*
mat1:
[1, 2;
 3, 4]

mat2:
[-2, 1;
 1.5, -0.5]

mat1 * mat2:
[1, 0;
 0, 1]
*/

전치행렬

  • 행렬의 행과 열의 순서를 바꿈
  • cv::Mat.t()의 형태로 선언
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "opencv2/opencv.hpp"

#include <iostream>

int main(void)
{
    float data[] = {2, 3, 4, 5};

    cv::Mat mat1(2, 2, CV_8UC1, data);
    cv::Mat mat2 = mat1.t();  // 전치 행렬 생성

    std::cout << "mat1:\n" << mat1 << std::endl;
    std::cout << "mat2:\n" << mat2 << std::endl;

    return 0;
}

/*
mat1:
[2, 3;
 4, 5]

mat2:
[2, 4;
 3, 5]
*/

행렬의 곱

  • $A * B$와 cv::Mat.mul(cv::Mat)이 존재
  • $A * B$는 수학적인 행렬의 곱이고 mul함수는 같은 위치의 원소끼리의 곱셈이다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include "opencv2/opencv.hpp"

#include <iostream>

int main(void)
{
    float data1[] = {1, 2, 3, 4};
    float data2[] = {2, 3, 4, 5};

    cv::Mat mat1(2, 2, CV_8UC1, data1);
    cv::Mat mat2(2, 2, CV_8UC1, data2);

    std::cout << "mat1 * mat2:\n" << mat1 * mat2 << std::endl;
    std::cout << "mat1.mul(mat2):\n" << mat1.mul(mat2) << std::endl;

    return 0;
}

/*
mat1 * mat2:
[10, 13;
 22, 29]

mat1.mul(mat2):
[2, 6,
 12, 20]
*/

This post is licensed under CC BY 4.0 by the author.

OpenCV 행렬 변환

OpenCV Vec Scalar