OpenCV
영상읽기,출력및저장
cvLoadImage()함수를 이용하여 읽어온 영상을 화면에 출력하기 위해서는
cvNamedWindow()함수를 이용하여 영상 출력을 위한 윈도우를 만들고
cvShowImage()함수를 이용하여 지정된 윈도우에 영상을 출력한다.
IplImage*cvLoadImage(filename,iscolor);
Iscolor>0 컬러 영상으로 변환하여 로드한다.
Iscolor=0흑백 영사으로 변환하여 로드한다.
Iscolor<0 원래 영상으로 로드한다.
Iplimage*image;
Image=cvLoadImage(“vision.jpg”,-1);
lcvNamedWindow(윈도우의이름,flag);
flag:CV_WINDOW_AUTOSIZE=1 원도우이 영상의 크기에 맞춘다.
flag: 0 크기 조절을 할 수 있다.
cvShowImage(윈도우의이름,CvArr*image);
image: 출력할 영상을 나타내며 cvLoadImage() 함수에 의해 로드된 영상을 지정한다
cvWaitKey(delay)
delay<=0: 영상이 출력된 상태에서 무한히 키보드 기다리다.
delay(1000):1초 동안 기다리다.
cvReleaseImage(&image)
메모리에 로드된 영상을 메모리에서 해제한다.
cvCreateImage
Ip1Image*Image= cvCreateImage ( size, depth, channels );
Ip1Image*Image= cvCreateImage ( cvSize ( 640 , 480 ) , IPL_DEPTH_8U , 1 );
①영상의 크기size:
cvSize(width,height) :크기 직접 지정한다
cvGetSize() : 특정한 영상의 크기
②영상 데이터의 깊이를 지정한다. 1철널 영상인 경우는 픽셀의 깊이가 되고 3채널 영상인 경우 각 채널의 깊이가 된다.
IPL_DEPTH_8U: 8 비트 unsigned integer(0~255) 즉,0과 255사이256개의 정수 값으로 표현하계다는 의미
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: 16 비트 floating-point number
③Channels: 픽셀 당 채널 수를 지정한다
흑백영상: 1
컬러영상: 3
cvSplit(CvArr*src, CvArr*dst1, CvArr*dst2, CvArr*dst3);
src: 다채널 영상을 나타낸다 원영상=dst1+dst2+dst3
dst1,dst2,dst3: 단일 채널 영상을 나타난다cvSaveImage(char*filename, CvArr*image);
filename: 저장할 파일이름을 나타낸다.
예: Ip1image*image;
cvSaveImage(“vision.jpg”,image);
영상데이터에직접접근하기
data위치:
흑백: data[i*width + j ];
컬러: data[i*width*channels + j*channels + k ]
RGB영상을흑백영상으로변환하는공식
NTSC표준: I= 0.299*R + 0.587*G + 0.114*B
대부분 적용: I= 0.333*R + 0.333*G + 0.333*B
픽셀기반영상처리
산술연산
cvAddS(CvArr*src, CvScalar value, CvArr*dst , CvArr*mask(Null))
상수값을 더하기 위해 사용하는 함수.
src: 원영상을 나타난다
value:
CV_RGB(60,69,60);
dst: 목적 영상을 나타난다
예: cvAdd ( src, CV_RGB(60,60,60), dst ,NULL);
cvSubS( CvArr*src, CvScalar value, CvArr*dst, CvArr*mask(NULL))
상수 값을 빼기 위해 사용하는 함수
cvMul(CvArr*src1, CvArr*src2, CvArr*dst, double scale=1)
두 영상 간의 곱셈을 수행하는 함수이다
src1: 첫번째 영상을 나타낸다
src2: 두 번째 영상을 나타낸다.
dst: 목적영상을 나타낸다
scale: 곱하고자 하는 상수를 나타낸다.
예: cvMul(src1, src2, dst,1.5)
cvSet(CvArr*arr,CvArr* value, CvArr* mask=NULL);
행렬 혹은 영상을 주어진 원소 혹은 픽셀값으로 채우기 위해 사용하는 함수이다.
arr:목적영상을 나타낸다
value: 채우고자 하는 상수이며 상수값은 CvScalar 자료형을 갖는 CV_RGB와 cvScalarAll() 함수를 사용하여 지정한다.
두영상간의산술연산
cvAdd( CvArr*src1, CvArr*src2, CvArr* dst, CvArr*mask=NULL)
두 영상 간의 덧셈을 수행하는 함수이다
cvSub(CvArr*src1, CvArr*src2, CvArr* dst, CvArr*mask=NULL)
두 영상 간의 뺄셈을 수행하는 함수이다
cvDiv(CvArr*src1, CvArr*src2, CvArr* dst, double scale = 1)
두 영상 간의 나눗셈을 수행하는 함수이다
영상 반전 cvNot(CvArr*src1, CvArr* dst );
이진 영상 ( binary image )
흰색(255) 과 검은색(0) 으로 이루어진 영상이다.
F(X)= 255, x>=T;
0, x<T;
T:threshold
CvThreshold(CvArr*src, CvArr* dst, double threshold, double maxValue,
CvthreshTypetype)
영상에서 이진화하기 위한 함수이다
Threshold:임계값을 나타낸다.
maxValue:픽셀의 최대 명암값을 나타낸다.
Type: 이진화 방식을 결정한다.
이진화 방식:
CV_THRESH_BINARY: 임계값 초과: 255, 임계값 이하:
CV_THRESH_BINARY_INV: 임계값 초과: 0, 임계값 이하: 255
CV_THRESH_TRUNC: 임계값 초과: 임계값,임계값 이하: 원래 픽셀값
CV_THRESH_TOZERO: 임계값 초과: 원래픽셀값, 임계값 이하: 0
CV_THRESH_TOZERO_INV: 임계값 초과: 0,임계값 이하: 원래 픽셀값