花了一天時間做有趣的圖像格式轉換</sarcasm>
我現在可以回答我自己的問題。
Matlab的存儲圖像作爲3個維數組:高度×寬度×顏色
OpenCV的存儲圖像作爲2個維陣列:(顏色×寬度)×高度
此外,爲獲得最佳性能,OpenCV的墊用零圖像所以行總是在32位塊上對齊。
我已經做了轉換在Matlab:
function [cv_img, dim, depth, width_step] = convert_to_cv(img)
% Exchange rows and columns (handles 3D cases as well)
img2 = permute(img(:,end:-1:1,:), [2 1 3]);
dim = [size(img2,1), size(img2,2)];
% Convert double precision to single precision if necessary
if(isa(img2, 'double'))
img2 = single(img2);
end
% Determine image depth
if(ndims(img2) == 3 && size(img2,3) == 3)
depth = 3;
else
depth = 1;
end
% Handle color images
if(depth == 3)
% Switch from RGB to BGR
img2(:,:,[3 2 1]) = img2;
% Interleave the colors
img2 = reshape(permute(img2, [3 1 2]), [size(img2,1)*size(img2,3) size(img2,2)]);
end
% Pad the image
width_step = size(img2,1) + mod(size(img2,1), 4);
img3 = uint8(zeros(width_step, size(img2,2)));
img3(1:size(img2,1), 1:size(img2,2)) = img2;
cv_img = img3;
% Output to openCV
cv_display(cv_img, dim, depth, width_step);
轉換成IplImage的這個過程的代碼在MEX文件:
#include "mex.h"
#include "cv.h"
#include "highgui.h"
#define IN_IMAGE prhs[0]
#define IN_DIMENSIONS prhs[1]
#define IN_DEPTH prhs[2]
#define IN_WIDTH_STEP prhs[3]
void mexFunction(int nlhs, mxArray **plhs, int nrhs, const mxArray **prhs) {
bool intInput = true;
if(nrhs != 4)
mexErrMsgTxt("Usage: cv_disp(image, dimensions, depth, width_step)");
if(mxIsUint8(IN_IMAGE))
intInput = true;
else if(mxIsSingle(IN_IMAGE))
intInput = false;
else
mexErrMsgTxt("Input should be a matrix of uint8 or single precision floats.");
if(mxGetNumberOfElements(IN_DIMENSIONS) != 2)
mexErrMsgTxt("Dimension vector should contain two elements: [width, height].");
char *matlabImage = (char *)mxGetData(IN_IMAGE);
double *imgSize = mxGetPr(IN_DIMENSIONS);
size_t width = (size_t) imgSize[0];
size_t height = (size_t) imgSize[1];
size_t depth = (size_t) *mxGetPr(IN_DEPTH);
size_t widthStep = (size_t) *mxGetPr(IN_WIDTH_STEP) * (intInput ? sizeof(unsigned char):sizeof(float));
CvSize size;
size.height = height;
size.width = width;
IplImage *iplImage = cvCreateImageHeader(size, intInput ? IPL_DEPTH_8U:IPL_DEPTH_32F, depth);
iplImage->imageData = matlabImage;
iplImage->widthStep = widthStep;
iplImage->imageDataOrigin = iplImage->imageData;
/* Show the openCV image */
cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE);
cvShowImage("mainWin", iplImage);
}
這可能是更容易的文件名只傳遞給MEX,讓OpenCV的採取從文件加載圖像的護理? – 2010-10-13 10:21:58
http://mirone.googlecode.com/svn/tags/1.3.0/mex/cvcolor_mex.c – karlphillip 2010-10-13 14:00:29
是的,讓OpenCV負責加載圖像會更容易。然而,我想要實現的是創建一個matlab MEX文件,該文件將使用此lib在GPU上執行SURF關鍵點檢測: http://www.mis.tu-darmstadt.de/surf 該庫需要一個IplImage作爲輸入。 使用場景將有人在Matlab中進行圖像處理,然後通過SURF庫運行結果,並在Matlab中高興地使用結果。 – 2010-10-13 17:05:24