IT_Programming/OpenCV

[펌][OpenCV] 매개변수에서 cv::Mat& image의 의미(C++의 Reference)

JJun ™ 2013. 12. 30. 03:15



 * 출처

 : https://blog.naver.com/pckbj123/100202537582



MatExpr abs(Const Mat& m)


위 선언은 Opencv 공식홈페이지(http://Opencv.org)에 나와있는 abs함수의 선언이다.

그동안 매개변수 'Const Mat& m'의 의미를 알지못하고 그냥 사용하였다.

 

최근 C++을 다시 공부해야할 필요성을 느껴서 다시 공부를 하다가 'Const Mat& m'의 의미에 대해 알게되었다. 

C언어만 공부한 독자들은 '&'를 주소값을 반환하는 연산자로 알고 있으며, 이 연산자는 변수명 앞에 붙어있는 것을 많이 봐았을 것이다. 

그러나 매개변수에서 볼 수 있는 '&'의 위치가 이상하다. 이는 OpenCV에서만 볼 수 있는 것이 아니라, C++의 표준 문법인 'Reference'이다.


 

- Reference란?

  먼저 C++에서 레퍼런스(Reference)에 대해 알아보자.

  Reference는 쉽게 말하자면 '변수'에 별명을 붙이는 것이다. 코드로 나타내면 다음과 같다.

 

int val=10;        //int형 변수 val을 선언하고 10으로 초기화

int& ref=val;     //변수 val에 대해 reference를 선언

 

  위 코드에서 알 수 있듯이, 데이터 타입(int, float, char, bool...) 뒤에 '&'가 붙으면 Reference 선언을 나타낸다.
   Reference는 단순히 변수에 이름만 하나 더 부여하는 것이므로 변수와 생성 방법을 제외하고는 전혀 차이가 없다. 

  이를 그림으로 나타내면 아래와 같다.

 



 

  int형 변수를 처음 할당할 때는 먼저 int형 변수 저장을 위해, 4Byte의 메모리 공간을 할당한다.
  그리고 그 메모리 공간에 val이라는 이름을 붙인다. 그러나 reference는 새로운 메모리 공간을 할당하지 않고, 이름만 하나 더 부여한다.


 

- Reference의 장점


  Reference가 나타나게 된 배경은 C언어의 포인터에 있다. C언어의 함수에서는 함수 외부의 변수에 접근하기 위해 포인터를 사용하였다.
  포인터는 연산이 가능하기 때문에 메모리 주소 참조에 있어 오류가 발생할 수 있다는 단점이 있다. 
  그러나 Reference는 주소값을 저장하고 있는 것이 아니라 동일한 메모리 공간에 대해 하나의 이름만을 더 부여하는 것이므로,
  포인터 연산이 불가능하다. 따라서 메모리 주소 참조에 있어 오류가 발생할 여지를 방지한다. 
  뿐만 아니라 매개변수 상에서 Reference를 선언할 경우,
 함수 외부의 변수도 Reference를 이용하여 함수 내부에서 접근이 가능하다.


  또 한가지는 속도, 메모리 공간에 있어 효율적이다.
  C언어의 Call-By-Value를 사용할 경우, 객체나 구조체의 경우 함수 호출 시점에 메모리 복사가 일어나기 때문에 추가적인 메모리 공간이 필요하며,
  또 메모리 할당 및 복사로 인해 시간이 소요된다. 그러나 Reference는 이미 할당된 메모리 공간에 이름만 부여하는 것이므로
  Call-By-Value와 같은 오버헤드가 줄어들게 된다.

 


- Reference의 단점


  Reference 이용시 한가지 단점은 Call-By-Value로 함수를 호출한 것인지, 그렇지 않으면 Call-By-Reference의 형태로 호출한 것인지 알 수 없다.
  예를 들어 swap(val1, val2)는 아래 두가지 형태의 함수 모두 호출이 가능하기 때문이다.


void swap(int a, int b);

void swap(int& a, int& b);

 



- Opencv에서 Reference


  Opencv 함수 선언부를 보면 매개변수에 'Const Mat& m'과 같은 선언을 많이 볼 수 있다.
  이는 함수 호출 시 cv::Mat 객체를 복사하지 않고, Reference를 통해 Call-By-Reference 방식으로 호출하는 것이다. 

 

  cv::Mat 객체의 경우 보통 영상을 담고 있기 때문에 할당된 메모리가 크고 따라서 복사하는데 비교적  오버헤드가 크다. 

  그렇기 때문에 함수에서 호출 시 Call-By-Value가 아니라, Reference를 사용하여 Call-By-Reference방식을 이용함으로써 

  cv::Mat 객체를 복사할 의 오버헤드를 없앨 수 있다.

 

  또한 Reference를 사용함으로써, 함수 내부에서, 함수 호출부(예를 들면 main)에서 선언된 cv::Mat 객체에 쉽게 접근할 수 있게 된다.

 

 


※ 참조 : 열혈강의 C++ 프로그래밍(저자:윤성우, 출판사:프리렉) 



'IT_Programming > OpenCV' 카테고리의 다른 글

[펌] OpenCV DLL 파일들 v1.0  (0) 2007.11.23