TLD在tldtracking中调用了lk。这个lk实际是lk.mexw64,Source文件是lk.cpp。
Matlab中的mex函数通过C编译器(如VS2013)对C source进行编译、链接,形成一个mex文件(64位机就是mexw64),这个mex文件可以被Matlab引擎调用。
1. 编译过程:
- mex -setup选择编译器
- mex filenames:比如mex yprime.c(这个是Matlab的Help中的例子,直接搜“mex”)。最终会形成一个yprime.mexw64,并可以在matlab中调用成功(调用时的传递参数只是两个input argument,后面会讲):
2. c source file格式
yprime.c的格式如下:
可以看出,这个c文件中有一个mexFunction,它就是Matlab调用C文件的参数传递接口函数,四个参数释义如下:
p指pointer,n指number,rhs指right hand side(输入参数),l指left hand side(输出参数)。
我们在调用yprime.mexw64时,传递的是两个输入参数,就是nrhs(T=1)和prhs(Y=1:4),而plhs是在yprime.c中定义的,直接作为调用的返回值。mexFunction的具体函数如下,可以看到,到最后才调用了yrime的函数,前面都是对输入参数处理:
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray*prhs[] )
{
double *yp;
double *t,*y;
size_t m,n;
/* Check for proper number of arguments */
if (nrhs != 2) {
mexErrMsgIdAndTxt( "MATLAB:yprime:invalidNumInputs",
"Two input arguments required.");
} else if (nlhs > 1) {
mexErrMsgIdAndTxt( "MATLAB:yprime:maxlhs",
"Too many output arguments.");
}
/* Check the dimensions of Y. Y can be 4 X 1 or 1 X 4. */
m = mxGetM(Y_IN);
n = mxGetN(Y_IN);
if (!mxIsDouble(Y_IN) || mxIsComplex(Y_IN) ||
(MAX(m,n) != 4) || (MIN(m,n) != 1)) {
mexErrMsgIdAndTxt( "MATLAB:yprime:invalidY",
"YPRIME requires that Y be a 4 x 1 vector.");
}
/* Create a matrix for the return argument */
YP_OUT = mxCreateDoubleMatrix( (mwSize)m, (mwSize)n, mxREAL);
/* Assign pointers to the various parameters */
yp = mxGetPr(YP_OUT);
t = mxGetPr(T_IN);
y = mxGetPr(Y_IN);
/* Do the actual computations in a subroutine */
yprime(yp,t,y);
return;
}