1.2 Mat, Pixel type

Eden.Yang·2023년 10월 11일
0

Computer VIsion

목록 보기
3/22

Matrics를 선언하는 방법들

•Mat (int rows, int cols, int type)
•Mat (Size size, int type)
•Mat (const Mat & m)
•Mat (Size size, int type, const Scalar& s)


Pixel type

•CV_8U: 8-bit unsigned integer: uchar( 0~255 )
•CV_8S: 8-bit signed integer: schar( -128~127 )
•CV_16U: 16-bit unsigned integer: ushort( 0~65535 )
•CV_16S: 16-bit signed integer: short ( -32768~32767 )
•CV_32S: 32-bit signed integer: int ( -2147483648~2147483647 )
•CV_32F: 32-bit floating-point number: float ( -FLT_MAX~FLT_MAX, INF, NAN )
•CV_64F: 64-bit floating-point number: double (-DBL_MAX~ DBL_MAX, INF, NAN )
•Multi-channel array: CV_8UC3, CV_8U(3), CV_64FC4, CV_64FC(4)


예시

Mat mtx(3, 3, CV_32F);
// make a 3x3 floating-point matrix

Mat mtx(10, 1, CV_64FC2);
// make a 10x1 2-channel floating-point matrix(10-element complex vector)

Mat img(1080, 1920, CV_8UC3);
// make a 3-channel (color) image of 1920 columns and 1080 rows.

Mat img(Size(1920, 1080), CV_8UC3);
// make a 3-channel (color) image of 1920 columns and 1080 rows

=======================================

  • 아래는 open CV에 실제 들어가는 main 함수
int main(){
	int w = 150, h = 100;
    Mat image(h, w, CV_8UC1, Scalar(255));
    cout<< "Size: " << image.size().height << "," << image.size().width << endl;
    imshow("image", image);
    
    waitKey(0);
    return 0;
}

• For a multi-channel image use Scalar function as
• Scalar(255, 0, 0)
• Color order in OpenCV is Blue, Green, and Red ➔BGR


Mat copy

Shallow copy

• Mat data structure consists of header and data
• In case of shallow copy, the address for data is copied
• Use '=' for shallow copy

Deep copy

• Use clone() for deep copy
• Mat creation and copyTo() are performed inside clone()

copyTo()

copyTo 함수는 OpenCV 라이브러리에서 제공되는 함수로, 한 매트릭스의 내용을 다른 매트릭스에 복사할 때 사용됩니다. 여기서 몇 가지 중요한 매개변수와 개념을 설명하겠습니다:

void copyTo(OutputArray m, InputArray mask): 이 함수는 두 개의 인자를 받습니다.

  • m: 복사 대상이 되는 매트릭스입니다. 만약 이 매트릭스가 적절한 크기나 타입이 아니라면, 연산 전에 적절하게 다시 할당됩니다.

  • mask: 연산 마스크로, *this와 동일한 크기를 가지며, 비어있지 않은 요소들은 복사되어야 하는 매트릭스 요소를 나타냅니다. 이 마스크는 CV_8U 타입이어야 하며, 1 또는 다중 채널일 수 있습니다.

#include <opencv2/opencv.hpp>
using namespace cv;

int main() {
    Mat source = Mat::eye(3, 3, CV_32FC1); // 3x3 크기의 단위 행렬 생성
    Mat destination;

    // 마스크 설정 (1이 있는 위치는 복사 대상)
    Mat mask = (Mat_<uchar>(3, 3) << 1, 0, 1, 0, 1, 0, 1, 0, 1);

    // copyTo를 사용하여 source 매트릭스의 일부를 destination에 복사
    source.copyTo(destination, mask);

    // 결과 출력
    std::cout << "Source Matrix:\n" << source << "\n\n";
    std::cout << "Mask:\n" << mask << "\n\n";
    std::cout << "Destination Matrix:\n" << destination << "\n";

    return 0;
}

위 예시에서는 3x3 크기의 단위 행렬을 생성하고, 이 행렬의 일부를 mask를 사용하여 다른 매트릭스에 복사합니다. copyTo 함수는 source 매트릭스의 일부를 destination에 복사하는 역할을 합니다. 결과적으로 destination에는 mask에서 1로 표시된 부분이 복사됩니다.

참고로, 이 예시에서는 CV_32FC1 타입을 사용하여 32비트 부동 소수점 단일 채널을 가진 매트릭스를 생성하였습니다. 타입과 채널 수는 실제 문제에 따라서 적절히 선택해야 합니다.

Shallow와 Deep copy 비교

int main() {
	Mat m1 = (Mat_ < double >(3, 3) <<1,2,3,4,5,6,7,8,9);
    Mat m_shallow= m1;Mat m_deep= m1.clone();
    
    cout << "m1 =\n" << m1 << endl << endl;
    cout<< "m_shallow=\n" << m_shallow<< endl<< endl;
    cout << "m_deep =\n" << m_deep << endl << endl;
    
    // Update m1 m1.at < double >(0, 0) = 100;
    cout << "m1 =\n" << m1 << endl << endl;
    cout<< "m_shallow=\n" << m_shallow<< endl<< endl;
    cout << "m_deep =\n" << m_deep << endl << endl;
    
    waitKey(0);
}

Mat copy 또 다른 예시


int main() {
	Mat image = imread("lena.png", 0);
    Mat copied_img= image.clone();
}
int main() {
    // 이미지 파일 "lena.png"를 읽어온다.
    Mat image = imread("lena.png");

    // 이미지와 동일한 크기 및 타입을 가진 모두 0으로 초기화된 매트릭스를 생성한다.
    Mat mask = Mat::zeros(image.size(), image.type());

    // 복사할 부분을 지정하는 직사각형의 좌표와 크기를 설정한다.
    Rect rect = Rect(10, 10, 100, 100); // 좌상단 위치 (10, 10), 너비 100, 높이 100인 직사각형

    // 직사각형 영역을 파란색(255, 0, 0)으로 채운다. -1은 도형을 채우라는 의미.
    rectangle(mask, rect, Scalar(255, 0, 0), -1, 8, 0);

    // mask를 이용하여 이미지의 일부를 복사한다.
    Mat copied;
    image.copyTo(copied, mask);

    // "original" 창에 원본 이미지를 표시한다.
    imshow("original", image);

    // "copied" 창에 복사된 이미지를 표시한다.
    imshow("copied", copied);

    // 사용자가 아무 키나 누를 때까지 대기한다.
    waitKey(0);

    return 0;
}

Mat Conversion 부터 해야 함

profile
손끝에서 땅끝으로, 골방에서 열방으로

0개의 댓글