Discriminatively Trained Deformable Part Models的官网:http://www.cs.brown.edu/~pff/latent/
目前做目标检测最好的一个算法。
搞不懂为什么外国人老喜欢在linux下编代码,也许是因为版权的问题吧。
装了虚拟机在ubuntu下跑通了程序,但........你懂得(虚拟机能让你机子卡死)。
于是着手移植到windows下。
参考了pozen同学的博客:http://blog.csdn.net/pozen/article/details/7023742
启发很大,下面说说自己的调试过程:
1、把用到的文件dt.cc resize.cc fconv.cc features.cc的后缀都修改为cpp
2、dt.cpp中加:#define int32_t int
3、features.cpp、resize.cpp、fconv.cpp中加入
#define bzero(a, b) memset(a, 0, b) int round(float a) { float tmp = a - (int)a; if( tmp >= 0.5 ) return (int)a + 1; else return (int)a; }
4、resize.cpp中的alphainfo ofs[len] 换成:alphainfo *ofs = new alphainfo[len] 当然要记得释放这个内存,但要注意放得位置。
之后就可以在matlab中运行compile进行编译了,这时会出现一些重定义的错误,应该是vc6.0对c++的一些不兼容,修改下就可以了。
5、输入demo()。查看结果。
调试过程中如何调试c程序参见前一篇文章。
说下自己的编译环境:vs2008&matlab2008b
贴出resize.cpp源代码(调试中因为内存错误折腾了很久)
#include <math.h> #include <assert.h> #include <string.h> #include "mex.h" #define bzero(a, b) memset(a, 0, b) int round(float a) { float tmp = a - (int)a; if( tmp >= 0.5 ) return (int)a + 1; else return (int)a; } // struct used for caching interpolation values struct alphainfo { int si, di; double alpha; }; // copy src into dst using interpolation values void alphacopy(double *src, double *dst, struct alphainfo *ofs, int n) { struct alphainfo *end = ofs + n; while (ofs != end) { dst[ofs->di] += ofs->alpha * src[ofs->si]; ofs++; } } // resize along each column // result is transposed, so we can apply it twice for a complete resize void resize1dtran(double *src, int sheight, double *dst, int dheight, int width, int chan) { double scale = (double)dheight/(double)sheight; double invscale = (double)sheight/(double)dheight; // we cache the interpolation values since they can be // shared among different columns int len = (int)ceil(dheight*invscale) + 2*dheight; //alphainfo ofs[len]; alphainfo *ofs = new alphainfo[len]; int k = 0; for (int dy = 0; dy < dheight; dy++) { double fsy1 = dy * invscale; double fsy2 = fsy1 + invscale; int sy1 = (int)ceil(fsy1); int sy2 = (int)floor(fsy2); if (sy1 - fsy1 > 1e-3) { assert(k < len); assert(sy1-1 >= 0); ofs[k].di = dy*width; ofs[k].si = sy1-1; ofs[k++].alpha = (sy1 - fsy1) * scale; } for (int sy = sy1; sy < sy2; sy++) { assert(k < len); assert(sy < sheight); ofs[k].di = dy*width; ofs[k].si = sy; ofs[k++].alpha = scale; } if (fsy2 - sy2 > 1e-3) { assert(k < len); assert(sy2 < sheight); ofs[k].di = dy*width; ofs[k].si = sy2; ofs[k++].alpha = (fsy2 - sy2) * scale; } } // delete [] ofs; // resize each column of each color channel bzero(dst, chan*width*dheight*sizeof(double)); for (int c = 0; c < chan; c++) { for (int x = 0; x < width; x++) { double *s = src + c*width*sheight + x*sheight; double *d = dst + c*width*dheight + x; alphacopy(s, d, ofs, k); } } delete [] ofs; } // main function // takes a double color image and a scaling factor // returns resized image mxArray *resize(const mxArray *mxsrc, const mxArray *mxscale) { double *src = (double *)mxGetPr(mxsrc); const int *sdims = (int*)mxGetDimensions(mxsrc); if (mxGetNumberOfDimensions(mxsrc) != 3 || mxGetClassID(mxsrc) != mxDOUBLE_CLASS) mexErrMsgTxt("Invalid input"); double scale = mxGetScalar(mxscale); if (scale > 1) mexErrMsgTxt("Invalid scaling factor"); int ddims[3]; ddims[0] = (int)round(sdims[0]*scale); ddims[1] = (int)round(sdims[1]*scale); ddims[2] = sdims[2]; mxArray *mxdst = mxCreateNumericArray(3, (mwSize*)ddims, mxDOUBLE_CLASS, mxREAL); double *dst = (double *)mxGetPr(mxdst); double *tmp = (double *)mxCalloc(ddims[0]*sdims[1]*sdims[2], sizeof(double)); resize1dtran(src, sdims[0], tmp, ddims[0], sdims[1], sdims[2]); resize1dtran(tmp, sdims[1], dst, ddims[1], ddims[0], sdims[2]); mxFree(tmp); return mxdst; } // matlab entry point // dst = resize(src, scale) // image should be color with double values void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { if (nrhs != 2) mexErrMsgTxt("Wrong number of inputs"); if (nlhs != 1) mexErrMsgTxt("Wrong number of outputs"); plhs[0] = resize(prhs[0], prhs[1]); }