Opencv 의 데이터 구조

4823 단어
opencv 의 기본 데이터 구조
구조
구성원
의의
CvPoint
int x,y
그림 의 점
CvPoint2D32f
float x,y
2 차원 공간의 점
CvPoint3D32f
float x,y,z
3 차원 공간의 점
CvSize
int width,height
그림 크기
CvRect
int x,y,width,height
그림 의 부분 영역
CvScalar
double val[4]
RGBA 값
Mat 데이터 구조
  • Mat 유형 은 계산 에 치중 하고 수학 성 이 높 으 며 openCV 는 Mat 유형 에 대한 계산 도 최적화 했다.한편, CvMat 와 IplImage 유형 은 '이미지' 에 중심 을 두 고 opencv 는 그 중의 이미지 조작 (크기 조정, 단일 채널 추출, 이미지 한도 값 조작 등) 을 최적화 시 켰 다.opencv 2.0 이전에 opencv 는 완전히 C 로 이 루어 졌 으 나, IplImage 유형 과 CvMat 유형의 관 계 는 대상 을 대상 으로 하 는 계승 관계 와 유사 하 다.실제로 CvMat 위 에 더욱 추상 적 인 기본 클래스 인 - CvArr 가 있 는데 이것 은 소스 코드 에서 흔히 볼 수 있다.
  • Mat 는 opencv 2.0 에서 내 놓 은 이미지 처리 의 새로운 데이터 구조 로 현재 cvMat 와 lplImage 를 대체 하 는 추세 이다. 이에 비해 Mat 의 가장 큰 장점 은 메모리 관 리 를 더욱 편리 하 게 할 수 있 고 프로그래머 가 수 동 으로 메모리 의 방출 을 관리 하지 않 아 도 된다 는 것 이다
  • .
  • IplImage, CvMat, Mat 의 관계 참고
  • Mat 의 구 조 는 하나의 유형 으로 그 자체 에 많은 함수, 구성원, 과부하 가 있 습 니 다.
    class CV_EXPORTS Mat
    {
    public:
        // ... a lot of methods ...
        ...
    
        /*! includes several bit-fields:
             - the magic signature
             - continuity flag
             - depth
             - number of channels
         */
        int flags;
        //! the array dimensionality, >= 2
        int dims;
        //! the number of rows and columns or (-1, -1) when the array has more than 2 dimensions
        int rows, cols;
        //! pointer to the data
        uchar* data;
    
        //! pointer to the reference counter;
        // when array points to user-allocated data, the pointer is NULL
        int* refcount;
    
        // other members
        ...
    };

    상기 구조 체 를 통 해 알 수 있 듯 이 Mat 도 하나의 매트릭스 헤드 로 두 개의 데이터 부분 으로 구성 된다. 매트릭스 헤드 (매트릭스 사이즈, 저장 방법, 저장 주소 등 정보 포함) 와 모든 픽 셀 값 을 저장 하 는 매트릭스 (선택 한 저장 방법 에 따라 매트릭스 가 서로 다른 차원 일 수 있 음) 를 가리 키 는 지침 이다.기본적으로 메모 리 를 할당 하지 않 고 메모리 만 가리 키 고 있 습 니 다. (읽 기와 쓰기 보호 에 주의 하 십시오.)그러나 행렬 자체 의 사 이 즈 는 이미지 에 따라 다 르 고 행렬 헤드 의 크기 보다 몇 개의 수량 급 이 크다.따라서 프로그램 에서 이미 지 를 전달 하고 복사 본 을 만 들 때 큰 비용 은 정보 헤더 가 아 닌 행렬 에 의 해 발생 한다.이 문 제 를 해결 하기 위해 OpenCV 는 인용 계수 체 제 를 사용한다.그 사고방식 은 모든 Mat 대상 에 게 자신의 정보 헤드 를 가지 게 하지만 같은 행렬 을 공유 하 게 하 는 것 이다.이것 은 행렬 포인터 가 같은 주 소 를 가리 키 도록 함으로써 이 루어 진다.복사 구조 함 수 는 정보 헤드 와 행렬 지침 만 복사 하고 행렬 을 복사 하지 않 습 니 다.
    초기 화 사용 create 함수 또는 Mat 그러나 가끔 은 행렬 자체 (정보 헤드 와 행렬 지침 뿐만 아니 라) 를 복사 하려 고 할 때 함수 clone()copyTo() 를 사용 할 수 있 습 니 다.
    /*CV_32FC2   :*/
    CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]
    

    예 초기 화
    Mat(nrows, ncols, type, fillValue); 
    M.create(nrows, ncols, type);
    
       :
    Mat M(7,7,CV_32FC2,Scalar(1,3)); /*      1+3j*/
    M.create(100, 60, CV_8UC(15)); /*  15    8bit   */
    
    /*  100*100*100 8   */
    int sz[] = {100, 100, 100}; 
    Mat bigCube(3, sz, CV_8U, Scalar:all(0));
    
    /*    */
    double m[3][3] = {{a, b, c}, {d, e, f}, {g, h, i}};
    Mat M = Mat(3, 3, CV_64F, m).inv();
    
    /*    */
    Mat img(Size(320,240),CV_8UC3); 
    Mat img(height, width, CV_8UC3, pixels, step); /*const unsigned char* pixels,int width, int height, int step*/
    
    /*         Mat*/
    IplImage* img = cvLoadImage("greatwave.jpg", 1);
    Mat mtx(img); // convert IplImage* -> Mat; /*     ,        */

    CvMat 의 구 조 는 하나의 데이터 구조 일 뿐 많은 실현 은 다른 함수 와 의 도움 을 받 아야 한다.
    typedef struct CvMat{
      int type;
      int step;
      int* refcount;
      union{
      uchar* ptr;
      short* s;
      int* i;
      float *f1;
      double* db;
      } data;
         union{
      int rows;
      int height;
      };
         union{
      int cols;
      int width;
      };
    }CvMat;

    행렬 의 생 성과 방출
    CvMat* cvCreateMat( int rows, int cols, int type );  //      
    CvMat* cvCreateMatHeader( int rows, int cols, int type ); //        ,     
    CvMat* cvInitMatHeader(CvMat* mat,int rows,int cols,int type,void* data = NULL,int step = CV_AUTOSTEP);//            
    CvMat cvMat(int rows,int cols,int type,void* data = NULL);//       ,     
    CvMat* cvCloneMat( const cvMat* mat );//    mat  
    void cvReleaseMat( CvMat** mat ); //    

    CvMat, Mat, IplImage 간 의 상호 전환
    IpIImage -> CvMat
    /*cvGetMat*/
    CvMat matheader;
    CvMat * mat = cvGetMat(img, &matheader);
    /*cvConvert*/
    CvMat * mat = cvCreateMat(img->height, img->width, CV_64FC3);
    cvConvert(img, mat)
    
    
    IplImage -> Mat
    Mat::Mat(const IplImage* img, bool copyData=false);/*default copyData=false,    IplImage    ,         */
      :
    IplImage* iplImg = cvLoadImage("greatwave.jpg", 1);
    Mat mtx(iplImg); /* IplImage * -> Mat,    ; or : Mat mtx = iplImg;*/
    
     
    
    Mat -> IplImage
    Mat M
    IplImage iplimage = M; /*      ,     */
    
    CvMat -> Mat
    Mat::Mat(const CvMat* m, bool copyData=false); /*  IplImage -> Mat,         */
    
    Mat -> CvMat
      (  Mat   imgMat      ):
    CvMat cvMat = imgMat;/*Mat -> CvMat,      IplImage,           

    좋은 웹페이지 즐겨찾기