1. 程式人生 > >OpenCV中IplImage, CvMat, Mat 基本使用和元素遍歷

OpenCV中IplImage, CvMat, Mat 基本使用和元素遍歷

/*間接訪問*/
/*訪問CV_32F1和CV_64FC1*/
cvmSet( CvMat* mat, int row, int col, double value);
cvmGet( const CvMat* mat, int row, int col );

/*訪問多通道或者其他資料型別: scalar的大小為影象的通道值*/
CvScalar cvGet2D(const CvArr * arr, int idx0, int idx1); //CvArr只作為函式的形參void cvSet2D(CvArr* arr, int idx0, int idx1, CvScalar value);


/*直接訪問: 取決於陣列的資料型別*/
/*CV_32FC1*/
CvMat * cvmat = cvCreateMat(4, 4, CV_32FC1);
cvmat->data.fl[row * cvmat->cols + col] = (float)3.0;

/*CV_64FC1*/
CvMat * cvmat = cvCreateMat(4, 4, CV_64FC1);
cvmat->data.db[row * cvmat->cols + col] = 3.0;

/*一般對於單通道*/
CvMat * cvmat = cvCreateMat(4, 4, CV_64FC1);
CV_MAT_ELEM(*cvmat, double, row, col) = 3.0; /*double是根據陣列的資料型別傳入,這個巨集不能處理多通道*/

/*一般對於多通道*/
if (CV_MAT_DEPTH(cvmat->type) == CV_32F)
    CV_MAT_ELEM_CN(*cvmat, float, row, col * CV_MAT_CN(cvmat->type) + ch) = (float)3.0; // ch為通道值
if (CV_MAT_DEPTH(cvmat->type) == CV_64F)
    CV_MAT_ELEM_CN(*cvmat, double, row, col * CV_MAT_CN(cvmat->type) + ch) = 3.0; // ch為通道值


/*多通道陣列*/
/*3通道*/
for (int row = 0; row < cvmat->rows; row++)
{    
    p = cvmat ->data.fl + row * (cvmat->step / 4);
    for (int col = 0; col < cvmat->cols; col++)   
    {       
         *p = (float) row + col;       
         *(p+1) = (float)row + col + 1;       
         *(p+2) = (float)row + col + 2;       
         p += 3;    
    }
}
/*2通道*/
CvMat * vector = cvCreateMat(1,3, CV_32SC2);CV_MAT_ELEM(*vector, CvPoint, 0, 0) = cvPoint(100,100);
/*4通道*/
CvMat * vector = cvCreateMat(1,3, CV_64FC4);CV_MAT_ELEM(*vector, CvScalar, 0, 0) = CvScalar(0, 0, 0, 0);
  • Mat
   Mat是opencv2.0推出的處理影象的新的資料結構,現在越來越有趨勢取代之前的cvMat和lplImage,相比之下Mat最大的好處就是能夠更加方便的進行記憶體管理,不再需要程式設計師手動管理記憶體的釋放。opencv2.3中提到Mat是一個多維的密集資料陣列,可以用來處理向量和矩陣、影象、直方圖等等常見的多維資料。