컴퓨터 과학 & 영상처리 관련/OpenCV

openCV에서 컬러이미지 배열로 접근법

꺄뜨르 2012. 7. 26. 13:25

  1. // MyConsole.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
  2. //
  3.  
  4. #include "stdafx.h"
  5.  
  6.  
  7. int _tmain(int argc, _TCHAR* argv[])
  8. {
  9.     char* MyImg1 = "testSize\img1.bmp";
  10.     char* MyImg2 = "testSize\img2.bmp";
  11.  
  12.     int i,j,k=8;
  13.  
  14.     CreateDirectory(_T("testSize"), NULL);
  15.  
  16.     IplImage *img1 = cvCreateImage(cvSize(k,k),IPL_DEPTH_8U,1);
  17.     IplImage *img2 = cvCreateImage(cvSize(k,k),IPL_DEPTH_8U,3);
  18.    
  19.     printf("IPL_DEPTH_8U = %d ",IPL_DEPTH_8U);
  20.     printf("size of 1 channels %d x %d = %d ",k,k,img1->imageSize);
  21.     printf("size of 3 channels %d x %d = %d ",k,k,img2->imageSize);
  22.  
  23.     printf("addr 1 = %x %x %d ",&img1->imageData[0],&img1->imageData[1],sizeof(img1->imageData[0]));
  24.     printf("addr 3 = %x %x %d ",&img2->imageData[0],&img2->imageData[1],sizeof(img2->imageData[0]));
  25.  
  26.     for(i = 0 ; i < img1->imageSize ; i++)
  27.         img1->imageData[i]=i;
  28.  
  29.     //for(j = 0 ; j < img2->imageSize ; j++)    //이건 걍 흑백일때랑 비슷하게 됨..어차피 밝기값 섞이니깐
  30.     //  img2->imageData[j]=j;
  31.  
  32.     //for(j = 0 ; j < img2->width ; j++)  //이 경우는 가로만큼만 해서 위쪽에 잠깐만 파란색이됨
  33.     //  img2->imageData[j*3]=100;   
  34.    
  35.     for(j = 0 ; j < img2->width * img2->height ; j++)  //이 경우는 이미지가 파랗게 됨 BRG 순인가봄
  36.         img2->imageData[j*3]=100;
  37.  
  38.     printf("i = %d, j = %d j->width * j->height = %d ",i,j,img2->width * img2->height);
  39.  
  40.     cvSaveImage(MyImg1,img1);
  41.     cvSaveImage(MyImg2,img2);
  42.  
  43.     cvReleaseImage(&img1);
  44.     cvReleaseImage(&img2);
  45.  
  46.     return 0;
  47. }

결과화면은 이거
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겠네