IT/OpenCV

영상을 행렬로, 행렬을 영상으로...

Jang HyunWoong 2014. 12. 19. 11:57

cvGetMat 함수는 CvMat 행렬 헤더 포이터를 반환하고, 

cvGetImage 함수는 IplImage 영상의 헤더 포인터를 반환한다.

 

결과 화면






선택한 영역의 행렬을 나타내고 있다. 

 



위에서 나타난 행렬을 다시 이미지영상으로 나태낸 것이다. 

 

  1. #include "cv.h"
  2. #include "highgui.h"
  3. #include <stdio.h>
  4. void PrintMat(const CvMat *mat, const char *strName);
  5. int main()
  6. {
  7. IplImage *srcImage;
  8. if((srcImage=cvLoadImage("lena.jpg", CV_LOAD_IMAGE_GRAYSCALE)) == NULL)
  9. return -1;
  10. CvMat matHeader, *pSrcMat;CvMat 함수로 행렬 헤더 포인터를 선언한다.
  11. cvSetImageROI(srcImage, cvRect(0, 0, 50, 50));영상 srcImage의 ROI(region of interest)를 
  12. //cvRect(0,0,50,50)로 설정
  13. cvRectangle(srcImage, cvPoint(0, 0), cvPoint(50, 50), CV_RGB(0, 0, 255), 2); //선택영역 보기 위한 설정
  14. pSrcMat = cvGetMat(srcImage, &matHeader);srcImage를 pSrcMat로 변환한다. 
  15. //&matHeader와 pSrcMat은 동일한 주소이다.
    1.   IplImage *dstImage, tmpImage;
    2. dstImage = cvGetImage(pSrcMat, &tmpImage);
    3.  
    4. cvNamedWindow("dstImage", CV_WINDOW_AUTOSIZE);
    5. cvShowImage("dstImage", dstImage);
    6. PrintMat(pSrcMat, "pSrcMat");
    7.  
    8. cvWaitKey(0);
    9. cvDestroyAllWindows();
    10. cvReleaseImage(&srcImage);
    11. return 0;
    12. }
    13. void PrintMat(const CvMat *mat, const char *strName)
    14. {
    15. int x, y;
    16. double fValue;
    17. printf("%s \n = \n", strName);
    18. for(y=0; y<mat->rows; y++)
    19. {
    20. for(x=0; x<mat->cols; x++)
    21. {
    22. fValue = cvGetReal2D(mat, y, x);
    23. printf("%4d ", cvRound(fValue));
    24. }
    25. printf("\n");
    26. }
    27. printf("\n\n");
    28. }

     

     

    lena.jpg 이미지의 cvRect(0, 0, 50, 50)의 영역을 불러 온것이다. 

    반응형