系统环境:
win10
matlab R2011a
vs2010(vs2010以前的版本应该也可以)
原始文件代码是在Linux、Mac系统上编写的,要在Windows系统上使用需要修改几个地方:
1,dt.cc 添加一句:#define int32_t int
2,features.cc & resize.cc中添加:
#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; }
3,resize.cc中: alphainfo ofs[len]; 这句改成:alphainfo *ofs = new alphainfo[len]; 当然在同一作用域后面加上:delete []ofs,参考Json_Nie贴出的代码,可以帮助我们准确放置delete [] ofs:
#include#include #include #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
4,compile.m中:
注释掉第10行的 mex -O fconvsse.cpp -o fconv
结尾加上 mex -O fconv.cc
mex -O resize.cc mex -O dt.cc mex -O features.cc mex -O getdetections.cc % use one of the following depending on your setup % 0 is fastest, 3 is slowest % 0) multithreaded convolution using SSE % mex -O fconvsse.cpp -o fconv % 1) multithreaded convolution using blas % WARNING: the blas version does not work with matlab >= 2010b % and Intel CPUs % mex -O fconvblasMT.cc -lmwblas -o fconv % 2) mulththreaded convolution without blas % mex -O fconvMT.cc -o fconv % 3) convolution using blas % mex -O fconvblas.cc -lmwblas -o fconv % 4) basic convolution, very compatible % mex -O fconv.cc -o fconv mex -O fconv.cc
5,将fconv.cc文件中:
void *process(void *thread_arg)
修改为(去掉指针符号*):
void process(void *thread_arg)
6,在matlab命令行中运行mex -setup选择编译器:
Select a compiler:
[1] Microsoft Visual C++ 2010 in d:VS20100
[0] None
Compiler: 1
如果没有vs2010会报错:
No supported SDK or compiler was found on this computer.
For a list of supported compilers, see
http://www.mathworks.com/support/compilers/R2011a/win64.html
??? Error using ==> mex at 208
Unable to complete successfully.
7,matlab命令行输入compile()编译一下
8,matlab命令行输入demo()
参考:
Win7+VS2010+Matlab2011b下运行Discriminatively Trained Deformable Part Models(4.01版)代码-运行demo()-详细步骤
在Windows下运行Felzenszwalb的Deformable Part Models(voc-release4.01)目标检测matlab源码



