2017-11-05 8 views
0

Für Computer Vision-Projekt, versuche ich D.Lowe paper(SIFT) zu implementieren. Ich bin dabei, das zu übersetzen (schaue das PPT-Bild) in Code. Können Sie mir bitte sagen, wie Sie Taylor-Erweiterung in Code anwenden (die Formel ist unten). Kennen Sie irgendwelche Funktionen in numpy, die ich verwenden kann, um diese D(x) zu berechnen? können Sie einen exclple-Code für D (x) in Python geben. zu finden unter C++ CodeWie Taylor Taylor Serie Erweiterung auf ein Bild in opencv?

Taylor series expansion

Video Credits

+1

Does diese Hilfe? http://firsttimeprogrammer.blogspot.co.uk/2015/03/taylor-series-with-python-and-sympy.html – pookie

+0

Oder dies: https://pythonhosted.org/algopy/examples/series_expansion.html – pookie

+0

@ pookie - der erste Link, den du erwähnt hast, benutzt für sin (x). Ich bin mir immer noch nicht sicher, wie ich das hier anwenden kann, da es "x = (x, y, sigma)" ist. Danke für diese Links, aber es hilft nicht viel. – irobo

Antwort

0

besser durch SIFT Taylor Expansion working out subpixel locations, später gehen Um zu verstehen, die tatsächliche Umsetzung von SIFT ist.

static void interp_step(IplImage*** dog_pyr, int octv, int intvl, int r, int c, 
      double* xi, double* xr, double* xc) 
{ 
    CvMat* dD, * H, * H_inv, X; 
    double x[3] = { 0 }; 

    dD = deriv_3D(dog_pyr, octv, intvl, r, c); 
    H = hessian_3D(dog_pyr, octv, intvl, r, c); 
    H_inv = cvCreateMat(3, 3, CV_64FC1); 
    cvInvert(H, H_inv, CV_SVD); 
    cvInitMatHeader(&X, 3, 1, CV_64FC1, x, CV_AUTOSTEP); 
    cvGEMM(H_inv, dD, -1, NULL, 0, &X, 0); 

    cvReleaseMat(&dD); 
    cvReleaseMat(&H); 
    cvReleaseMat(&H_inv); 

    *xi = x[2]; 
    *xr = x[1]; 
    *xc = x[0]; 
} 


static CvMat* hessian_3D(IplImage*** dog_pyr, int octv, int intvl, int r, 
       int c) 
{ 
    CvMat* H; 
    double v, dxx, dyy, dss, dxy, dxs, dys; 

    v = pixval32f(dog_pyr[octv][intvl], r, c); 
    dxx = (pixval32f(dog_pyr[octv][intvl], r, c+1) + 
     pixval32f(dog_pyr[octv][intvl], r, c-1) - 2 * v); 
    dyy = (pixval32f(dog_pyr[octv][intvl], r+1, c) + 
     pixval32f(dog_pyr[octv][intvl], r-1, c) - 2 * v); 
    dss = (pixval32f(dog_pyr[octv][intvl+1], r, c) + 
     pixval32f(dog_pyr[octv][intvl-1], r, c) - 2 * v); 
    dxy = (pixval32f(dog_pyr[octv][intvl], r+1, c+1) - 
     pixval32f(dog_pyr[octv][intvl], r+1, c-1) - 
     pixval32f(dog_pyr[octv][intvl], r-1, c+1) + 
     pixval32f(dog_pyr[octv][intvl], r-1, c-1))/4.0; 
    dxs = (pixval32f(dog_pyr[octv][intvl+1], r, c+1) - 
     pixval32f(dog_pyr[octv][intvl+1], r, c-1) - 
     pixval32f(dog_pyr[octv][intvl-1], r, c+1) + 
     pixval32f(dog_pyr[octv][intvl-1], r, c-1))/4.0; 
    dys = (pixval32f(dog_pyr[octv][intvl+1], r+1, c) - 
     pixval32f(dog_pyr[octv][intvl+1], r-1, c) - 
     pixval32f(dog_pyr[octv][intvl-1], r+1, c) + 
     pixval32f(dog_pyr[octv][intvl-1], r-1, c))/4.0; 

    H = cvCreateMat(3, 3, CV_64FC1); 
    cvmSet(H, 0, 0, dxx); 
    cvmSet(H, 0, 1, dxy); 
    cvmSet(H, 0, 2, dxs); 
    cvmSet(H, 1, 0, dxy); 
    cvmSet(H, 1, 1, dyy); 
    cvmSet(H, 1, 2, dys); 
    cvmSet(H, 2, 0, dxs); 
    cvmSet(H, 2, 1, dys); 
    cvmSet(H, 2, 2, dss); 

    return H; 
} 

Referenz: https://github.com/robwhess/opensift/blob/master/src/sift.c

Verwandte Themen