C++ 영상 데이터 처리 RECAP

Lily·2023년 10월 16일
0

TIL

목록 보기
4/21

영상 데이터 구조와 표현방법

  • 트루 컬러 영상의 픽셀 C/C++ 표현
    • RGB 색 성분의 크기를 각각 0~255 범위의 정수로 표현 (char = 1Byte)
typedef unsigned char BYTE : windows
typedef unsigned char uint8_t : Linux
typedef unsigned char uchar : opencv

class RGB
{
	unsigned char R;
    unsigned char G;
    unsigned char B;
}
  • 보통의 경우 2차원 배열을 동적 할당하여 메모리를 사용하고, 사용 후 해제하며, 배열 정적 할당은 stack 영역 공간 확보에 한계가 있어 잘 안하는 편임
  • Heap 영역 메모리 할당: x86의 경우 2GB 할당 가능, x64의 경우 8TB
int w = 640;
int h = 480;

// stack 영역에 로컬 변수 형태로 할당
unsigned char** p;
// h개 변수 만큼의 포인터 생성, p가 위치 가리킴
p = new unsigned char*[h]; 
for (int i = 0; i < h; i++) {
	// w개 변수 만큼의 포인터 생성, p[i]가 위치 가리킴
	p[i] = new unsigned char[w] {};
}
  • 동적 2차원 배열의 원소에 접근

    • 2중 for loop를 통해 직접 접근하여 값 제어
  • 동적 2차원 배열 메모리 해제

    • 동적 2차원 배열 생성의 역순으로 해제
    • delete 구문에서 괄호 연산자([])를 반드시 사용
for (int y = 0; y < h; y++)
	delete[] p[i];
delete[] p;
  • 대용량 1차원 메모리 할당 후 영상 데이터 저장
int w = 10, h = 10;
unsigned char* data = new unsigned char[w * h]	{};

...

delete[] data;
  • 특정 좌표 (x, y) 위치의 픽셀 값 참조하기
// 값을 받아서 변경 가능하도록 참조자로 값 받음
unsigned char& p1 = *(data + y*w + x);

기본적인 영상 데이터 저장 클래스

class MyImage
{
	public:
    	// 기본 생성자
    	MyImage(): w(0), h(0), data(0)	{}
        // w, h를 받아올 경우 생성자
        MyImage(int _w, int _h): w(_w), h(_h) {
        	data = new unsigned char[w * h]	{};
        }
        // 소멸자
        ~MyImage() {
        	if (data) delete[] data;
        }
        
        unsigned char& at(int x, int y) {
        	return *(data + y * w + x);
        }
        
    public:
    	int w, h;
        unsigned char* data;
}

BMP, JPG, GIF, PNG 특징

  • BMP

    • 픽셀 데이터를 압축하지 않고 그대로 저장 (파일 용량이 큰 편)
    • 파일 구조가 단순해서 별도의 라이브러리 도움 없이 파일 입출력 프로그래밍 가능
  • JPG

    • 주로 사진과 같은 컬러 영상을 저장
    • 손실 압축
    • 압축률이 좋아서 파일 용량이 크게 감소 -> 디지털 카메라 사진 포맷으로 사용
  • GIF

    • 영상처리 시 잘 사용하지 않음
    • 256 색상 이하의 영상을 저장
    • 무손실 압축
    • 움직이는 GIF 지원
  • PNG (TIF 도 유사)

    • Portable Network Graphics
    • 무손실 압축(컬러 영상도 무손실 압축)
    • 알파 채널(투명도)을 지원: 객체만 불투명하게 반영, 배경은 투명

BMP 파일 형식과 특징

  • 비트맵

    • 비트들의 집합
    • 영상 전체 크기에 해당하는 픽셀 정보를 그대로 저장
    • 표현이 직관적이고 분석이 용이
    • 압축을 사용하지 않아 메모리 용량을 많이 차지
    • 영상의 확대, 축소 시 화질 손상이 심함
      • 벡터 그래픽스(vector graphics) 로 보완
      • 폰트, 일러스트레이터에서 벡터 그래픽스 사용
  • 비트맵의 종류

    • 장치 의존 비트맵(DDB): 화면, 프린터 등의 설정에 따라 다르게 표현됨
    • 장치 독립 비트맵(DIB): 출력 장치가 달라지더라도 항상 동일하게 출력됨 (보편적 windows image file)
  • 비트맵 종류 (출처: 비트맵 구조(비트맵 분석 #4))

영상 데이터 크기 분석

  • FHD : 1920 x 1080
  • HD : 1280 x 720
  • VGA : 640 x 480
  • Ex) FHD 동영상을 BMP 형식으로 1분 재생하려면? 메모리 할당량은 다음과 같음:

    1920 x 1080 x 3 = 약 2000 x 1000 x 3 = 6 MB
    1초 당 30 fps라 가정 한다면, 6 MB x 30 = 180 MB
    1분의 경우: 180 MB x 60 = 10800 MB = 약 10 GB

  • 압축의 경우 픽셀 값이 크게 안바뀌면(low frequency) 더 많이 압축되고, 고주파 성분(high frequency)이 더 강하면 덜 압축되는 경향을 보임

profile
First Attempt In Learning

0개의 댓글

관련 채용 정보