cvSplit()
void cvSplit(
const CvArr* src,
CvArr* dst0,
CvArr* dst1,
CvArr* dst2,
CvArr* dst3
);
다채널(Multi-Channel) 배열을 여러 개의 단채널(Single-Channel) 배열로 반환한다.
- src: 원본 영상
- dst0, dst1, dst2, dst3: 결과 영상
- src 영상의 각 채널을 분할해 단일 채널 영상인 dst0, dst1, dst2, dst3에 저장.
- 출력 영상은 입력 영상과 동일한 크기와 데이터 타입을 가진다.
- 원본 영상이 4보다 작은 개수의 채널을 가질 경우 사용되지 않는 출력 영상에는 NULL을 저장
cvMerge
void cvMerge(
const CvArr* src0,
const CvArr* src1,
const CvArr* src2,
const CvArr* src3,
CvArr* dst
);
cvSplit() 함수의 반대. 여러 단채널(Single-Channel) 배열들로부터 다시 다채널(Multi-Channel) 배열로 변환한다.
- src0: 첫 번째 입력 행렬
- src1: 두 번째 입력 행렬
- src2: 세 번째 입력 행렬
- src3: 네 번째 입력 행렬
- dst: 결과를 저장할 행렬
- dst는 입력 행렬과 동일한 크기, 동일한 타입, 다만 채널의 개수는 2, 3, 4가 될 수 있다. 사용하지 않을 경우 NULL로 설정한다.
cvFlip
void cvFlip(
const CvArr* src,
CvArr* dst = NULL
int flip_mode = 0
);
영상을 x축, y축, 또는 양축 모든 방향으로 뒤집는다.
- src: 원본 영상
- dst: 결과 영상
- flip_mode
- 0: x축을 기준으로 뒤집기
- 양수: y축 기준으로 뒤집기
- 음수: 양축 모두 뒤집기
ex)
#include "cv.h"
#include "highgui.h"
int main() {
IplImage *srcImage;
if ((srcImage = cvLoadImage("untitled.jpg")) == NULL)
return -1;
cvNamedWindow("srcImage", CV_WINDOW_AUTOSIZE);
cvShowImage("srcImage", srcImage);
IplImage* dstB = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 1);
IplImage* dstG = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 1);
IplImage* dstR = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 1);
cvSplit(srcImage, dstB, dstG, dstR, NULL);
IplImage* blue_red = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 3);
cvMerge(dstB, NULL, dstR, NULL, blue_red);
cvNamedWindow("Blue&red", CV_WINDOW_AUTOSIZE);
cvShowImage("Blue&red", blue_red);
IplImage* red = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 3);
cvMerge(NULL, NULL, dstR, NULL, red);
cvNamedWindow("RED", CV_WINDOW_AUTOSIZE);
cvShowImage("RED", red);
IplImage* blue = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 3);
cvMerge(dstB, NULL, NULL, NULL, blue);
cvNamedWindow("BLUE", CV_WINDOW_AUTOSIZE);
cvShowImage("BLUE", blue);
IplImage *copyImageY;
copyImageY = cvCreateImage(cvSize(srcImage->width, srcImage->height),
IPL_DEPTH_8U, srcImage->nChannels);
cvFlip(srcImage, copyImageY, 1); // y축 뒤집기
cvNamedWindow("FlipY", CV_WINDOW_AUTOSIZE);
cvShowImage("FlipY", copyImageY);
IplImage *copyImageX;
copyImageX = cvCreateImage(cvSize(srcImage->width, srcImage->height),
IPL_DEPTH_8U, srcImage->nChannels);
cvFlip(srcImage, copyImageX, 0); // x축 뒤집기
cvNamedWindow("FlipX", CV_WINDOW_AUTOSIZE);
cvShowImage("FlipX", copyImageX);
cvWaitKey(0);
cvReleaseImage(&blue);
cvReleaseImage(&red);
cvReleaseImage(&blue_red);
cvReleaseImage(&dstR);
cvReleaseImage(&dstG);
cvReleaseImage(&dstB);
cvReleaseImage(&srcImage);
cvReleaseImage(©ImageY);
cvReleaseImage(©ImageX);
cvDestroyWindow("srcImage");
cvDestroyWindow("Blue&red");
cvDestroyWindow("FlipY");
cvDestroyWindow("FlipX");
cvDestroyWindow("RED");
cvDestroyWindow("BLUE");
}