diff options
Diffstat (limited to 'SD-VBS/common/toolbox/lagrcv/lagrcv.cpp')
| -rwxr-xr-x | SD-VBS/common/toolbox/lagrcv/lagrcv.cpp | 840 |
1 files changed, 840 insertions, 0 deletions
diff --git a/SD-VBS/common/toolbox/lagrcv/lagrcv.cpp b/SD-VBS/common/toolbox/lagrcv/lagrcv.cpp new file mode 100755 index 0000000..4f24b5d --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/lagrcv.cpp | |||
| @@ -0,0 +1,840 @@ | |||
| 1 | #include "lagrcv.h" | ||
| 2 | /* | ||
| 3 | void calcImagePyr(char *src, int sizeY, int sizeX, int level, char *pyr){ | ||
| 4 | pyr=(char*) malloc(sizeof(char)*(int)sizeY*sizeX*4/3); | ||
| 5 | int i, startPnt, nX, nY; | ||
| 6 | |||
| 7 | memcpy(pyr,src, sizeY*sizeX); | ||
| 8 | nY=sizeY; | ||
| 9 | nX=sizeX; | ||
| 10 | for(i=0; i<level; i++){ | ||
| 11 | nY = (nY + 1) >> 1; | ||
| 12 | nX = (nX + 1) >> 1; | ||
| 13 | calcSubsample(pyr, sizeY, sizeX, pyr+sizeY*sizeX) | ||
| 14 | } | ||
| 15 | free(pyr); | ||
| 16 | } | ||
| 17 | */ | ||
| 18 | |||
| 19 | void calcSubSampleAvg(double *src, int sizeY, int sizeX, double *dest, int destSizeY, int destSizeX){ | ||
| 20 | int i, j, idx, | ||
| 21 | destI, destJ, idxDest; | ||
| 22 | for(i=0, destI=0; destI<destSizeX; i+=2, destI++){ | ||
| 23 | for(j=0, destJ=0; destJ<destSizeY; j+=2, destJ++){ | ||
| 24 | idx=i*sizeX+j; | ||
| 25 | idxDest=destI*destSizeY+destJ; | ||
| 26 | dest[idxDest]=(src[idx]+src[idx+1]+src[idx+sizeY]+src[idx+sizeY+1])/4; | ||
| 27 | } | ||
| 28 | } | ||
| 29 | } | ||
| 30 | void calcImgBlur(double *src, int sizeY, int sizeX, double *dest){ | ||
| 31 | double kernel[]={0.0625, 0.25, 0.375, 0.25, 0.0625}; | ||
| 32 | double *temp; | ||
| 33 | temp=(double*) malloc(sizeof(double)*sizeY*sizeX); | ||
| 34 | int i, j, idx, idxCol; | ||
| 35 | for(i=2; i<sizeX-2;i++){ | ||
| 36 | idxCol=i*sizeY; | ||
| 37 | for(j=0;j<sizeY; j++){ | ||
| 38 | idx=idxCol+j; | ||
| 39 | temp[idx]=src[idx-2*sizeY]/16+src[idx-sizeY]/4 | ||
| 40 | +src[idx]*3/8+src[idx+sizeY]/4+src[idx+2*sizeY]/16; | ||
| 41 | } | ||
| 42 | } | ||
| 43 | for(i=0; i<sizeX;i++){ | ||
| 44 | idxCol=i*sizeY; | ||
| 45 | for(j=2;j<sizeY-2; j++){ | ||
| 46 | idx=idxCol+j; | ||
| 47 | dest[idx]=temp[idx-2]/16+temp[idx-1]/4 | ||
| 48 | +temp[idx]*3/8+temp[idx+1]/4+temp[idx+2]/16; | ||
| 49 | } | ||
| 50 | } | ||
| 51 | free(temp); | ||
| 52 | } | ||
| 53 | void calcImgResize(double *src, int sizeY, int sizeX, double *dest, int dstSizeY, int dstSizeX){ | ||
| 54 | double ker[]={ 0.0039, 0.0156, 0.0234, 0.0156, 0.0039, | ||
| 55 | 0.0156, 0.0625, 0.0938, 0.0625, 0.0156, | ||
| 56 | 0.0234, 0.0938, 0.1406, 0.0938, 0.0234, | ||
| 57 | 0.0156, 0.0625, 0.0938, 0.0625, 0.0156, | ||
| 58 | 0.0039, 0.0156, 0.0234, 0.0156, 0.0039}; | ||
| 59 | int srcI, srcJ, dstI, dstJ, srcIdx, dstIdx, idxCol_1, idxCol1, idxCol_2, idxCol2; | ||
| 60 | for(srcI=2, dstI=1; srcI<sizeX-2; srcI+=2, dstI++){ | ||
| 61 | for(srcJ=2, dstJ=1; srcJ<sizeY-2; srcJ+=2, dstJ++){ | ||
| 62 | srcIdx=srcI*sizeY+srcJ; | ||
| 63 | dstIdx=dstI*dstSizeY+dstJ; | ||
| 64 | idxCol_1=srcIdx-sizeY; | ||
| 65 | idxCol_2=srcIdx-2*sizeY; | ||
| 66 | idxCol1=srcIdx+sizeY; | ||
| 67 | idxCol2=srcIdx+2*sizeY; | ||
| 68 | dest[dstIdx]= | ||
| 69 | src[idxCol_2-2]*ker[0]+src[idxCol_1-2]*ker[1] | ||
| 70 | +src[srcIdx-2]*ker[2]+src[idxCol1-2]*ker[3]+src[idxCol2-2]*ker[4] | ||
| 71 | +src[idxCol_2-1]*ker[5]+src[idxCol_1-1]*ker[6] | ||
| 72 | +src[srcIdx-1]*ker[7]+src[idxCol1-1]*ker[8]+src[idxCol2-1]*ker[9] | ||
| 73 | +src[idxCol_2]*ker[10]+src[idxCol_1]*ker[11] | ||
| 74 | +src[srcIdx]*ker[12]+src[idxCol1]*ker[13]+src[idxCol2]*ker[14] | ||
| 75 | +src[idxCol_2+1]*ker[5]+src[idxCol_1+1]*ker[16] | ||
| 76 | +src[srcIdx+1]*ker[17]+src[idxCol1+1]*ker[18]+src[idxCol2+1]*ker[19]; | ||
| 77 | +src[idxCol_2+2]*ker[20]+src[idxCol_1+2]*ker[21] | ||
| 78 | +src[srcIdx+2]*ker[22]+src[idxCol1+2]*ker[23]+src[idxCol2+2]*ker[24]; | ||
| 79 | } | ||
| 80 | } | ||
| 81 | } | ||
| 82 | |||
| 83 | void calcGradient(double *src, int sizeY, int sizeX, double *dX, double *dY){ | ||
| 84 | int i, j, idx; | ||
| 85 | for(i=1; i<sizeX; i++){ | ||
| 86 | for(j=1; j<sizeY; j++){ | ||
| 87 | idx=i*sizeY+j; | ||
| 88 | dX[idx]=src[idx]-src[idx-sizeY]; | ||
| 89 | dY[idx]=src[idx]-src[idx-1]; | ||
| 90 | } | ||
| 91 | } | ||
| 92 | } | ||
| 93 | void calcGradient(char *src, int sizeY, int sizeX, char *dX, char *dY){ | ||
| 94 | int i, j, idx; | ||
| 95 | for(i=1; i<sizeX; i++){ | ||
| 96 | for(j=1; j<sizeY; j++){ | ||
| 97 | idx=i*sizeY+j; | ||
| 98 | dX[idx]=src[idx]-src[idx-sizeY]; | ||
| 99 | dY[idx]=src[idx]-src[idx-1]; | ||
| 100 | } | ||
| 101 | } | ||
| 102 | } | ||
| 103 | void calcSobel(double *src, int sizeY, int sizeX, double *dX, double *dY){ | ||
| 104 | //char kernelV[9]={-1, -2, -1, 0, 0, 0, 1, 2, 1}; | ||
| 105 | //char kernelH[9]={-1, 0, 1, -2, 0, 2, -1, 0, 1}; | ||
| 106 | //const int kerSize=3; | ||
| 107 | int i, j, idx, idxPrevCol, idxNextCol; | ||
| 108 | for(i=1; i<sizeX-1; i++){ | ||
| 109 | for(j=1; j<sizeY-1; j++){ | ||
| 110 | idx=i*sizeY+j; | ||
| 111 | idxPrevCol=idx-sizeY; | ||
| 112 | idxNextCol=idx+sizeY; | ||
| 113 | dX[idx]=src[idxPrevCol-1]*-0.0938f+src[idxPrevCol]*-0.3125f+src[idxPrevCol+1]*-0.0938f | ||
| 114 | +src[idxNextCol-1]*0.0938f+src[idxNextCol]*0.3125f+src[idxNextCol+1]*0.0938f; | ||
| 115 | dY[idx]=src[idxPrevCol-1]*-0.0938f+src[idx-1]*-0.3125f+src[idxNextCol-1]*-0.0938f | ||
| 116 | +src[idxPrevCol+1]*0.0938f+src[idx+1]*0.3125f+src[idxNextCol+1]*0.0938f; | ||
| 117 | /* | ||
| 118 | dX[idx]=(src[idxPrevCol-1]*-1+src[idxPrevCol]*-2+src[idxPrevCol+1]*-1 | ||
| 119 | +src[idxNextCol-1]*1+src[idxNextCol]*2+src[idxNextCol+1]*1)*0.0625; | ||
| 120 | dY[idx]=(src[idxPrevCol-1]*-1+src[idx-1]*-2+src[idxNextCol-1]*-1 | ||
| 121 | +src[idxPrevCol+1]*1+src[idx+1]*2+src[idxNextCol+1]*1)*0.0625; | ||
| 122 | */ | ||
| 123 | } | ||
| 124 | } | ||
| 125 | } | ||
| 126 | |||
| 127 | void calcGoodFeature(double *dX, double *dY, int sizeY, int sizeX, int winSize, double* lambda, double* tr, double* det, | ||
| 128 | double* c_xx, double* c_xy, double* c_yy){ | ||
| 129 | double *xx, *xy, *yy; | ||
| 130 | int i,j,idx; | ||
| 131 | xx=(double*)malloc(sizeof(double)*sizeY*sizeX); | ||
| 132 | xy=(double*)malloc(sizeof(double)*sizeY*sizeX); | ||
| 133 | yy=(double*)malloc(sizeof(double)*sizeY*sizeX); | ||
| 134 | for(idx=0; idx<sizeX*sizeY; idx++){ | ||
| 135 | xx[idx]=dX[idx]*dX[idx]; | ||
| 136 | xy[idx]=dX[idx]*dY[idx]; | ||
| 137 | yy[idx]=dY[idx]*dY[idx]; | ||
| 138 | } | ||
| 139 | calcAreaSum(xx, sizeY, sizeX, winSize, c_xx); | ||
| 140 | calcAreaSum(xy, sizeY, sizeX, winSize, c_xy); | ||
| 141 | calcAreaSum(yy, sizeY, sizeX, winSize, c_yy); | ||
| 142 | for(idx=0; idx<sizeX*sizeY; idx++){ | ||
| 143 | tr[idx]=c_xx[idx]+c_yy[idx]; | ||
| 144 | det[idx]=c_xx[idx]*c_yy[idx]-c_xy[idx]*c_xy[idx]; | ||
| 145 | lambda[idx]=det[idx]/(tr[idx] + 0.00001); | ||
| 146 | } | ||
| 147 | free(xx); | ||
| 148 | free(xy); | ||
| 149 | free(yy); | ||
| 150 | } | ||
| 151 | void calcGoodFeature(char *dX, char *dY, int sizeY, int sizeX, int winSize, float* lambda, float* tr, float* det){ | ||
| 152 | int *xx, *xy, *yy; | ||
| 153 | int *c_xx, *c_xy, *c_yy; | ||
| 154 | int i,j,idx; | ||
| 155 | xx=(int*)malloc(sizeof(int)*sizeY*sizeX); | ||
| 156 | xy=(int*)malloc(sizeof(int)*sizeY*sizeX); | ||
| 157 | yy=(int*)malloc(sizeof(int)*sizeY*sizeX); | ||
| 158 | c_xx=(int*)malloc(sizeof(int)*sizeY*sizeX); | ||
| 159 | c_xy=(int*)malloc(sizeof(int)*sizeY*sizeX); | ||
| 160 | c_yy=(int*)malloc(sizeof(int)*sizeY*sizeX); | ||
| 161 | for(i=0; i<sizeX; i++){ | ||
| 162 | for(j=0; j<sizeY; j++){ | ||
| 163 | idx=i*sizeY+j; | ||
| 164 | xx[idx]=dX[idx]*dX[idx]; | ||
| 165 | xy[idx]=dX[idx]*dY[idx]; | ||
| 166 | yy[idx]=dY[idx]*dY[idx]; | ||
| 167 | } | ||
| 168 | } | ||
| 169 | calcAreaSum(xx, sizeY, sizeX, winSize, c_xx); | ||
| 170 | calcAreaSum(xy, sizeY, sizeX, winSize, c_xy); | ||
| 171 | calcAreaSum(yy, sizeY, sizeX, winSize, c_yy); | ||
| 172 | for(i=0; i<sizeX; i++){ | ||
| 173 | for(j=0; j<sizeY; j++){ | ||
| 174 | idx=i*sizeY+j; | ||
| 175 | tr[idx]=c_xx[idx]+c_yy[idx]; | ||
| 176 | det[idx]=c_xx[idx]*c_yy[idx]-c_xy[idx]*c_xy[idx]; | ||
| 177 | lambda[i*sizeY+j]=det[idx]/(tr[idx] + 0.00001); | ||
| 178 | } | ||
| 179 | } | ||
| 180 | } | ||
| 181 | void calcMinEigenValue(char *dX, char *dY, int sizeY, int sizeX, float* lambda){ | ||
| 182 | int xx, xy, yy; | ||
| 183 | int tr; | ||
| 184 | int i,j; | ||
| 185 | for(i=0; i<sizeX; i++){ | ||
| 186 | for(j=0; j<sizeY; j++){ | ||
| 187 | xx=dX[i*sizeY+j]*dX[i*sizeY+j]; | ||
| 188 | xy=dX[i*sizeY+j]*dY[i*sizeY+j]; | ||
| 189 | yy=dY[i*sizeY+j]*dY[i*sizeY+j]; | ||
