•Mat (int rows, int cols, int type)
•Mat (Size size, int type)
•Mat (const Mat & m)
•Mat (Size size, int type, const Scalar& s)
•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
=======================================
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 data structure consists of header and data
• In case of shallow copy, the address for data is copied
• Use '=' for shallow copy

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

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비트 부동 소수점 단일 채널을 가진 매트릭스를 생성하였습니다. 타입과 채널 수는 실제 문제에 따라서 적절히 선택해야 합니다.
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);
}

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;
}
