반응형

 

참고

http://goo.gl/Q0It8

  


디지털화된 이미지는 픽셀이라는 부르는 점들이 모여서 형상을 만든다. 아래 이미지처럼 격자상에 있는 이미지 픽셀의 값은 0~255사이의 값으로 가지도록 해서 파일로 저장된다. 그레이 스케일 영상의 경우 0이면 검은색 점이며 255는 흰색 점이고 그 사이 값들은 해당 값을 강도로 가지는 회색 점들이다. 이런 점들이 모여 디지털 이미지를 화면에 표현하게 된다.

 

이미지 출처: http://goo.gl/Q0It8

 

C++로 넘어오면서 자동으로 해주기 때문에 메모리 관리를 따로 해줄 필요가 없다니 다행이지만 튜토리얼에 따르면 임베디드에서는 아직 C만 지원한다는 게 문제라고 한다. 예전에 Mat가 아닌 IplImage를 사용했을 때 할당했다가 수동으로 메모리를 해제해주어야 했었다. 그 과정에서 버그도 많이 생기고…

 

이제 Mat을 사용하게 되면 더 이상 수동으로 메모리를 할당하고 다시 해제하는 일이 없어도 된다. 클래스 생성자에서 할당을 해주고 클래스 소멸자에서 해제를 해주게 되어 있다.

 

Mat클래스는 두 개의 데이터를 저장하고 있는데 하나는 매트릭스(matrix) 헤더로 매트릭스의 크기, 저장하는 방법, 매트릭스가 저장되어 있는 주소 정보등을 포함하고 있다. 다른 하나는 실제 이미지의 픽셀값들이 저장되는 데이터 매트릭스에 대한 포인터이다. 매트릭스의 차원은 저장하는 방법에 따라 달라진다. 예를 들어 그레이스케일 이미지는 1개의 채널을 가지므로 1차원일 테고 RGB 이미지는 3개의 채널을 가지고 있으므로 3차원이 되어야 할 것이다. 매트릭스의 헤더는 일정한 크기를 가지지만 메트릭스의 크기는 이미지에 따라 달라진다.

 

영상처리 속도를 개선하기 위해서 OpenCV에서는 참조 카운팅(reference counting) 시스템을 사용한다. 각각의 Mat 오브젝트들은 자신만의 매트릭스 헤더를 가지고 있지만 매트릭스는 공유하여 같은 데이터 매트릭스를 다수의 Mat 오브젝트에서 같이 사용하는 것이다. 이렇게 되면 Mat 오브젝트간에 매트릭스를 복사 시 일일이 픽셀별로 값을 가져다 복사할 필요 없이 매트릭스 헤더를 복사하고 매트릭스 포인터만 가리키게 하면 되므로 이미지 데이터 복사 속도가 개선된다. 더 이상 데이터 매드릭스를 사용하는 Mat 객체가 없을 경우 메모리에서 해제된다.

    

 

같은 데이터 매트리스를 참조

아래 코드에서 세 개의 Mat 객체들은 결국 같은 데이터 매트릭스를 포함하기 때문에 화면에 출력해보면 똑같은 이미지를 볼 수 있게 된다.

 

아래 코드처럼 세 개의 Mat가 하나의 데이터 매트릭스를 공유하고 있기 때문에 하나의 이미지를 이진화 하게 되면 다른 이미지들도 이진화가 되버린다.

 

Mat 객체의 데이터 매트릭스 중 일부만 다른 Mat 객체로 가리키게 할 수도 있다. 다시 말하면 원본이미지의 일부만 다른 Mat 객체에서 가리키게 할 수 있다는 것이다.

Rect를 이용하여 사각형 영역을 가져 올 수 도 있고, Range를 이용하여 특정 열과 행들만 범위를 정해서 가져올 수 도 있다.

 

마찬가지로 같은 데이터 매트릭스를 공유하기 때문에 하나의 영향이 다른 것에 영향을 주게 된다.

 

부분 이미지를 이진화한 결과도 다른 이미지에 영향을 준다.

 

 

새로운 복사본 생성

clone과 CopyTo를 사용하면 실제 데이터 매트리스를 복사하기 때문에 하나의 이미지를 이진화 한다고 해서 다른 이미지에 영향을 주지 않는다.

반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
개선 사항을 댓글로 남겨주면 가능한 빨리 반영하도록 하겠습니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 ~~

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요 ^^

  1. 드레이크 2019.04.18 17:22

    CV_LOAD__IMAGE_GRAYSCALE 하고 CV_THRESH_BINARY에서 명령어가 없다는데 어떻게 해결해야하나요?

    #include <opencv2/opencv.hpp>
    #include <iostream>는 있는데 다른거 넣어야하나요?
    아니면 옛날 명령어여서 안되는건가요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.04.18 17:29 신고

      opencv 4.0이상이라서 발샐하는 에러입니다.

      각각 IMREAD_GRAYSCALE, THRESH_BINARY로 변경하세요

+ Recent posts