diff options
Diffstat (limited to 'SD-VBS/benchmarks/sift/src/matlab/siftmatch.c')
| -rw-r--r-- | SD-VBS/benchmarks/sift/src/matlab/siftmatch.c | 250 |
1 files changed, 0 insertions, 250 deletions
diff --git a/SD-VBS/benchmarks/sift/src/matlab/siftmatch.c b/SD-VBS/benchmarks/sift/src/matlab/siftmatch.c deleted file mode 100644 index 1150176..0000000 --- a/SD-VBS/benchmarks/sift/src/matlab/siftmatch.c +++ /dev/null | |||
| @@ -1,250 +0,0 @@ | |||
| 1 | /* file: siftmatch.c | ||
| 2 | ** author: Andrea Vedaldi | ||
| 3 | ** description: SIFT descriptor matching. | ||
| 4 | **/ | ||
| 5 | |||
| 6 | /* AUTORIGHTS | ||
| 7 | Copyright (c) 2006 The Regents of the University of California. | ||
| 8 | All Rights Reserved. | ||
| 9 | |||
| 10 | Created by Andrea Vedaldi | ||
| 11 | UCLA Vision Lab - Department of Computer Science | ||
| 12 | |||
| 13 | Permission to use, copy, modify, and distribute this software and its | ||
| 14 | documentation for educational, research and non-profit purposes, | ||
| 15 | without fee, and without a written agreement is hereby granted, | ||
| 16 | provided that the above copyright notice, this paragraph and the | ||
| 17 | following three paragraphs appear in all copies. | ||
| 18 | |||
| 19 | This software program and documentation are copyrighted by The Regents | ||
| 20 | of the University of California. The software program and | ||
| 21 | documentation are supplied "as is", without any accompanying services | ||
| 22 | from The Regents. The Regents does not warrant that the operation of | ||
| 23 | the program will be uninterrupted or error-free. The end-user | ||
| 24 | understands that the program was developed for research purposes and | ||
| 25 | is advised not to rely exclusively on the program for any reason. | ||
| 26 | |||
| 27 | This software embodies a method for which the following patent has | ||
| 28 | been issued: "Method and apparatus for identifying scale invariant | ||
| 29 | features in an image and use of same for locating an object in an | ||
| 30 | image," David G. Lowe, US Patent 6,711,293 (March 23, | ||
| 31 | 2004). Provisional application filed March 8, 1999. Asignee: The | ||
| 32 | University of British Columbia. | ||
| 33 | |||
| 34 | IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY | ||
| 35 | FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, | ||
| 36 | INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND | ||
| 37 | ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN | ||
| 38 | ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE UNIVERSITY OF | ||
| 39 | CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT | ||
| 40 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
| 41 | A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" | ||
| 42 | BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE | ||
| 43 | MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. | ||
| 44 | */ | ||
| 45 | |||
| 46 | #include"mexutils.c" | ||
| 47 | |||
| 48 | #include<stdlib.h> | ||
| 49 | #include<string.h> | ||
| 50 | #include<math.h> | ||
| 51 | |||
| 52 | #define greater(a,b) ((a) > (b)) | ||
| 53 | #define min(a,b) (((a)<(b))?(a):(b)) | ||
| 54 | #define max(a,b) (((a)>(b))?(a):(b)) | ||
| 55 | |||
| 56 | #define TYPEOF_mxDOUBLE_CLASS double | ||
| 57 | #define TYPEOF_mxSINGLE_CLASS float | ||
| 58 | #define TYPEOF_mxINT8_CLASS char | ||
| 59 | #define TYPEOF_mxUINT8_CLASS unsigned char | ||
| 60 | |||
| 61 | #define PROMOTE_mxDOUBLE_CLASS double | ||
| 62 | #define PROMOTE_mxSINGLE_CLASS float | ||
| 63 | #define PROMOTE_mxINT8_CLASS int | ||
| 64 | #define PROMOTE_mxUINT8_CLASS int | ||
| 65 | |||
| 66 | #define MAXVAL_mxDOUBLE_CLASS mxGetInf() | ||
| 67 | #define MAXVAL_mxSINGLE_CLASS ((float)mxGetInf()) | ||
| 68 | #define MAXVAL_mxINT8_CLASS 0x7fffffff | ||
| 69 | #define MAXVAL_mxUINT8_CLASS 0x7fffffff | ||
| 70 | |||
| 71 | typedef struct | ||
| 72 | { | ||
| 73 | int k1 ; | ||
| 74 | int k2 ; | ||
| 75 | double score ; | ||
| 76 | } Pair ; | ||
| 77 | |||
| 78 | /* | ||
| 79 | * This macro defines the matching function for abstract type; that | ||
| 80 | * is, it is a sort of C++ template. This is also a good illustration | ||
| 81 | * of why C++ is preferable for templates :-) | ||
| 82 | */ | ||
| 83 | #define _COMPARE_TEMPLATE(MXC) \ | ||
| 84 | Pair* compare_##MXC (Pair* pairs_iterator, \ | ||
| 85 | const TYPEOF_##MXC * L1_pt, \ | ||
| 86 | const TYPEOF_##MXC * L2_pt, \ | ||
| 87 | int K1, int K2, int ND, float thresh) \ | ||
| 88 | { \ | ||
| 89 | int k1, k2 ; \ | ||
| 90 | const PROMOTE_##MXC maxval = MAXVAL_##MXC ; \ | ||
| 91 | for(k1 = 0 ; k1 < K1 ; ++k1, L1_pt += ND ) { \ | ||
| 92 | \ | ||
| 93 | PROMOTE_##MXC best = maxval ; \ | ||
| 94 | PROMOTE_##MXC second_best = maxval ; \ | ||
| 95 | int bestk = -1 ; \ | ||
| 96 | \ | ||
| 97 | /* For each point P2[k2] in the second image... */ \ | ||
| 98 | for(k2 = 0 ; k2 < K2 ; ++k2, L2_pt += ND) { \ | ||
| 99 | \ | ||
| 100 | int bin ; \ | ||
| 101 | PROMOTE_##MXC acc = 0 ; \ | ||
| 102 | for(bin = 0 ; bin < ND ; ++bin) { \ | ||
| 103 | PROMOTE_##MXC delta = \ | ||
| 104 | ((PROMOTE_##MXC) L1_pt[bin]) - \ | ||
| 105 | ((PROMOTE_##MXC) L2_pt[bin]) ; \ | ||
| 106 | acc += delta*delta ; \ | ||
| 107 | } \ | ||
| 108 | \ | ||
| 109 | /* Filter the best and second best matching point. */ \ | ||
| 110 | if(acc < best) { \ | ||
| 111 | second_best = best ; \ | ||
| 112 | best = acc ; \ | ||
| 113 | bestk = k2 ; \ | ||
| 114 | } else if(acc < second_best) { \ | ||
| 115 | second_best = acc ; \ | ||
| 116 | } \ | ||
| 117 | } \ | ||
| 118 | \ | ||
| 119 | L2_pt -= ND*K2 ; \ | ||
| 120 | \ | ||
| 121 | /* Lowe's method: accept the match only if unique. */ \ | ||
| 122 | if(thresh * (float) best <= (float) second_best && \ | ||
| 123 | bestk != -1) { \ | ||
| 124 | pairs_iterator->k1 = k1 ; \ | ||
| 125 | pairs_iterator->k2 = bestk ; \ | ||
| 126 | pairs_iterator->score = best ; \ | ||
| 127 | pairs_iterator++ ; \ | ||
| 128 | } \ | ||
| 129 | } \ | ||
| 130 | \ | ||
| 131 | return pairs_iterator ; \ | ||
| 132 | } \ | ||
| 133 | |||
| 134 | _COMPARE_TEMPLATE( mxDOUBLE_CLASS ) | ||
| 135 | _COMPARE_TEMPLATE( mxSINGLE_CLASS ) | ||
| 136 | _COMPARE_TEMPLATE( mxINT8_CLASS ) | ||
| 137 | _COMPARE_TEMPLATE( mxUINT8_CLASS ) | ||
| 138 | |||
| 139 | void | ||
| 140 | mexFunction(int nout, mxArray *out[], | ||
| 141 | int nin, const mxArray *in[]) | ||
| 142 | { | ||
| 143 | int K1, K2, ND ; | ||
| 144 | void* L1_pt ; | ||
| 145 | void* L2_pt ; | ||
| 146 | double thresh = 1.5 ; | ||
| 147 | mxClassID data_class ; | ||
| 148 | enum {L1=0,L2,THRESH} ; | ||
| 149 | enum {MATCHES=0,D} ; | ||
| 150 | |||
| 151 | /* ------------------------------------------------------------------ | ||
| 152 | ** Check the arguments | ||
| 153 | ** --------------------------------------------------------------- */ | ||
| 154 | if (nin < 2) { | ||
| 155 | mexErrMsgTxt("At least two input arguments required"); | ||
| 156 | } else if (nout > 2) { | ||
| 157 | mexErrMsgTxt("Too many output arguments"); | ||
| 158 | } | ||
| 159 | |||
| 160 | if(!mxIsNumeric(in[L1]) || | ||
| 161 | !mxIsNumeric(in[L2]) || | ||
| 162 | mxGetNumberOfDimensions(in[L1]) > 2 || | ||
| 163 | mxGetNumberOfDimensions(in[L2]) > 2) { | ||
| 164 | mexErrMsgTxt("L1 and L2 must be two dimensional numeric arrays") ; | ||
| 165 | } | ||
| 166 | |||
| 167 | K1 = mxGetN(in[L1]) ; | ||
| 168 | K2 = mxGetN(in[L2]) ; | ||
| 169 | ND = mxGetM(in[L1]) ; | ||
| 170 | |||
| 171 | if(mxGetM(in[L2]) != ND) { | ||
| 172 | mexErrMsgTxt("L1 and L2 must have the same number of rows") ; | ||
| 173 | } | ||
| 174 | |||
| 175 | data_class = mxGetClassID(in[L1]) ; | ||
| 176 | if(mxGetClassID(in[L2]) != data_class) { | ||
| 177 | mexErrMsgTxt("L1 and L2 must be of the same class") ; | ||
| 178 | } | ||
| 179 | |||
| 180 | L1_pt = mxGetData(in[L1]) ; | ||
| 181 | L2_pt = mxGetData(in[L2]) ; | ||
| 182 | |||
| 183 | if(nin == 3) { | ||
| 184 | if(!uIsRealScalar(in[THRESH])) { | ||
| 185 | mexErrMsgTxt("THRESH should be a real scalar") ; | ||
| 186 | } | ||
