summaryrefslogtreecommitdiffstats
path: root/SD-VBS/common/toolbox/lagrcv/lagrcv.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'SD-VBS/common/toolbox/lagrcv/lagrcv.cpp')
-rwxr-xr-xSD-VBS/common/toolbox/lagrcv/lagrcv.cpp840
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/*
3void 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
19void 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}
30void 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}
53void 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
83void 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}
93void 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}
103void 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
127void 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}
151void 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}
181void 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];