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

BERT·2023년 4월 17일
0

Computer Vision

목록 보기
3/56
post-custom-banner

영상(image)?

픽셀이 2차원 행렬로 나열되어 있는 형태
픽셀 : 영상의 기본 단위, picture element, 화소

grayscale

색상 정보 없이 밝기 정보로만 구성된 영상
밝기 정보를 256단계(0~255)로 표현

C/C++

unsigned char로 표현
1Byte 사용
OpenCV

typedef unsigned char uchar;

truecolor

컬러 사진처럼 다양한 색상을 표현할 수 있는 영상
RGB 색 성분을 각각 256단계로 표현

C/C++

unsigned char 자료형 3개 배열 또는 구조체
3Bytes 사용

class RGB
{
	unsigned char R;
	unsigned char G;
	unsigned char B;
}

영상에서 사용되는 좌표계

가로와 세로가 반대인 것에 유의할 것
OpenCV : w×hw\times h 영상
matrix : M×NM\times N 행렬

정적 2차원 배열의 생성

VGA(640x480)
unsigned char : 1바이트 사용
2차원 배열 전체 크기만큼의 메모리 공간이 연속적으로 할당됨
Stack 영역에 메모리 할당 : 대략 1MB까지 할당 가능
FHD(1920x1080) 저장 불가

unsigned char a[480][640] {};

동적 2차원 배열의 생성

행 단위로만 연속적 메모리 공간이 보장
프로그램 동작 중 다양한 크기의 영상 생성 가능
Heap 영역에 메모리 할당 : x86의 경우 2GB, x64의 경우 8TB까지 할당 가능

int w = 640;
int h = 480;

unsigned char** p;
p = new unsigned char*[h];
for (int i = 0; i < h; i++){
	p[i] = new unsigned char[w] {};
}

동적 2차원 배열의 원소 접근

2차원 배열 p의 모든 원소 값 1씩 증가

for (int y = 0; y < h; y++){
	for (int x = 0; x < w; x++){
    	p[y][x] += 1;
    }
}

동적 2차원 배열의 메모리 해제

for (int y = 0; y < h; y++)
	delete[] p[i];
delete[] p;

대용량 1차원 메모리 할당

2차원 배열을 1차원 배열에 저장하여 사용

int w = 10, h = 10;
unsigned char* data = new unsigned char[w * h] {};
...
delete[] data;

특정 좌표 (x, y) 위치의 픽셀 값 참조

각 열의 시작 주소
data
data+1*w
data+2*w
data+3*w
data+4*w
data+5*w
data+6*w
data+7*w
data+8*w
data+9*w
unsigned char& p1 = *(data + y * w + x);
post-custom-banner

0개의 댓글