我正在用 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]
问题:
- 是否有将图像从文件加载到 Matlab 样式
[channel][width][height]
数据布局的 C++ 函数(可能来自库)?(它不必使用OpenCV。加载图像后,我还是使用原始指针。) - 是否有一个 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;
}