// [Gx,Gy] = grad2(I) - see gradient2.m void mGrad2( int nl, mxArray *pl[], int nr, const mxArray *pr[] ) { int h, w, d; float *I, *Gx, *Gy; checkArgs(nl,pl,nr,pr,1,2,1,1,&h,&w,&d,mxSINGLE_CLASS,(void**)&I); if(h<2 || w<2) mexErrMsgTxt("I must be at least 2x2."); pl[0]= mxCreateMatrix3( h, w, d, mxSINGLE_CLASS, 0, (void**) &Gx ); pl[1]= mxCreateMatrix3( h, w, d, mxSINGLE_CLASS, 0, (void**) &Gy ); grad2( I, Gx, Gy, h, w, d ); }
// [M,O] = gradMag( I, channel, full ) - see gradientMag.m void mGradMag( int nl, mxArray *pl[], int nr, const mxArray *pr[] ) { int h, w, d, c, full; float *I, *M, *O=0; checkArgs(nl,pl,nr,pr,1,2,3,3,&h,&w,&d,mxSINGLE_CLASS,(void**)&I); if(h<2 || w<2) mexErrMsgTxt("I must be at least 2x2."); c = (int) mxGetScalar(pr[1]); full = (int) mxGetScalar(pr[2]); if( c>0 && c<=d ) { I += h*w*(c-1); d=1; } pl[0] = mxCreateMatrix3(h,w,1,mxSINGLE_CLASS,0,(void**)&M); if(nl>=2) pl[1] = mxCreateMatrix3(h,w,1,mxSINGLE_CLASS,0,(void**)&O); gradMag(I, M, O, h, w, d, full>0 ); }
// H=gradHist(M,O,[...]) - see gradientHist.m void mGradHist( int nl, mxArray *pl[], int nr, const mxArray *pr[] ) { int h, w, d, hb, wb, nChns, binSize, nOrients, softBin, useHog; bool full; float *M, *O, *H, clipHog; checkArgs(nl,pl,nr,pr,1,3,2,8,&h,&w,&d,mxSINGLE_CLASS,(void**)&M); O = (float*) mxGetPr(pr[1]); if( mxGetM(pr[1])!=h || mxGetN(pr[1])!=w || d!=1 || mxGetClassID(pr[1])!=mxSINGLE_CLASS ) mexErrMsgTxt("M or O is bad."); binSize = (nr>=3) ? (int) mxGetScalar(pr[2]) : 8; nOrients = (nr>=4) ? (int) mxGetScalar(pr[3]) : 9; softBin = (nr>=5) ? (int) mxGetScalar(pr[4]) : 1; useHog = (nr>=6) ? (int) mxGetScalar(pr[5]) : 0; clipHog = (nr>=7) ? (float) mxGetScalar(pr[6]) : 0.2f; full = (nr>=8) ? (bool) (mxGetScalar(pr[7])>0) : false; hb = h/binSize; wb = w/binSize; nChns = useHog== 0 ? nOrients : (useHog==1 ? nOrients*4 : nOrients*3+5); pl[0] = mxCreateMatrix3(hb,wb,nChns,mxSINGLE_CLASS,1,(void**)&H); if( nOrients==0 ) return; if( useHog==0 ) { gradHist( M, O, H, h, w, binSize, nOrients, softBin, full ); } else if(useHog==1) { hog( M, O, H, h, w, binSize, nOrients, softBin, full, clipHog ); } else { fhog( M, O, H, h, w, binSize, nOrients, softBin, clipHog ); } }
// H=gradHist(M,O,[bin],[nOrients],[softBin],[useHog],[clip])-see gradientHist.m void mGradHist( int nl, mxArray *pl[], int nr, const mxArray *pr[] ) { int h, w, d, hb, wb, bin, nOrients; bool softBin, useHog; float *M, *O, *H, *G, clip; checkArgs(nl,pl,nr,pr,1,3,2,7,&h,&w,&d,mxSINGLE_CLASS,(void**)&M); O = (float*) mxGetPr(pr[1]); if( mxGetM(pr[1])!=h || mxGetN(pr[1])!=w || d!=1 || mxGetClassID(pr[1])!=mxSINGLE_CLASS ) mexErrMsgTxt("M or O is bad."); bin = (nr>=3) ? (int) mxGetScalar(pr[2]) : 8; nOrients = (nr>=4) ? (int) mxGetScalar(pr[3]) : 9; softBin = (nr>=5) ? (bool) (mxGetScalar(pr[4])>0) : true; useHog = (nr>=6) ? (bool) (mxGetScalar(pr[5])>0) : false; clip = (nr>=7) ? (float) mxGetScalar(pr[6]) : 0.2f; hb=h/bin; wb=w/bin; if( useHog==false ) { pl[0] = mxCreateMatrix3(hb,wb,nOrients,mxSINGLE_CLASS,1,(void**)&H); gradHist( M, O, H, h, w, bin, nOrients, softBin ); } else { pl[0] = mxCreateMatrix3(hb,wb,nOrients*4,mxSINGLE_CLASS,1,(void**)&G); H = (float*) mxCalloc(wb*hb*nOrients,sizeof(float)); gradHist( M, O, H, h, w, bin, nOrients, softBin ); hog( H, G, h, w, bin, nOrients, clip ); mxFree(H); } }
/* H = hog( I, [sBin], [oBin] ) - see hog.m */ void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { int h, w, d, hb, wb, nb, hb1, wb1, sBin, oBin; double *I, *M, *H, *HG; float *O; checkArgs(nlhs,plhs,nrhs,prhs,1,1,1,3,&h,&w,&d,&I); sBin = (nrhs>=2) ? (int) mxGetScalar(prhs[1]) : 8; oBin = (nrhs>=3) ? (int) mxGetScalar(prhs[2]) : 9; hb=h/sBin; wb=w/sBin; nb=wb*hb; hb1=hb>2?hb-2:0; wb1=wb>2?wb-2:0; plhs[0] = mxCreateMatrix3( hb1, wb1, oBin*4, mxDOUBLE_CLASS, 0, (void**) &HG); if( hb1==0 || wb1==0 ) return; M = (double*) mxMalloc(h*w*sizeof(double)); O = (float*) mxMalloc(h*w*sizeof(float)); H = (double*) mxCalloc(nb*oBin, sizeof(double)); gradMag( I, M, O, h, w, d ); gradHist( M, O, H, h, w, d, sBin, oBin, true, true ); hog( H, HG, h, w, d, sBin, oBin ); mxFree(M); mxFree(O); mxFree(H); }