Sau khi dành cả ngày để chuyển đổi định dạng hình ảnh vui nhộn </sarcasm>
Tôi hiện có thể trả lời câu hỏi của riêng mình.
Matlab lưu trữ hình ảnh như 3 mảng chiều: chiều cao × rộng × màu
cửa hàng OpenCV hình ảnh như 2 mảng chiều: (màu × chiều rộng) × chiều cao
Bên cạnh đó, for best performance, OpenCV miếng hình ảnh với số không do đó các hàng luôn được căn chỉnh trên các khối 32 bit.
tôi đã thực hiện việc chuyển đổi trong 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);
Mã chuyển đổi này vào một IplImage là trong file 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);
}
Đây có thể là dễ dàng hơn để chỉ cần vượt qua tên tập tin đến MEX và để OpenCV chăm sóc tải hình ảnh từ tập tin ? –
http://mirone.googlecode.com/svn/tags/1.3.0/mex/cvcolor_mex.c – karlphillip
Có, sẽ dễ dàng hơn khi để OpenCV chăm sóc tải hình ảnh. Tuy nhiên, những gì tôi muốn đạt được là tạo một tệp MEX matlab sẽ thực hiện phát hiện điểm khóa SURF trên GPU bằng cách sử dụng lib này: http://www.mis.tu-darmstadt.de/surf lib yêu cầu IplImage làm đầu vào . Các tình huống sử dụng sẽ là ai đó thực hiện thao tác hình ảnh trong Matlab, sau đó chạy kết quả thông qua lib SURF, và vui vẻ sử dụng kết quả trong Matlab. –