아고~~빨리 다시 c랑 c++좀 봐야겠다~~너무 안봤더니 기억이 잘 안나네;;;
이건 오픈시브이 카페에서 퍼왔다!!! 참고해야지~
IplImage 구조체 멤버명
● nChannels : 영상의 픽셀 당 채널 수를 나타내며 1~4 값이며 흑배영상의 채널의 수는 1이고 RGB 컬러영상의 채널의 수는 3이고 RGB 컬러순서는 다음과 같다.
b0 |
g0 |
r0 |
b1 |
g1 |
r1 |
b2 |
g2 |
r2 |
b3 |
g3 |
r3 |
… |
… |
… |
● origin : 영상의 원점을 나타낸다. 0은 top-left origin, 1은 bottom-left origin을 의미한다. 다음은 Opencv에서 origin이 나타내는 상수이다.
origin |
설명 |
IPL_ORIGIN_TL (0) |
TL은 Top Left의 약자이며 왼쪽 상단을 나타낸다. |
IPL_ORIGIN_BL (1) |
BL은 Bottom Left의 약자이며 왼쪽 하단을 나타낸다. |
● depth : 영상데이터를 저장하기위해 사용되는 비트의 수를 나타낸다. depth는 컴퓨터 언어에서 자료형(data type)과 같이 예를 들어, C언어에서 정수형에 int형과 long형이 있고 실수형에 float과 double이 있듯이 데이터를 몇 비트를 가지고 표현할 것인가를 나타낸다.
다음은 OpenCV에서 depth를 나타나는 상ㄹ수이다.
depth |
설명 |
IPL_DEPTH_8U |
8비트 unsigned integer (0~255) |
IPL_DEPTH_8S |
8비트 signed integer (-128~127) |
IPL_DEPTH_16U |
16비트 unsigned integer |
IPL_DEPTH_16S |
16비트 signed integer |
IPL_DEPTH_32S |
32비트 signed integer |
IPL_DEPTH_32F |
32비트 floating-point number |
IPL_DEPTH_64F |
64비트 floating-point number |
만약 흑백영상에서 depth가 IPL_DEPTH_8U이면 색상 데이터를 0~255사이의 정수로 나타내고 IPL_DEPTH_32F이면 32비트 실수로 표현하겠다는 뜻이다. 마찬가지로 RGB 컬러영상에서 depth가 IPL_DEPTH_8U이면 각 채널 당 색상 데이터를 0~255사이의 정수로 나타내고 IPL_DEPTH_32F이면 각 채널 당 32비트 실수로 표현하겠다는 뜻이다.
● width : 영상의 가로크기를 나타내며 단위는 픽셀이다.
● height : 영상의 세로크기를 나타내며 단위는 픽셀이다.
● widthStep : 영상에서 가로 크기를 나타내며 단위는 바이트이다. widthStep = width * nChannels이다. 8비트 1채널 영상에서 영상의 가로크기가 100픽셀이면 widthStep = 100 * 1인 100 바이트이고 8비트 3채널 영상에서 영상의 가로크기가 100픽셀이면 widthStep = 100 * 3인 300바이트가 된다.
● imageSize : 영상의 크기를 나타내며 단위는 바이트이다. imageSize = width * height * nChannels이다. 가로 256픽셀, 세로 256픽셀인 흑백영상에서 imageSize는 65,536 바이트 (256픽셀 * 256픽셀 * 1채널 = 65,536바이트)이고 가로 256픽셀, 세로 256픽셀인 컬러영상에서 imageSize는 196,608바이트 (256픽셀 * 256픽셀 *3채널 = 196,608바이트)가 된다.
● imageData : 256 * 256 흑백영상에서 첫 픽셀의 데이터는 imageData[0], 두 번째 픽셀의 데이터는 imageData[1], 마지막 픽셀의 데이터는 imageData[65535]에 들어 있다. 다음은 흑백영상에서 6개 픽셀에 저장된 픽셀값들을 보여주고 있다.
imageData[0] |
imageData[1] |
imageData[2] |
imageData[3] |
imageData[4] |
imageData[5] |
100 |
120 |
150 |
130 |
140 |
160 |
컬러영상에서 픽셀에 저장되는 채널의 순서는 BGR 순서에 따라 영상 데이터가 저장된다. 다음은 컬러영상에서 2개의 픽셀에 저장된 픽셀값들을 보여주고 있다.
imageData[0] |
imageData[1] |
imageData[2] |
imageData[3] |
imageData[4 |
imageData[5] |
100 |
120 |
150 |
130 |
140 |
160 |
여기서는 (B, G, R)이 (100, 120, 150) 혹은 (130, 140, 160)에 의해 각각 다른 두 가지 컬러 색을 나타낸다.
영상 읽기
● cvLoadImage 함수
영상을 메모리 상에 로드하는데 사용되는 함수이다.
IplImage* cvLoadImage( char * filename, int iscolor ); |
● filename
로드되는 파일의 이름을 가리킨다.
● iscolor
로드되는 영상의 색상을 가리킨다.
iscolor > 0이면 3채널 컬러 영상으로 변환하여 로드한다.
iscolor = 0이면 흑백 영상으로 변환하여 로드한다.
iscolor < 0이면 원래의 영상 그대로 로드한다. 즉, 원래 영상이 3채널 컬러영상은 컬러영상으로 흑백영상은 그대로 흑백영상으로 로드한다. 예를 들어, 다음은 Lena 컬러영상을 컬러영상 그대로 메모리 상에 로드한다.
IplImage* image;
image = cvLoadImage("../images/Lena.jpg", -1);
만약에 컬러영상을 흑백영상으로 변환하여 로드하고자 하는 경우는 다음과 같다.
IplImage* image;
image = cvLoadImage("../images/Lena.jpg", 0);
Opencv에서 지원되는 파일의 종류
파일 |
설명 |
BMP, DIB |
Windows 비트맵 |
JPEG, JPG, JPE |
JPEG 파일 |
PNG |
Portable Network Graphics |
PBM, PGM, PPM |
Portable 영상 포맷 |
SR, RAS |
Sun rasters |
TIFF, TIF |
TIFF 파일 |
영상 출력
● cvNamedWindow 함수
영상을 출력하기 위한 윈도우를 만들기 위해 사용되는 함수이다.
int cvNamedWindow(char* name, int flags; |
● name
윈도우의 이름을 나타낸다.
● flags
윈도우의 크기조절을 나타내기 위한 플래그이다. 플래그가 CV_WINDOW_AUTOSIZE이면 윈도우의 크기는 자동으로 출력할 영상의 크기에 맞춘다. CV_WINDOPW_AUTOSIZE 대신 1을 사용할 수 있다. 이 경우 출력된 윈도우의 크기를 사용자가 마우스를 가지고 크기 조절을 할 수 없다. 플래그가 0인 경우 사용자가 마우스로 크기 조절을 할 수 있다.
● cvShowImage 함수
cvNamedWindow() 함수에 의해 지정된 윈도우에 영상을 출력하기 위해 사용하는 함수이다.
void cvShowImage(char* name, CvArr* image); |
● name
윈도우의 이름이며 cvNamedWindow() 함수ㅠ에 의해 지정된 이름과 동일하다.
● Image
출력할 영상을 나타내며 cvLoadImage() 함수에 의해 로드된 영상을 지정한다.
● cvWaitKey 함수
키보드로부터 키 입력을 기다리기 위한 함수이다.
int cvWaitKey(int delay); |
● delay
지정된 시간(단위 : milliseconds) 동안 기다린다.
cvWaitKey() 함수는 영상을 화면에 출력할 때 출력되는 시간을 지정하기 위해 사용한다. delay ≤ 0인 경우 예를 들어, cvWaitKey(0)이면 영상이 출력된 상태에서 무한히 키보드 입력을 기다리다 키를 입력하면 입력된 키의 코드를 반환한다. cvWaitKey(1000)임녀 1초 동안 기다리고 cvWaitKey(10000)이면 10초동안 기다린다. 만약 지정된 시간동안 키보드로부터 사용자가 키를 입력하지 않으면 -1을 반환한다.
● cvReleaseImage 함수
cvLoadImage() 함수를 이용하여 메모리에 로드된 영상이 메모리로부터 해제하기 위해 사용하는 함수이다.
void cvReleaseImage( IplImage** image); |
● image
image는 IplImage 구조체의 이중 포인터이다. 따라서 포인터 변수 image가 수록되어 있는 주소를 가리키므로 &image로서 나타낸다. 다음은 Lena 영상을 메모리에 로드하고 로드된 영상을 메모리에서 해제하는 예이다.
IplImage* image;
image = cvLoadImage("../images/Lena.jpg", -1);
cvReleaseImage(&image);
● cvCreateImage 함수
영상을 만들기 위해 사용하는 함수이다.
IplImage* cvCreateImage( cvSize size, int depth, int channels); |
● size
영상의 크기를 지정한다. 영상의 크기는 cvSize() 함수와 cvGetSize() 함수를 사용하여 지정한다. 영상의 가로와 세로 길이를 직접 지정하고자 하는 경우는 cvSize() 함수를 사용하여 cvSize(width, height)처럼 지정하고 특정한 영상의 크기와 똑같은 크기의 영상을 만들고자 하는 경우는 cvGetSize() 함수를 사용하여 cvGetSize(src_image)처럼 지정한다.
● depth
영상 데이터의 깊이(단위:비트)를 지정한다. 1채널 영상인 경우는 픽셀의 깊이가 되고 3채널 영상인 경우 각 채널의 깊이가 된다.
depth |
설명 |
IPL_DEPTH_8U |
8비트 unsigned integer (0~255) |
IPL_DEPTH_8S |
8비트 signed integer (-128~127) |
IPL_DEPTH_16U |
16비트 unsigned integer |
IPL_DEPTH_16S |
16비트 signed integer |
IPL_DEPTH_32S |
32비트 signed integer |
IPL_DEPTH_32F |
32비트 floating-point number |
IPL_DEPTH_64F |
64비트 floating-point number |
● channels
픽셀 당 채널 수를 지정한다.
예를 들어, 영상의 크기 640 * 480인 흑백영상을 만들고자 하는 경우 흑백영상은 1채널이므로 다음과 같다.
IplImage* image = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1);
여기서 채널의 깊이는 8비트로 지정하고 있다. 즉, 0과 255사이 256개의 정수값으로 표현하겠다는 의미이다. 만약에 영상의 크기 640 * 480인 컬러영상을 만들고자 하는 경우 RGB 컬러영상은 3채널이므로 다음과 같다.
IplImage* image = cvCreateImage(cvSize(640,480), IPL_DEPTH_32F, 3);
여기서는 각 채널의 깊이는 32비트로 지정하고 있다. 비록 컬러영상이지만 각 채널의 깊이를 흑백영상처럼 8비트로 다음과 같이 지정할 수도 있다.
IplImage* image = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U,3);
● cvSplit 함수
다채널 영상을 단일 채널 영상으로 분리하고자 하는 경우 사용하는 함수이다.
void cvSplit( CvArr* src, CvArr* dst0, CvArr* dst1, CvArr* dst2, CvArr* dst3); |
● src
다채널 영상을 나타낸다.
● dst0, dst1, dst2, dst3
단일 채널 영상을 나타낸다.
영상 저장
● cvSaveImage 함수
영상을 파일에 저장하기 위한 함수이다.
int cvSaveImage( char* filename, CvArr* image); |
● filename
저장할 파일이름을 나타낸다.
● image
저장할 영상을 가리킨다.
다음은 cvSaveImage() 함수의 사용 예를 보여준다.
IplImage* image;
cvSaveImage("../images/Lena.jpg", image);
산술연산
단일 영상에서 산술연산
● cvAddS 함수
영상에 상수값을 더하기 위해 사용하는 함수이다.
void cvAddS( CvArr* src, CvScalar value, CvArr* dst, CvArr* mask(NULL) ); |
● src
원 영상을 나타낸다.
● value
더하고자 하는 상수값을 지정한다. 상수값은 CvScalar 자료형을 갖는 CV_RGB와 cvScalarAll() 함수를 사용하여 지정한다. CV_RGB를 사용하여 지정하는 경우 예를 들어, 흑백영상에서 임의의 픽셀에 100을 더하고자 하는 경우 상수값은 CV_RGB(100, 100, 100)처럼 지정하고 컬러영상에서 RGB 각 채널에 상수값 100, 110, 120을 더하고자 하는 경우 상수값은 CV_RGB(100, 100, 120)처럼 지정하면 된다.
● dst
목적 영상을 나타낸다.
● mask
마스크를 지정한다. 마스크를 사용하지 않는 경우 NULL로 지정한다.
예를 들어, 원 영상 src에 60을 더하여 목적영상 dst를 얻고자 하는 rsuddn 다음과 같다
cvAddS(src, CV_RGB(60, 60, 60), dst, NULL);
● cvSubS 함수
영상에 상수값을 빼기 위해 사용하는 함수이다.
void cvSubS( CvArr* src, CvScalar value, CvArr* dst, CvArr* mask(NULL) ); |
● src
원 영상을 나타낸다.
● value
빼고자 하는 상수값을 지정한다.
● dst
목적 영상을 나타낸다.
● mask
마스크를 지정한다. 마스크를 사용하지 않는 경우 NULL로 지정한다.
예를 들어, 원 영상 src에 60을 빼서 목적영상 dst를 얻고자 하는 경우 다음과 같다.
cvSubS(src, CV_RGB(60, 60, 60), dst, NULL);
● cvMul 함수
두 영상 간의 곱셈을 수행하는 함수이다.
void cvMul( CvArr* src1, CvArr* src2, CvArr* dst, double scale=1 ); |
● src1
첫 번째 영상을 나타낸다.
● src2
두 번째 영상을 나타낸다.
● dst
목적영상을 나타낸다.
● scale
곱하고자 하는 상수를 나타낸다.
cvMul() 함수는 dst = scale * src1 * src2를 수행한다. 따라서 cvMul() 함수를 이용하여 우리가 원하는 한 영상에서 상수값 곱셈을 수행하기 위해서는 두 번째 영상 src2를 픽셀값이 전부 1인 단위 영상으로 만들어 사용한다. Opencv에서 제공하는 cvSet() 함수를 사용하여 임의의 영상을 단위영상으로 만들 수 있다.
● cvSet 함수
행렬 혹은 영상을 주어진 원소 혹은 픽셀값으로 채우기 위해 사용하는 함수이다.
void cvSet( CvArr* arr, CvScalar value, CvArr* mask=NULL ); |
● arr
목적영상을 나타낸다.
● value
채우고자 하는 상수이며 상수값은 cvScalar 자료형을 갖는 CV_RGB와 cvScalarAll() 함수를 사용하여 지정한다. cvScalarAll() 함수를 사용하여 예를 들어, 0 혹은 255로 채우고자 하는 경우 cvScalarAll(0) 혹은 cvScalarAll(255)처럼 사용하면 된다.
● mask
마스크를 지정한다. 마스크를 사용하지 않는 경우 NULL로 지정한다.
두 영상간의 산술연산
● cvAdd 함수
두 영상 간의 덧셈을 수행하는 함수이다.
void cvAdd( CvArr* src1, CvArr* src2, CvArr* dst, CvArr* mask=NULL); |
● src1
첫 번째 영상을 나타낸다.
● src2
두 번째 영상을 나타낸다.
● dst
목적영상을 나타낸다.
● mask
마스크를 지정한다. 마스크를 사용하지 않는 경우 NULL로 지정한다.
cvAdd() 함수는 dst = src1 + src2를 수행한다.
● cvSub 함수
두 영상 간의 뺄셈을 수행하는 함수이다.
void cvSub( CvArr* src1, CvArr* src2, CvArr* dst, CvArr* mask=NULL ); |
● src1
첫 번째 영상을 나타낸다.
● src2
두 번째 영상을 나타낸다.
● dst
목적영상을 나타낸다.
● mask
마스크를 지정한다. 마스크를 사용하지 않는 경우 NULL로 지정하낟.
cvSub() 함수는 dst = src1 - src2를 수행한다.
● cvDiv 함수
두 영상 간의 나눗셈을 수행하는 함수이다.
void cvDiv( CvArr* src1, CvArr* src2, CvArr* dst, double scale=1 ); |
● src1
첫 번째 영상을 나타낸다.
● src2
두 번째 영상을 나타낸다.
● dst
목적영상을 나타낸다.
● scale
곱하고자 하는 상수를 나타낸다.
cvDiv() 함수는 dst = scale * (src1/src2)를 수행한다.
영상 반전
● cvNot 함수
반전 영상을 얻기 위해 사용하는 함수이다.
void cvNot( CvArr* src, CvArr* dst ); |
● src
원영상을 나타낸다.
● dst
목적영상을 나타낸다.
cvNot() 함수는 dst = ~ src를 수행한다.
이진영상
● cvThreshold 함수
영상에서 이진화하기 위한 함수이다.
cvThreshold( CvArr* src, CvArr* dst, double threshold, double maxValue, CvThreshType type ); |
● src
원영상을 나타낸다.
● dst
결과영상을 나타낸다.
● threshold
임계값을 나타낸다.
● maxValue
픽셀의 최대 명암값을 나타낸다.
● type
이진화 방식을 결정한다.
이진화 방식 |
설명 |
CV_THRESH_BINARY |
임계값 초과 : 255, 임계값 이하 : 0 |
CV_THRESH_BINARY_INV |
임계값 초과 : 0, 임계값 이하 : 255 |
CV_THRESH_TRUNC |
임계값 초과 : 임계값, 임계값 이하 : 원래 픽셀값 |
CV_THRESH_TOZERO |
임계값 초과 : 원래 픽셀값, 임계값 이하 : 0 |
CV_THRESH_TOZERO_INV |
임계값 초과 : 0, 임계값 이하 : 원래 픽셀 값 |
영상 변환
● cvCvtColor 함수
컬러영상을 다른 영상으로 변환하는데 사용하는 함수이다.
void cvCvtColor( CvArr* src, CvArr* dst, int code ); |
● src
원 영상을 나타낸다.
● dst
목적 영상을 나타낸다.
● code
컬러 변환 모드이고 다음의 형식에 의해 변환하고자 하는 모드를 지정하면 된다.
CV_<src_color_space>2<dst_color_space> |
여기서 <src_color_space>과 <dst_color_space>은 다음 중 하나이다.
RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS
예를 들어, RGB 컬러영상을 흑백영상으로 변환하기 위해서는 다음과 같다.
cvCvtColor(src_image, dst_image, CV_RGB2GRAY);
또는 RGB 컬러영상을 HSV 컬러 영상으로 변환하기 위해서는 다음과 같다.
cvCvtColor(src_iamge, dst_image, CV_RGB2HSV);
영상의 블러링
● cvSmooth 함수
영상을 스무딩하는데 사용하는 함수이다.
void cvSmooth( CvArr* src, CvArr* dst, int smoothtype, int param1, int param2, double param3); |
● src
원 영상을 나타낸다.
● dst
목적영상을 나타낸다.
● smoothtype
스무딩 형태를 지정한다.
스무딩 형태 |
설명 |
CV_BLUR |
단순한 블러링을 나타낸다.
param1 * param2 근방영역에 대해 합을 구한 다음 param1 * param2로 나눈다. |
CV_GAUSSIAN |
가우시안 블러링을 나타낸다.
param1 * param2 근방영역에 대해 가우시안 마스크를 사용한다. param3은 표준편차이다. |
CV_MEDIAN |
중앙값 블러링을 나타낸다.
param1 * param2 근방영역에 대해 중앙값을 취한다. |
● param1
마스크의 가로를 나타낸다.
● param2
마스크의 세로를 나타낸다.
● param3
가우시안 마스크인 경우 표준편차(sigma)를 지정하는데 만약에 param3=0을 지정하면 param3값은 다음과 같다.
sigam = (n/2 -1) * 0.3 + 0.8
여기서 n은 n * n 마스크에서 n의 값이다.
● cvFilter2D 함수
사용자가 정의한 마스크를 가지고 영상을 컨벌류션하기 위해 사용하는 함수이다.
void cvFilter2D( CvArr* src, CvArr* dst, CvMat* kernel ); |
● src
원 영상을 나타낸다.
● dst
목적영상을 나타낸다.
● kernel
컨벌류션 할 마스크를 나타내고 cvMat() 함수 및 cvCreateMat() 함수를 사용하여 지정한다. 단 마스크의 원소들은 1채널 실수형이어야 한다.
● cvMat 함수
이미 만들어진 행렬을 지정하는 함수이다.
CvMat cvMat( int rows, int cols, int type, void* data=NULL ); |
● rows
행렬에서 행의 수를 나타낸다.
● cols
행렬에서 열의 수를 나타낸다.
● type
행렬 원소의 형태를 지정하며 당므과 같은 형식에 의해 지정한다.
CV_<bit_depth>(S|U|F>C<number_of_channels> |
예를 들어, CV_8UC1은 8-bit unsigned 1채널 행렬이고 CV_32SC2는 32-bit signed 2채널 행렬이다.
● data
행렬에 대한 포인터를 나타낸다.
영상의 샤프닝
OpenCV에서는 영상의 샤프링을 지원하는 함수는 없다. 우리는 OpenCV의 cvMat() 함수를 사용하여 샤프링 마스크를 정의하고 cvFilter2D() 함수를 사용하여 정의된 마스크를 사용하여 컨벌류션을 수행
에지 검출
● cvSobel 함수
Sobel 연산자를 이용하여 에지검출을 위한 함수이다.
void cvSobel( CvArr* src, CvArr* dst, int xorder, int yorder, int aperture_size=3 ); |
● src
원 영상을 나타낸다.
● dst
목적영상을 나타낸다.
● xorder
x 방향 미분을 나타낸다.
● yorder
y 방향 미분을 나타낸다.
● aperture_size
커널의 크기를 나타낸다.
예를 들어, cvSobel(src, dst, 1, 0, 3)이면 x 방향으로 미분만을 고려한 Soble 방법을 의미하고 cvSobel(src, dst, 0, 1, 3)이면 y방향으로 미분만을 고려한 Sobel 방법을 의미한다. 그리고 cvSobel(src, dst, 1, 1, 3)이면 x 방향으로 미분과 y 방향으로 미분을 고려한 Sobel 방법을 의미한다.
cvSobel() 함수를 사용하는데 주의할 사항은 src가 8비트 영상이면 dst는 16비트 영상이어야 한다. 따라서 에지 영상을 출력하기 위해서는 다시 8비트 영상으로 변환해야한다. 이를 위해 cvCVonvertScale() 함수를 사용하여 영상을 변환한다.
● cvConvertScale 함수
영상을 변환하는데 사용하는 함수이다.
void cvConvertScale( CvArr* src, CvArr* dst, double scale=1, double shift=0 ); |
● src
원 영상을 나타낸다.
● dst
목적 영상을 나타낸다.
● scale
스케일 파라미터를 나타낸다.
● shift
이동 파라미터를 나타낸다.
cvConvertScale() 함수는 src 영상을 dst 영상으로 변환하는덴 주어진 스케일 파라미터와 이동 파라미터를 가지고 다음과 같이 변환한다.
dst = src * scale + shift
● cvLaplace 함수
라플라시안 연산자를 이용하여 에지검출을 위한 함수이다.
void cvLaplace( CvArr* src, CvArr* dst, int aperture_size=3 ); |
● src
원 영상을 나타낸다.
● dst
목적영상을 나타낸다.
● aperture_size
커널의 크기를 나타낸다.
OpenCV를 이용한 히스토그램
● cvCreateHist 함수
히스토그램을 정의하는데 사용하는 함수이다.
CvHistogram* cvCreateHist( int dims, int* sizes, int type, float** ranges=NULL, int uniform=1 ); |
● dims
히스토그램 차원을 지정한다. 흑백영상이면 1차원이고 컬러영상이면 3차원이다.
● sizes
히스토그램 차원의 크기를 나타내며 배열로 표시한다. 예를 들어, 1차원 256 흑백영상인 경우 0부터 255까지 256개 막대를 사용하므로 다음과 같이 정의한다.
int sizes[1] = {256};
그리고 3차원 컬러영상인 경우 각각의 채널은 256개 막대를 사용함으로 다음과 같이 정의한다.
int sizes[3] = {256, 256, 256};
● type
히스토그램 표현 형식(histogram representation format)을 나타낸다. type = CV_HIST_ARRAY이면 다채널 밀집 배열(multi-dimensional dense array)을 나타내고 type = CV_HIST_SPARSE이면 다채널 희소 배열(multi-dimensional sparse array)을 나타낸다. 여기서 밀집배열이냐 희소배열이냐는 0인 원소가 많이 포함되면 희소배열이고 그렇지 않으면 밀집배열을 나타낸다.
● ranges
히스토그램의 x축 범위를 나타낸다.
● uniform
히스토그램에서 막대 간격을 같게 할 것인지 다르게 할 것인지 결정한다.
uniform ≠ 0이면 막대의 간격을 일정 간격으로 한다.
cvCreateHist() 함수는 CvHistogram 구조체를 반환하는데 CvHistogram 구조체의 형식은 다음과 같다.
typedef struct CvHistogram
{
int type;
CvArr* bins;
float thresh[CV_MAX_DIM[3]; /* for uniform histograms */
float ** thresh2; /* for non-uniform histograms */
CvMatND mat; /* embedded matrix header for array histograms */
}CvHistogram; |
● cvCalcHist 함수
영상으로부터 히스토그램을 계산하는데 사용하는 함수이다. 즉, 영상에서 cvCreateHist() 함수에 의해 이미 정의된 히스토그램을 계산한다.
void cvCalcHist( IplImage** img, CvHistogram* hist); |
● img
원 영상을 나타낸다.
● hist
히스토그램에 대한 포인터를 나타낸다.
● cvGetMinMaxHistValue 함수
히스토그램ㅇ데서 막대에 대한 최대 빈도수와 최소 빈도수를 구하는 함수이다.
즉, 명암값 들에 대한 최대 빈도수와 최소 빈도수를 구한다.
void cvGetMinMaxHistValue( CvHistogram* hist, flaot* value_min, float* value_max); |
● hist
히스토그램을 나타낸다.
● value_min
히스토그램의 최소 빈도수를 나타낸다.
● value_max
히스토그램의 최대 빈도수를 나타낸다.
● cvScale 함수
하나의 배열을 다른 배열로 선형 변환에 의해 변환하는 함수이다.
void cvScale( CvArr* src, CvArr* dst, double scale=1, double shift=0); |
● src
원 영상을 나타낸다.
● dst
목적 영상을 나타낸다.
● scale
스케일 파라미터를 나타낸다.
● shift
이동 파라미터를 나타낸다.
cvScale() 함수는 dst = src * scale + shift에 의해 변환된다. 참고로 cvScale() 함수는 cvConvertScale() 함수와 동일한 함수이다.
● cvRectangle 함수
직사각형을 그리기위한 함수이다.
void cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1 ); |
● img
직사각형이 그려질 영상을 나타낸다
● pt1
직사각형의 모서리를 나타낸다.
● pt2
직사각형의 반대편 모서리를 나타낸다.
● color
직사각형의 선의 색상을 나타낸다.
● thickness
직사각형의 선의 두께를 나타낸다.
cvRectangle() 함수에서 모서리 좌표 pt1과 pt2를 정할 때 원점 (0, 0)이 어디에 위치하느냐가 중요하다. 수학좌표에서 원점과 영상에서 원점은 다르기 때문이다.
수학 좌표에서 원점은 왼쪽 하단이나 영상 좌표에서 원점은 왼쪽 상단이다.
● cvGetReal1D 함수
1차원 히스토그램에서 i 번째 막대의 빈도수를 얻기 위한 함수이다.
double cvGetReal1D( CvArr* arr, int idx0 ); |
● arr
1차원 배열을 의미한다.
● idx0
원소의 위치에 대한 인덱스를 나타낸다.
예를 들어, cvGetReal1D(histo->bins, i)는 배열 bins에서 i번째 인덱스에 대한 원소를 반환한다.
● cvSet 함수
영상을 주어진 값으로 설정할 때 사용하는 함수이다.
void cvSet( CvArr* arr, CvScalar value, CvArr* mask=0 ); |
● arr
원 영상을 나타낸다.
● value
채울 값을 지정한다.
● mask
마스크를 나타낸다.
예를 들어, cvSet( histImage, cvScalarAll(255), 0 )이면 영상 histImage의 픽셀값을 255로 설정한다.
히스토그램 평활화
● cvEqualizeHist 함수
흑백영상에서 히스토그램 평활화하는데 사용하는 함수이다.
void cvEqualizeHist( CvArr* src, CvArr* dst ); |
● src
흑백 영상을 나타낸다.
● dst
목적 영상을 나타낸다.
영상 확대 및 축소
● cvResize 함수
영상의 크기를 조절하는 함수이다.
void cvResize( CvArr* src, CvArr * dst, int interpolation=CV_INTER_LINEAR ); |
● src
원 영상을 나타낸다.
● dst
목적 영상을 나타낸다.
● interpolation
보간법을 나타내며 다음의 방법이 있다.
(a) CV_INTER_NN - 최근접 이웃 보간법(nearst-neighbor interpolation)
(b) CV_INTER_LINEAR - 양선형 보간법(bilinear interploation (used by default))
(c) CV_INTER_AREA - 재표본 추출법(resampling using pixel area relation)
(d) CV_INTER_CUBIC - 큐빅 보간법(bicubic interpolation)
회전 영상
● cv2DRotationMatrix 함수
2 * 3 변환행렬을 생성하기 위한 함수이다.
CvMat* cv2DRotationMatrix( CvPoint2D32f center, double angle, double scale, CvMat* map_matrix ); |
● center
회전 중심을 나타낸다.
● angle
회전 각도를 나타낸다. 각도는 화면좌표계에서 원점을 중심으로 반시계 방향의 각을 의미한다.
● scale
스케일 척도를 나타낸다. 예를 들어, scale=2이면 2배 만큼 영상이 확대된다.
● map_matrix
생성되는 2 * 3 변환행렬을 가리키는 포인터를 나타낸다.
여기서 α=scale*cos(angle), β=scale*sin(angle)이다.
● cvWarpAffine 함수
cv2DRotationMatrix() 함수에서 생성된 변환 행렬을 영상에 적용하는 함수이다.
void cvWarpAffine( CvArr* src, CvArr* dst, CvMat* map_matrix, int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, CvScalar fillval=cvScalarAll(0) ); |
● src
원 영상을 나타낸다.
● dst
목적 영상을 나타낸다.
● map_matrix
2 * 3 변환행렬을 나타낸다.
● flags
다음 중 하나의 선택사항을 지정한다.
(a) CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS
양선형 보간법을 사용하고 목적 영상의 모든 픽셀을 어떤 값으로 채운다.
(b) CV_WARP_INVERSE_MAP
목적 영상에서 원 영상으로 역 변환에 의해 보간한다. 즉, 역방향 사상에 의해 보간한다.
● fillval
목적 영상에서 회전 후 남는 공간을 채울 색을 지정한다. 디폴트는 픽셀값이 0인 검은색이다.
대칭 영상
● cvFlip 함수
void cvFlip( CvArr* src, CvArr* dst, int flip_mode=0); |
● src
원 영상을 나타낸다.
● dst
목적 영상을 나타낸다.
● flip_mode
(a) flip_mode = 0이면 상하 대칭(디폴트)이다.
(b) flip_mode > 0이면 좌우 대칭이다.
(c) flip_mode < 0이면 상하 대칭 후 좌우 대칭이다.
침식 연산과 팽창 연산
● cvDilate 함수
팽창연산을 수행하기 위한 함수이다.
void cvDilate( CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 ); |
● src
원 영상을 나타낸다.
● dst
목적 영상을 나타낸다.
● element
구조적 요소를 나타내며 만약 element = NULL이면 3 * 3 사각형 구조적 요소가 사용된다. IplConvKernel은 구조적 요소를 표현하는 구조체이다.
● iterations
팽창 연산 수행 횟수를 나타낸다.
● cvCreateStructuringElementEx 함수
구조적 요소를 정의하기 위한 함수이다.
IplConvKernel* cvCreateStructuringElementEx( int cols, int rows, int anchor_x, int anchor_y, int shape ); |
● cols
구조적 요소의 열의 수를 나타낸다.
● rows
구조적 요소의 행의 수를 나타낸다.
● anchor_x
중심점의 x 좌표를 나타낸다(0 .. cols-1). 만약 3 * 3 사각형 구조적 요소이면 anchor_x=1이 되고
5 * 5 사각형 구조적 요소이면 anchor_x=2가 된다.
● anchor_y
중심점의 y 좌표를 나타낸다(0 .. rows-1). 만약 3 * 3 사각형 구조적 요소이면 anchor_y=1이 되고
5 * 5 사각형 구조적 요소이면 anchor_y=2가 된다.
● shape
구조적 요소의 모양을 지정한다.
(a) CV_SHAPE_RECT : 사각형 구조적 요소
(b) CV_SHAPE_CROSS : 십자형 구조적 요소
(c) CV_SHAPE_ELLIPSE : 타원형 구조적 요소
(d) CV_SHAPE_CUSTOM : 사용자 정의 구조적 요소
cvCreateStructuringElementEx() 함수의 사용 예는 다음과 같다.
int element_shape = CV_SHAPE_RECT;
int pos = 1;
IplConvKernel* element = cvCreateStructuringElementEx( pos*2+1, pos*2+1, pos, pos, element_shape);
● cvErode 함수
침식연산을 수행하기 위한 함수이다.
void cvErode( CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 ); |
● src
원 영상을 나타낸다.
● dst
목적 영상을 나타낸다.
● element
구조적 요소를 나타낸다. 만약 element=NULL이면 3 * 3 사각형 구조적 요소가 사용된다. IplConvKernel은 구조적 요소를 표현하는 구조체이다.
● iterations
침식연산 수행 횟수를 지정한다.
열림 연산과 닫힘 연산
● cvMorphologyEx 함수
팽창연산과 침식연산으로부터 확장된 연산 즉, 열림연산, 닫힘연산 그리고 기울기 연산 등을 수행하기 위한 함수이다.
void cvMorphologyEx( const CvArr* src, CvArr* dst, CvArr* temp, IplConvKernel* element, int operation, int iterations=1 ); |
● src
원 영상을 나타낸다.
● dst
목적 영상을 나타낸다.
● temp
임시 영상을 나타내며 열림연산과 닫힘연산인 경우 NULL을 지정한다.
● element
구조적 요소를 나타낸다. 만약 element=NULL이면 3 * 3 사각형 구조적 요소가 사용된다.
● operation
다음 연산 중 하나를 지정한다.
(a) CV_MOP_OPEN : 열림연산
(b) CV_MOP_CLOSE : 닫힘연산
(c) CV_MOP_GRADIENT : 기울기 연산
(d) CV_MOP_TOPHAT : top hat 연산(e) CV_MOP_BLACKHAT : black hat 연산
● iterations
연산 수행 횟수를 지정한다.
동영상 파일
● cvCaptureFromFile() 함수
동영상 파일을 불러오는데 사용하는 함수이다.
CvCapture* cvCaptureFromFile( char* filename ); |
● filename
동영상 파일의 이름을 나타낸다.
● cvReleaseCapture() 함수
불러온 동영상에 대해 메모리를 해제하기 위해 사용하는 함수이다.
void cvReleaseCapture( CvCapture** capture ); |
● capture
메모리 해제할 동영상을 나타낸다.
● cvGrabFrame() 함수
동영상 파일(혹은 카메라)로부터 하나하나의 프레임을 잡는데(grab)사용하는 함수이다.
int cvGrabFrame( CvCapture* capture ); |
● capture
재생할 출력할 동영상을 나타내며 cvGrabFrame() 함수가 호출될 때 마다 파일(혹은 카메라)로부터 한 프레임씩 잡아(grab) 내부 버퍼에 저장한다.
● cvRetrieveFrame() 함수
cvGrabFrame() 함수로부터 잡은 프레임으로부터 영상을 얻어내는데 사용하는 함수이다.
IplImage* cvRetrieveFrame( CvCapture* capture ); |
● capture
재생할 동영상을 나타내며 cvRetrieveFrame() 함수는 cvGrabFrame() 함수로부터 잡은 프레임으로부터 얻은 영상에 대한 포인터를 반환한다. 서 반환된 영상은 바로 메모리를 해제해서는 안 된다.
● cvCreateVideoWriter() 함수
디스크에 동영상 파일을 생성하기 위한 함수이다. 동영상 파일이름과 코덱을 지정하고 그리고 fps와 프레임 크기를 지정한다.
CvVideoWriter* cvCreateVideoWriter( char* filename, int fourcc, double 렌, CvSize frame_size ); |
● filename
출력할 동영상의 파일 이름을 지정한다.
● fourcc
프레임을 압축하기 위해 사용된 4-글자 코덱을 나타내는 코드를 설정한다. -1값을 지정하면 함수가 실행될 때 코덱을 선택할 수 있는 대화상자가 나타난다. 그렇지 않은 경우 CV_FOURCC 함수를 이용해 다음에서 코덱을 선택할 수 있다.
(a) CV_FOURCC('P', 'I', 'M', '1') = MPEG -1 codec
(b) CV_FOURCC('M', 'J', 'P', 'G') = motion-jpeg codec
(c) CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
(d) CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
(e) CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec
● fps
초당 재생되는 프레임의 수를 설정한다.
● frame_size
프레임 크기를 나타낸다.
● cvWriteFrame() 함수
지정된 동영상 파일에 한 프레임 씩 출력한다.
int cvWriteFrame( CvVideoWriter* writer, IplImage* image ); |
● writer
동영상 파일을 나타낸다.
● image
프레임을 나타낸다.
● cvReleaseVideoWriter() 함수
지정된 파일에 저장하는 것을 종료하고 저장 구조를 메모리에서 해제한다.
void cvReleaseVideoWriter( CvVideoWriter** writer ); |
● wrtier
동여상 파일을 나타낸다.
● cvQueryFrame() 함수
동영상 혹은 카메라로부터 프레임을 읽고 반환하는 함수이다.
IplImage* cvQueryFrame( CvCaptuer* capture ); |
● capture
동영상 파일을 나타낸다.
cvQueryFrame() 함수는 cvGrabFrame() 함수와 cvRetrieveFrame() 함수를 동시에 실행하는 효과를 갖고 있다.
● cvInitFont() 함수
글씨체를 초기화하는데 사용하는 함수이다.
void cvInitFont( CvFont* font, int font_face, double hscale, double vscale, double, italicScale = 0, int thickness=1); |
● font
폰트에 대한 포인터이다.
● font_face
폰트 이름을 나타낸다.
(예) CV_FONT_HERSHEY_SIMPLEX - normal size s문-serif font 보통의 글자 크기를 나타내며 산세리프 글씨체이다.
● hscale
글자의 수평 스케일(horizontal scale)을 나타내며 1.0f이면 원래 글자의 넓이를 나타낸다.
● vscale
글자의 수직 스케일(vertical scale)을 나타내며 1.0f이면 원래 글자의 높이를 나타낸다.
● italicScale
글자의 기울어진 정도를 나타낸다. 0은 전혀 기울지 않은 폰트이고 1.0f는 45도 기운 폰트를 나타낸다.
● thickness
글자의 굵기를 나타낸다.
● cvPutText() 함수
텍스트를 영상에 추가한다. 어떤 영상에 어떤 색상의 텍스트를 어디에 추가할것인가를 지정한다.
void cvPutText( CvArr* img, char* text, CvPoint org, CvFont* font, int color ); |
● img
입력영상을 나타낸다.
● text
출력할 텍스트를 나타낸다.
● org
텍스트를 출력할 좌표를 나타낸다.
● font
폰트를 가리키는 포인터를 나타낸다.
● color
텍스트의 색상을 지정한다.
다음은 텍스트 “I Love U"를 영상에 추가하기 위한 문장이다. 여기서 텍스트의 폰트는
cvPoint(10, 10이고 색상은 CV_RGB(200, 0, 0)로 지정한다.
cvPutText( image, "I Love U", cvPoint(10, 10), &font, CV_RGB(200, 0, 0) );
PC 카메라로부터 영상 다루기
● cvCaptureFromCAM() 함수
PC카메라로부터 동영상을 캡쳐하는데 사용하는 함수이다.
CvCapture* cvCaptureFromCAM( int index ); |
● index
사용할 카메라를 지정한다. 카메라가 1개인 경우 혹은 여러 개 중에서 특정한 카메라를 지정하지 않을 경우는 -1을 사용한다. 만약 2개인 경우 index값이 0이면 카메라를 선택할 수 있는 창이 나타난다.
● cvCreateTrackbar() 함수
트랙 바를 만들고 지정된 윈도우에 부착한다.
int cvCreateTrackbar( char* trackbar_name, char* window_name, int* value, int count, CvTrackbarCallback on_change ); |
● trackbar_name
트랙 바의 이름을 나타낸다.
● window_name
트랙 바가 부착될 윈도우의 이름을 지정한다.
● value
정수형 포인터로서 슬라이더의 위치를 나타낼 정수이다.
● count
트랙 바의 최대 위치, 여기서 최소 위치는 0 이다.
● on_change
트랙 바가 움직일 때 마다 호출하는 함수에 대한 포인터, 만약 호출되는 함수가 없으면 NULL이다.)
OpenCV를 이용한 얼굴인식 프로그램
● cvCalcEigenObjects() 함수
입력 영상들에 대한 고유얼굴과 평균열상을 계산한다.
void cvCalcEigenObjects( int nObjects, void* input, void* output, int ioFlags, int ioBufSize, void* userData, CvTermCriteria* calcLimit, IplImage* avg, float* eigVals ); |
● nObjects
입력영상의 개수를 나타낸다.
● input
입력영상에 대한 포인터를 가리킨다.
● output
고유얼굴을 나타낸다.
● ioFlags
입력/출력 플러그를 나타낸다. 입출력 플러그를 사용하지 않으면 0이다.
● ioBufSize
입력/출력 버퍼 크기를 나타낸다.
● userData
콜벡함수(callback functions)를 위해 필요한 모든 데이터를 포함하는 구조에 대한 포인터이다. 콜벡함수를 사용하지 않으면 0이다.
● calcLimit
최대 고유얼굴 영상의 개수(calcLimit.max_iter)와 가장 큰 고유값에 대한 현재의 고유값의 비율에 대한 임계값(calcLimit.epsilon)을 지정한다.
● avg
평균영상을 나타낸다.
● eigVals
고유값을 나타낸다.
예를 들어, cvCalcEigenObjects() 함수의 사용 예는 다음과 같다.
cvCalcEigenObjects(M, images, eigenObjects, 0,0,0, &criteria, avg, eigVals);
이것은 M 개의 입력 영상에 대해 고유얼굴 영상 eigenObjects과 평균영상 avg을 계산한다.
여기서 criteria는 CvTermCriteria 자료형의 변수로서 고유얼굴을 계산하는데 최대 반복횟수와 고유값에 대한 임계값을 지정한다.
● cvTermCriteria() 함수
CvTermCriteria cvTermCriteria( int type, int max_iter, double epsilon ); |
● type
CV_TERMCRIT_ITER(최대 반복횟수)와 CV_TERMCRIT_EPS(고유값에 대한 임계값)를 고려하고자 하는 경우 CV_TERMCRIT_ITER+CV_TERMCRIT_EPS처럼 지정한다.
● max_iter
반복 최대 횟수를 지정한다.
● epsilon
가장 큰 고유값에 대한 현재의 고유값의 비율에 대한 임계값을 지정한다.
예를 들어 cvTermCriteria() 함수의 사용 예는 다음과 같다.
cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 10, 0.05);
인수로서 10은 최대 반복횟수이고 0.05는 고유얼굴을 결정하는데 고유값에 대한 임계값을 나타내며 최대 고유값에 대한 현재의 고유값의 비율이 0.05보다 작으면 반복을 종료한다.
● cvEigenDecomposite() 함수
입력영상을 고유얼굴 공간에 투영시켰을 때 분해계수(decomposition coefficients)를 계산한다.
void cvEigenDecomposite( IplImage* obj, int nEigObjs, void* eigInput, int ioFlags, void* userData, IplImage* avg, float* coeffs) |
● obj
입력영상을 나타낸다.
● nEigObjs
고유얼굴 영상의 개수를 나타낸다.
● eigInput
고유얼굴 영상에 대한 포인터를 나타낸다.
● ioFlags
입력/출력 플러그를 나타낸다. 입출력 플러그를 사용하지 않으면 0이다.
● userData
콜벡함수(callback functions)를 위해 필요한 모든 데이터를 포함하는 구조에 대한 포인터이다. 콜벡함수를 사용하지 않으면 0이다.
● avg
평균영상을 나타낸다.
● coeffs
분해계수를 나타낸다.
예를 들어, cvEigenDecomposite() 함수의 사용 예는 다음과 같다.
cvEigenDecomposite(newone, nEigens, eigenObjects, 0,0, avg, coeffs);
이것은 입력영상 newone을 고유얼굴 eigenObjects 공간에 투영시켰을 때 분해 계수 coeffs를 계산한다.
● cvEigenProjection() 함수
고유얼굴 공간상에서 재구성된 영상을 얻는다. 즉, 고유얼굴과 평균영상 그리고 분해계수로부터 재구성된 영상을 얻는다.
void cvEigenProjection( void* input_vecs, int eigenvec_count, int io_flags, void* userdata, float* coeffs, IplImgae* avg, IplImage* proj ); |
● input_vecs
고유얼굴 영상에 대한 포인터를 나타낸다.
● eigenvec_count
고유벡터의 개수를 나타낸다.
● io_flags
입력/출력 플러그를 나타낸다. 입출력 플러그를 사용하지 안흥면 0이다.
● userdata
콜벡함수(callback functions)를 위해 필요한 모든 데이터를 포함하는 구조에 대한 포인터이다. 콜벡함수를 사용하지 않으면 0이다.
● coeffs
분해계수를 나타낸다.
● avg
평균 영상을 나타낸다.
● proj
고유얼굴 공간상에서 재구성된 영상을 나타낸다.
예를 들어, cvEigenProjection() 함수의 사용 예는 다음과 같다.
cvEigenProjection(eigenObjects, nEigens, 0, 0, coeffs, avg, proj);
이것은 고유얼굴 eigenObjects과 평균영상 avg 그리고 분해계수 coeffs로부터 재구성된 영상 proj을 얻는다.
출처 : www.opencv.co.kr