1

我正在用 C++ 做一些计算机视觉的东西,使用 JPG 图像。在 C++ 中,我从Piotr Dollar 的 Toolbox调用计算机视觉函数,这些函数最初是为与 Matlab 兼容而设计的。我试图弄清楚如何从 C++ 文件中快速加载图像,并将它们排列在 Matlab 样式的数据布局中。


Matlab 风格的数据布局
由于Piotr 的工具箱旨在很好地处理 Matlab MEX 文件,因此 Piotr 通常在他的 C++ 函数中使用这种图像数据布局:

image = imread('img.jpg') //in Matlab

//flattened array notation:
image[x*width+ y + channel*width*height]

//unflattened C++ array notation:
image[channel][x][y] //typically: 3-channel color images

C++ 风格的数据布局 C++
的大多数图像文件 I/O 库(例如 OpenCV imread)在从文件加载 JPG 图像时提供这种数据布局:

Mat image = cv::imread("img.jpg") //in C++ with OpenCV

//flattened array notation:
image.data[x*nChannels + y*width*d + channel]

//unflattened C++ array notation:
image.data[y][x][channel]

问题:

  1. 是否有将图像从文件加载到 Matlab 样式[channel][width][height]数据布局的 C++ 函数(可能来自库)?(它不必使用OpenCV。加载图像后,我还是使用原始指针。)
  2. 是否有一个 C++ 函数可以快速将 C++ 样式的布局转换为 Matlab 样式的布局?我编写了一个简单的转置函数,但它很慢:


//this implementation also converts char* to float*, but that's not too important for this question
float* transpose_opencv_to_matlab(Mat img){
    assert(img.type() == CV_8UC3);
    int h = img.rows; //height
    int w = img.cols; //width
    int d = 3; //nChannels
    float multiplier = 1 / 255.0f; //rescale pixels to range [0 to 1]

    uchar* img_data = &img.data[0];
    float* I = (float*)malloc(h * w * d * sizeof(float)); //img transposed to Matlab data layout. 
    for(int y=0; y<h; y++){
        for(int x=0; x<w; x++){
            for(int ch=0; ch<d; ch++){
                I[x*h + y + ch*w*h] = img_data[x*d + y*w*d + ch] * multiplier; 
            }
        }
    }
    return I;
}
4

1 回答 1

0

MatlabOpenCV实用程序包含在 Matlab 格式和 OpenCV 格式之间进行转换的函数。它在使用 OpenCV 的 MEX 代码中运行良好。

例如,从 Matlab 转换为 OpenCV 非常简单

IplImage* iplImg = mxArr_to_new_IplImage(argin[0]);
cv::Mat matImg(iplImg , false);
...
cvReleaseImage(&iplImg);

要将 OpenCV 转换为 Matlab,您可以使用(未​​经测试):

Mat img = cv::imread("img.jpg");
IplImage ipl_image = img;
mxArray* matlab_fmt_image = IplImage_to_new_mxArr (&img);

我遇到的唯一问题(可能在最新版本中不存在)是 MatlabOpenCV 仅支持 OpenCV 的旧版(IplImage/CvMat)接口,并且从 Visual Studio 2010 过渡到 VS2012 时存在一些兼容性问题。

于 2013-09-24T00:35:22.400 回答