我通过Matlab使用OpenCV来检测视频中的面部,然后使用Matlab进行一些处理。目前,我对视频的IplImage结构化帧(由cvQueryFrame查询)进行了检测。我将每个查询的帧保存为jpg,然后使用面部坐标获得所需处理的ROI。请参阅下面概述的代码部分。
% 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..
在这种情况下,我觉得在Matlab中将'IplImage'图像转换为矩阵或数组应该有一种更简单,更简洁的方法。这有可能吗?如果是的话,这是怎么做到的?
非常感谢这方面的一些指示!
答案 0 :(得分:2)
请尝试使用以下代码:
/*
* 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 instread)。另请注意,img可能包含四个通道 - 另一个Alpha通道。
-Shai