arrays - 在Matlab中将Iplimage转换为矩阵或数组

标签 arrays matlab opencv matrix iplimage

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

在这个方向上的一些指示将不胜感激!

最佳答案

尝试混合以下代码:

/*
 * 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 的 channel 可能会被排列(BGR 而不是 RGB)。另请注意,img 可能包含四个 channel - 一个附加的 Alpha channel 。

-谢

关于arrays - 在Matlab中将Iplimage转换为矩阵或数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11273839/

相关文章:

c++ - 多线程代码中缓存友好的数组迭代模式

javascript - 如何搜索和替换对象文字数组中的值

matlab - 如何在 MATLAB 中显式制作数组的深层复制?

java.lang.UnsatisfiedLinkError : org. opencv.imgcodecs.Imgcodecs.imread_0(Ljava/lang/String;I)J

javascript - 2D 数组未转换为 D3 map 坐标

c++ - 使用整数文字初始化 char 数组和 char 的区别

matlab - ODE45 和 Runge-Kutta 方法的绝对误差与解析解的比较

c++ - Matlab 的 imtransform 的 C/C++ 等效项?

python - Otsu 阈值 OpenCV Python

opencv - 如何使用 OpenCV 水平或垂直拉伸(stretch)图像