2

ビデオで顔を検出し、Matlab を使用して処理を行うために、Matlab 経由で OpenCV を使用しています。現時点では、ビデオの 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..

これが事実であるため、「IplImage」画像をMatlabの行列または配列に変換するためのより簡単で粗雑でない方法があるはずだと思います。これは可能性がありますか?はいの場合、これはどのように行われますか?

この方向へのいくつかの指針は大歓迎です!

4

1 に答える 1

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 インストレッド)。また、img には 4 つのチャネル (追加のアルファ チャネル) が含まれる場合があることにも注意してください。

-シャイ

于 2012-11-22T07:08:10.183 に答える