OpenCV function
void undistort(const Mat& src, Mat& dst, const Mat& cameraMatrix, const Mat& distCoeffs, const Mat& newCameraMatrix=Mat())
Matlab
dst=mexUndistort(src,cameraMatrix,distCoeffs)
MEX function source
#include "mex.h" #include "matcv.h" void mexFunction(int nlhs, mxArray *plhs[],int nrhs, mxArray *prhs[]) { if(nrhs!=3) { mexErrMsgTxt("Need exactly 3 inputs src, cameraMatrix, and distCoeffs.n"); } cv::Mat Inputs[3]; cv::Mat Output; for(int i=0;i<nrhs;i++) { Inputs[i]=Converter(prhs[i]); } cv::undistort(Inputs[0],Output,Inputs[1],Inputs[2]); plhs[0]=Converter(Output); return; }
To compile you need opencv and boost. Mex command I used with Matlab R2011a and VC9 goes like this:
mex mexUndistort.cpp matcv.cpp -IC:OpenCV2.3buildinclude -ID:NinadToolsboost_1_47_0 -LC:OpenCV2.3buildx64vc9lib -lopencv_core230 -lopencv_imgproc230 -v COMPFLAGS=”/c /Zp8 /GR /W3 /EHs /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /DMATLAB_MEX_FILE /nologo /MD”