2012-06-30 135 views
2

我通過Matlab使用OpenCV檢測視頻中的人臉,然後使用Matlab進行一些處理。目前,我在視頻的IplImage結構框架(通過cvQueryFrame查詢)面臨檢測。我將每個查詢的幀保存爲jpg,然後使用面部座標獲取所需處理的ROI。請參閱下面概述的代碼部分。在Matlab中將Iplimage轉換爲矩陣或陣列

% After reading in frame from video.. 
for i=1:size 
    img = calllib('highgui210','cvQueryFrame',cvCapture); 
    calllib('cxcore210','cvFlip',img,img,1); 
    calllib('highgui210', 'cvSaveImage', 'ThisFrame.jpg', img, ptr); 
% Rest of the processing comes here.. 

既然如此,感覺,應該有一個「的IplImage」圖像轉換爲在Matlab矩陣或陣列的更容易,更-粗方式。這有可能嗎?如果是的話,這是如何完成的?

在這個方向上的一些指針將不勝感激!

回答

2

嘗試mexing下面的代碼:

/* 
* Usage: 
* img = IplImage2mxArray(cvImgPtr, releaseFlag); 
*/ 
void mexFunction(int nout, mxArray* pout[], int nin, const mxArray* pin[]) { 
    if (nin != 2) 
     mexErrMsgTxt("wrong number of inputs"); 
    if (nout != 1) 
     mexErrMsgTxt("wrong number of outputs"); 
    IplImage* cvImg = (IplImage*)mxGetData(pin[0]); // get the pointer 
    // allocate the output 
    mwSize imgDims[3] = {cvImg->height, cvImg->width, cvImg->nChannels}; 
    pout[0] = mxCreateNumericArray(3, imgDims, mxDOUBLE_CLASS, mxREAL); 
    if (pout[0] == NULL) 
     mexErrMsgTxt("out of memeory"); 
    double* imgP = mxGetPr(pout[0]); 
    double divVal = pow(2.0, cvImg->depth) - 1; 
    double releaseFlag = mxGetScalar(pin[1]); 
    for (int x = 0 ; x < cvImg->width; x++) { 
     for (int y = 0 ; y < cvImg->height; y++) { 
      CvScalar s = cvGet2D(cvImg, y, x); 
      for (int c = 0; c < cvImg->nChannels; c++) { 
       imgP[ y + x * cvImg->height + c * cvImg->height * cvImg->width ] = s.val[c]/divVal; 
      } 
     } 
    } 
    if (releaseFlag != 0) { 
     cvReleaseImage(&cvImg); 
    } 
} 

你會用一個函數(MEX)IplImage2mxArray結束了,用它在Matlab:

>> cvImg = calllib('highgui210','cvQueryFrame',cvCapture); 
>> img = IplImage2mxArray(cvImg, false); % no cvReleaseImage after cvQueryFrame 

由於內部OpenCV的申述的渠道img可能會被置換(RGB的BGR未讀)。另請注意,img可能包含四個通道 - 一個額外的alpha通道。

-Shai