컴퓨터 과학 & 영상처리 관련/OpenCV
openCV에서 컬러이미지 배열로 접근법
꺄뜨르
2012. 7. 26. 13:25
- // MyConsole.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
- //
- #include "stdafx.h"
- int _tmain(int argc, _TCHAR* argv[])
- {
- char* MyImg1 = "testSize\img1.bmp";
- char* MyImg2 = "testSize\img2.bmp";
- int i,j,k=8;
- CreateDirectory(_T("testSize"), NULL);
- IplImage *img1 = cvCreateImage(cvSize(k,k),IPL_DEPTH_8U,1);
- IplImage *img2 = cvCreateImage(cvSize(k,k),IPL_DEPTH_8U,3);
- printf("IPL_DEPTH_8U = %d ",IPL_DEPTH_8U);
- printf("size of 1 channels %d x %d = %d ",k,k,img1->imageSize);
- printf("size of 3 channels %d x %d = %d ",k,k,img2->imageSize);
- printf("addr 1 = %x %x %d ",&img1->imageData[0],&img1->imageData[1],sizeof(img1->imageData[0]));
- printf("addr 3 = %x %x %d ",&img2->imageData[0],&img2->imageData[1],sizeof(img2->imageData[0]));
- for(i = 0 ; i < img1->imageSize ; i++)
- img1->imageData[i]=i;
- //for(j = 0 ; j < img2->imageSize ; j++) //이건 걍 흑백일때랑 비슷하게 됨..어차피 밝기값 섞이니깐
- // img2->imageData[j]=j;
- //for(j = 0 ; j < img2->width ; j++) //이 경우는 가로만큼만 해서 위쪽에 잠깐만 파란색이됨
- // img2->imageData[j*3]=100;
- for(j = 0 ; j < img2->width * img2->height ; j++) //이 경우는 이미지가 파랗게 됨 BRG 순인가봄
- img2->imageData[j*3]=100;
- printf("i = %d, j = %d j->width * j->height = %d ",i,j,img2->width * img2->height);
- cvSaveImage(MyImg1,img1);
- cvSaveImage(MyImg2,img2);
- cvReleaseImage(&img1);
- cvReleaseImage(&img2);
- return 0;
- }
결과화면은 이거
IPL_DEPTH_8U = 8
size of 1 channels 8 x 8 = 64
size of 3 channels 8 x 8 = 192
addr 1 = 78d820 78d821 1
addr 3 = 78d910 78d911 1
i = 64, j = 64 j->width * j->height = 64
계속하려면 아무 키나 누르십시오 . . .
ctrl + f5의 경우는 getchar();getchar(); 안해놔도 알아서 결과화면 잘 보이데...
_T로 const char 상수를 하지 않으니깐 막 깨져서 폴더가 안만들어지길래 그대로 했고...
컬러로 할 경우에는 BGR 순서로 j * 3이 blue, j * 3 + 1 = green , j * 3 + 2 = red가 되겠다
흑백보다 3배가 되는데 만약 k가 5였을 경우는 64,192 대신 40, 80으로 크기가 나왔었다..
뭐 4의배수가 아니면 안되는거 같고..1차원 배열로 가로 * 세로 크기만큼 *3이 전체 크기..
배열의 원소의 크기가 1바이트 길래 아 이건 이렇게 하는구나..알았고
배열 길이도 i,j로 확인한 결과 i보다 j가 3배였기 땜시 그렇게 이해를 하였다
IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,IPL_DEPTH_32S, IPL_DEPTH_32F,IPL_DEPTH_64F
요것들에 대해서도 크기와 개념에 대한 정리를 좀 해야겠다
printf("depth = %d, %d\n",img1->nChannels,img2->nChannels);
요거 추가하면 1,3 출력됨
흑백이 1, 컬러가 3...그니깐 전체 크기는 가로 * 세로 * nChannels겠네