본문 바로가기
opencv

cv::Mat 이모저모

by 꼰대코더 2023. 11. 29.

본론으로 들어가지 전에 C++ 기초가 부족하시는 분들이 있을 것 같아서
왜 앞에 cv:: 를 붙이나요? 라고 하면 opencv 의 라이브러리(dll)를 생성할 때 namespace cv { 코드 } 형식으로 만들었기 때문에 명시적으로 cv:: 를 적어주는 것이다. 만약 자신의 코드화일의 선언부에 using namespce cv;  를 선언해 주면 cv:: 를 생략해 줘도 상관없다. 하지만 라이브러리 간에 똑같은 함수를 사용하는 경우가 있고 코드를 알기 쉽게 하기 위해서 개인적으로는 cv:: 를 붙여서 코딩하는 것을 선호한다.

 

 

  • 단순히 선언만 -> 이미지 공간은 할당되지 않고 클래스 변수만 스택에 저장
    cv::Mat image;
  • 이미지 공간 할당
넓이, 높이, 픽셀타입, (옵션)초기값 을 지정한 경우
 - (10 x 20) 그레이스케일, 검정(=0) 
 - (10 x 20) 칼러, 검정(=0)
cv::Mat image(10, 20, CV_8UC1, Scalar(0));
cv::Mat image(10, 20, CV_8UC3, Scalar(0, 0, 0));
혹은 cv::Mat image(10, 20, CV_8UC3, Scalar::all(0));
cv::Mat image = cv::Mat::create(10,20, Scalar(0));
추후 생성
cv::Mat image;
image.create(10, 20, CV_8UC1);
초기값 0 의 이미지공간을 생성 cv::Mat image = cv::Mat::zeros(10, 20, CV_8UC1);
cv::Mat image = cv::Mat::zeros(10, 20, CV_8UC3);
초기값을 미지정해서 이미지공간을 생성한 후, 초기화 cv::Mat image(10, 20, CV_8UC1);
image.setTo(Scalar::all(0));
혹은 image = Scalar::all(0);
이미지 화일을 읽어 들인 경우 cv::Mat image = cv::imread(화일패스);
이미지처리 함수의 파라미터로 전달할 경우
※ 이미지처리 함수내의 동작
    ① image2 가 빈공간 -> image2.create(...)로 생성
    ② image2 의 공간이 이미 할당
        -> 기존 공간의 참조 -1, image2.create(...) 새로 생성
cv::Mat image = cv::imread(화일패스);
cv::Mat image2;
cv::cvtColor(image, image2, COLOR_BGR2GRAY);
똑같은 사이즈, 타입의 공간을 생성 cv::Mat image2(image.size(), image.type());
이미지 공간을 카피해서 새로운 공간을 생성(deep copy) cv::Mat image2 = image.clone();
image.copyTo(image2);
스택의 변수는 생성하고 이미지공간은 공유(shallow copy)
-> image 의 이미지공간의 참조 + 1
 ※ image2 가 이미 이미지공간을 가지고 있었을 경우
     ① 기존 이미지공간의 참조카운트가 -1
     ②  카운트가 0 가 되었을 경우 자동으로 공간 릴리스
cv::Mat image2 = image;
혹은 cv::Mat image2(image);




참조)

클래스(Mat), 구조체에 (Rect, Point...) 에 있어서 Equal = 의 동작

    cv::Mat image = cv::imread(화일패스);

    cv::Rect rect = cv::Rect(0,0,100,100);

단순히 할당하는 의미가 아니라 클래스의 operator(=) 를 적용하는 의미 이다.
따라서,
     cv::Mat image = cv::Mat::create(10,20, Scalar(0));  

는 오른쪽 선언으로 변수명이 없는 새로운 Mat 의 인스턴스를 생성한 후,  왼쪽의 image 클래스 변수의 operator = 를 적용시켜 할당을 하는 방식이다.


따라서 위의 operator = 보다는 아래와 같이 초기화를 사용하는게 효율적일 수 있다. 
     cv::Mat image(10, 20, CV_8UC1, Scalar(0)); 

     cv::Rect rect (0,0,100,100);

'opencv' 카테고리의 다른 글

공백 메우기  (2) 2023.12.02
b/w 이미지의 칼럼(수직방향)별 검정(=0)픽셀수 카운트  (0) 2023.12.02
이미지 회전  (0) 2023.11.27
스캔문서의 기울기 알아보기 - 2  (0) 2023.11.27
스캔문서의 기울기 알아보기  (0) 2023.11.26