[37] | 1 | /* |
---|
| 2 | patch_match.c implements ... |
---|
| 3 | |
---|
| 4 | use a modified 2d version of the birchfield and tomasi algorithm |
---|
| 5 | |
---|
| 6 | needs as input |
---|
| 7 | |
---|
| 8 | in right image we take three images: |
---|
| 9 | |
---|
| 10 | max round pixel |
---|
| 11 | min round pixel |
---|
| 12 | pixel |
---|
| 13 | |
---|
| 14 | and left image |
---|
| 15 | |
---|
| 16 | plus x,y location in each image |
---|
| 17 | plus half_size |
---|
| 18 | |
---|
| 19 | 2001 written by Phil Torr |
---|
| 20 | Microsoft Research Cambridge |
---|
| 21 | */ |
---|
| 22 | |
---|
| 23 | //if correlation exceeds jump out then stop |
---|
| 24 | #include <math.h> |
---|
| 25 | #include <stdio.h> |
---|
| 26 | #include "mex.h" |
---|
| 27 | |
---|
| 28 | void mexFunction ( |
---|
| 29 | int nlhs, /* number of expected outputs */ |
---|
| 30 | mxArray **plhs, /* matrix pointer array returning outputs */ |
---|
| 31 | int nrhs, /* number of inputs */ |
---|
| 32 | const mxArray **prhs /* matrix pointer array for inputs */ |
---|
| 33 | ) { |
---|
| 34 | int width, height, i, j, l, k, border =1; |
---|
| 35 | double *out, *im1, *im2, *max_im2, *min_im2; |
---|
| 36 | bool is_max; |
---|
| 37 | int x1,y1,x2,y2,x1i,y1i,x2i,y2i,half_size,jump_out; |
---|
| 38 | double corr = 0.0; |
---|
| 39 | double imax, imin; |
---|
| 40 | |
---|
| 41 | /* parameter checks */ |
---|
| 42 | if ((nrhs < 8) || (nlhs != 1)) { |
---|
| 43 | mexErrMsgTxt ("Usage: Y = birch_match(im1,im2,max_im2,min_im2,x1,y1,x2,y2,half_size,jump_out)\n\n"); |
---|
| 44 | return; |
---|
| 45 | } |
---|
| 46 | |
---|
| 47 | |
---|
| 48 | //not any checking here yet!!!! |
---|
| 49 | |
---|
| 50 | /* reading the parameters */ |
---|
| 51 | height = mxGetM (prhs [0]); |
---|
| 52 | width = mxGetN (prhs [0]); |
---|
| 53 | im1 = (double *) mxGetPr (prhs [0]); |
---|
| 54 | im2 = (double *) mxGetPr (prhs [1]); |
---|
| 55 | max_im2 = (double *) mxGetPr (prhs [2]); |
---|
| 56 | min_im2 = (double *) mxGetPr (prhs [3]); |
---|
| 57 | x1 = (int)(mxGetScalar(prhs[4]))-1; |
---|
| 58 | y1 = (int)(mxGetScalar(prhs[5]))-1; |
---|
| 59 | x2 = (int)(mxGetScalar(prhs[6]))-1; |
---|
| 60 | y2 = (int)(mxGetScalar(prhs[7]))-1; |
---|
| 61 | half_size = (int)(mxGetScalar(prhs[8])); |
---|
| 62 | jump_out = (double)(mxGetScalar(prhs[9])); |
---|
| 63 | |
---|
| 64 | // printf("x1 y1 x2 y2 %d %d %d %d\n",x1,y1 ,x2,y2); |
---|
| 65 | |
---|
| 66 | //out = mxGetScalar(plhs [0]); |
---|
| 67 | |
---|
| 68 | /* require memory for return */ |
---|
| 69 | plhs [0] = mxCreateDoubleMatrix (1, 1, mxREAL); |
---|
| 70 | out = (double *) mxGetPr (plhs [0]); |
---|
| 71 | |
---|
| 72 | |
---|
| 73 | // do correlation over a patch |
---|
| 74 | for (i = -half_size; i <= half_size; i++) |
---|
| 75 | { |
---|
| 76 | for (j = -half_size; j <= half_size; j++) |
---|
| 77 | { |
---|
| 78 | x1i = x1 + i; |
---|
| 79 | x2i = x2 + i; |
---|
| 80 | |
---|
| 81 | y1i = y1 + j; |
---|
| 82 | y2i = y2 + j; |
---|
| 83 | |
---|
| 84 | imax = im1 [y1i * height + x1i]- max_im2 [y2i * height + x2i]; |
---|
| 85 | imin = min_im2 [y2i * height + x2i]- im1 [y1i * height + x1i]; |
---|
| 86 | imax = max(imax,imin); |
---|
| 87 | corr += max(imax,0.0) * max(imax,0.0); |
---|
| 88 | |
---|
| 89 | |
---|
| 90 | // corr += fabs(im1 [y1i * height + x1i]- im2 [y2i * height + x2i]); |
---|
| 91 | // printf("im1 i j x1i y1i %d %d %d %d %lf \n", i,j,x1i,y1i,im1 [x1i * height + y1i]); |
---|
| 92 | // printf("im2 i j x2i y2i %d %d %d %d %lf \n", i,j,x2i,y2i,im2 [x2i * height + y2i]); |
---|
| 93 | // printf("corr i j %d %d %lf \n", i,j,corr); |
---|
| 94 | |
---|
| 95 | } |
---|
| 96 | /* if (corr > jump_out) |
---|
| 97 | { |
---|
| 98 | out[0] = corr; |
---|
| 99 | return; |
---|
| 100 | } |
---|
| 101 | */ |
---|
| 102 | } |
---|
| 103 | |
---|
| 104 | out[0] = corr; |
---|
| 105 | |
---|
| 106 | // printf("corr \n %lf", corr); |
---|
| 107 | |
---|
| 108 | return; |
---|
| 109 | } |
---|
| 110 | |
---|
| 111 | |
---|
| 112 | |
---|
| 113 | // out[0] = im1 [x1 * height + y1]- im2 [x2 * height + y2]; |
---|
| 114 | // out[0] = im1 [y1 * height + x1]- im2 [y2 * height + x2]; |
---|
| 115 | // out[0] = im1 [y1 * width + x1]- im2 [y2 * width + x2]; |
---|