OpenCV/OpenCV 관련 잡다한 지식

OpenCV이 BGR 포맷을 쓰는 이유

KALILIVE 2020. 10. 2. 12:30
반응형

이미지를 불러오거나 우리가 도형을 그리기 위해 color에 입력하는 순서는

흔히 접하는 RGB 순서가 아니라 BGR 순서이다.

왜 그런지 가끔씩 호기심이 들 때가 있어 이번 포스팅에서는 그 이유에 대한

해답을 알아가 보자.

 


왜 BGR을 쓸까?

 

rgb = bgr[:,:,::-1]

우리가 OpenCV를 사용하다 보면 위 코드를 자주 사용하게 된다.

우리 일상에서는 RGB순으로 대부분 사용할 것이다.

하지만 OpenCV는 BGR을 기본 포맷으로 사용하기 때문에 위 코드를 이용해 RGB순서로 배열을 바꿔줘야 하는 번거로움이 있다.

 

https://www.learnopencv.com/why-does-opencv-use-bgr-color-format/ 

 

Why does OpenCV use BGR color format ?

One of the elements of good design is the principle of least astonishment ( a.k.a principle of least surprise). A good intuitive design makes the user not think. When you see a handle on a door, you want to pull it. When you see a door with a metal plate,

www.learnopencv.com

몇 년간 컴퓨터 비전에 종사해오신 분들의 블로그에서 그 해답을 얻을 수 있었다.

 

블로그의 글 중 핵심 내용을 캡처해왔다.

<OpenCV의 창시자인 그레이 브라드스키 박사(Dr. Gray Bradski)와의 인터뷰 중>

번역하자면 사타야 말릭 박사(블로그의 포스팅 주인)는 컨퍼런스에서 OpenCv의 창시자 Dr. Gray Bradski를 만나고

그에게 왜 BGR을 쓰냐고 물었다고 합니다. 대답은 "왜 미국 철도 표준이 4피트 8.5인치 인가?"라는 질문으로 

돌아왔다고 합니다.

이 뜻은 미국이 철도 표준을 정할 때 무슨 대단한 이유가 있어서 4피트 8.5인치로 정한 것이 아니라 열차 이전에 주로 사용했던 마차의 폭에 맞춰져서 정해졌다는 겁니다.

결국, 블라드 스키 박사도 BGR로 사용하는 데는 다른 이유가 있던 것이 아니라 OpenCV를 만들던 초창기 카메라 산업 개발자들이 BGR을 많이 썼기 때문에 그 자신도 그냥 아무 이유 없이 BGR을 선택하게 된 것입니다.

 


그럼 왜 카메라 산업은 RGB포맷을 사용했을까?

 

 

OpenCV는 인텔에서 시작하였는데요 저희가 영상처리를 하기 위해 옛날은 CPU를 이용했는데 이와 크게 연관이 있습니다.

CPU에 따라서 값을 메모리에 저장하고 읽을 때, 큰 값을 먼저 쓰는 빅 엔디안(MSB)과 작은 값을 먼저 쓰는 리틀 엔디언(LSB) 방식이 있는데, 인텔에서 만든 x86 계열의 CPU는 리틀 엔디언(LSB)을 따릅니다.

예를 들어 0x123456라는 값을 저장하면 빅 엔디언에서는 0x123456 순으로 저장되지만 리틀 엔디언으로 저장되면 0x563412 순으로 저장됩니다.

BGR포맷으로 이루어진 색상 정보는 각 채널당 8bit로 구성되고 3개의 채널을 사용하므로 24bit 즉

0xBBGGRR가 필요합니다. 24bit 단위의 입출력은 효과적이지 않으니 메모리에 저장할 때 unsinged 32 bit를 사용하는 것이 일반적입니다.

(우리는 0~255 값을 저장하는데 unsigned를 사용하면 부호가 제거되니 메모리 공간을 좀 더 효율적으로 사용할 수 있게 됩니다.)

0x00BBGGRR 가 됩니다. 이 값을 x86 계열의 CPU처럼 리틀 엔디언을 사용해서 저장하면 메모리는 0xRRGGBB00로 저장됩니다.

이렇게 저장된 값을 메모리에 직접 접근해서 읽어 들이는 디스플레이 장치, 카메라 디바이스 등의 영상 하드웨어는 CPU와 무관하게 지정된 엔디안으로 앞에서부터 읽어 들이면 자연스럽게 RGB로 읽히기 때문에 BGR 포맷이 초창기 영상 기기 관련 하드웨어 개발자들이 자연스럽게 널리 사용되었습니다.

 


2020-10-02

나중에 컴퓨터 하드웨어에 대한 기초를 설명하면서 여러 기술들을 설명해줘야겠군요...........ㅋㅋㅋ

저도 보안중 리버싱을 공부하면서 리틀 엔디언과 빅 엔디언에 대해 공부하긴 했는데 이렇게 다시 

접할 줄은 몰랐습니다. 역시 지식은 많으면 많을수록 관련 없는 분야라도 접목되어 다양하게

사용될 수 있으니 계속 공부해야겠다는 생각이 다시 한번 절실히 느껴지네요.....

이 글은 OpenCV강좌를 접하면서 한번 설명하기 위해 포스팅되었습니다.

반응형