【问题标题】:Converting Iplimage to a matrix or an array in Matlab在 Matlab 中将 Iplimage 转换为矩阵或数组
【发布时间】:2012-07-01 16:43:07
【问题描述】:

我通过 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”图像转换为矩阵或数组。这是一种可能吗?如果是,这是如何完成的?

我们将不胜感激!

【问题讨论】:

    标签: arrays matlab opencv matrix iplimage


    【解决方案1】:

    尝试混合以下代码:

    /*
     * 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 通道。

    -夏

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      相关资源
      最近更新 更多