cv::Mat 사용법


//Mat 테스트 -기본 연산
int MatTest()
{
    // 생성
    int cols = 3, rows=4;
    int type = CV_64F;//CV_8UC=UCHAR 형, CV_64F=double 형
    
    Mat mtColor = Mat( rows, cols, CV_8UC3, Scalar(0,0,0));//컬러 이미지, 순서주의! (세로, 가로)
    Mat mtGray = Mat( rows, cols, CV_8UC1, Scalar(0));//그레이 이미지
            
    Mat_<float> state(4, 1); //Mat_ 는 Mat의 Lite 버전
    Mat state2(3, 4, CV_32F);//선언만
    //생성과 동시에 각각 초기화
    Mat stat3 = *(Mat_<float>(4, 4) << 1,0,0,0,   0,1,0,0,  0,0,1,0,  0,0,0,1);//구체적으로 초기화
    
    //초기화
    mtGray.setTo(Scalar(0));//전체값을 0으로 만듬    
    setIdentity(mtGray);//단위행렬로 초기화    
    setIdentity(mtGray, Scalar::all(3));//단위 행렬 값 지정
        
    //재 생성, 구조 바뀜
    mtGray =  Mat::zeros(1,2, CV_8U);// 전부 0으로 초기화
    mtGray =  Mat::ones(2,1, CV_8U);// 전부 1로 초기화
    mtGray =  Mat::eye(3,3, CV_8U);// 단위 행렬로 초기화    
    //mtGray.zeros(1,2, CV_8U);MatPrint(&mtGray);// 리턴값이 'MatExpr'인 함수는 이런 방식은 효과 없음
    

    //크기 변환, 내용 불변
    Mat mtGray2;
    resize(mtGray, mtGray, Size(2,3));
    resize(mtGray, mtGray2, Size(4,7));MatPrint(&mtGray2);
    //Mat mtGray3 = mtGray.reshape ( 0, 2 );MatPrint(&mtGray);MatPrint(&mtGray2);
    //reshape(), create()등은 기존값을 살릴수 없으므로 새로 생성하는 게 좋다

    //각각 지정 방법
    //좌표로 지정
    mtGray.at<byte>(0,0) = 0;//각각 지정

    //전체 순서로 지정
    mtGray.at<UCHAR>(0) = 1;    mtGray.at<UCHAR>(1) = 2;    
    mtGray.at<UCHAR>(2) = 3;    mtGray.at<UCHAR>(3) = 4;

    //mtGray.reshape(1,3);MatPrint(&mtGray);
    //역행렬 구하기, 부동소수점에서만 된다    
    double m[3][3] = {{1,2,1}, {0,1,1}, {1,0,0}};
    Mat mtInv = Mat(3, 3, CV_64F, m).inv();

    return 1;
}


//=========

//Mat 출력
CString MatPrint(Mat *_pmt, int nType, bool bDisplay)
{
    CString str, temp;
    str.Format(_T("(%d,%d)\n"), _pmt->cols, _pmt->rows);
    for(int r=0; r<_pmt->rows ; r++){
        for(int c=0; c<_pmt->cols ; c++){
            if( c==5){
                temp.Format(_T(" ...")); str += temp; break;
            }
            switch( nType){
            case CV_8U:    temp.Format(_T("%d , "), _pmt->at<UCHAR>(r,c) ); str += temp; break;
            case CV_32F:    temp.Format(_T("%.2f , "), _pmt->at<float>(r,c) ); str += temp; break;
            case CV_64F:    temp.Format(_T("%.2f , "), _pmt->at<double>(r,c) ); str += temp; break;
            }
            //_pmt->at( ->cols
        }
        str += _T("\n");
    }

    if( bDisplay ) _DbgStr(str);

    return str;
}


반응형
Posted by codens