@@ -67,43 +67,107 @@ void coarsity(float* out, int h, int w, const float* sxx, const float* sxy,
|
|
67 |
for (int y = 0; y < h; y++) {
|
68 |
for (int x = 0; x < w; x++) {
|
69 |
float det = sxx[y][x] * syy[y][x] - sxy[y][x] * sxy[y][x];
|
70 |
float trace = sxx[y][x] + syy[y][x];
|
71 |
out[y][x] = det - kappa * trace * trace;
|
72 |
}
|
73 |
}
|
74 |
}
|
75 |
|
76 |
void harris(float* out, int h, int w, const float* in) {
|
77 |
-
|
78 |
-
const int w1 = w - 2;
|
79 |
-
|
80 |
-
|
|
|
81 |
-
|
82 |
-
float* const ix = (float* const)malloc(sizeof(float[h1][w1]));
|
83 |
-
float* const iy = (float* const)malloc(sizeof(float[h1][w1]));
|
84 |
-
|
|
|
85 |
-
|
86 |
-
float* const iyy = (float* const)malloc(sizeof(float[h1][w1]));
|
87 |
-
float* const sxx = (float* const)malloc(sizeof(float[h2][w2]));
|
88 |
-
float* const sxy = (float* const)malloc(sizeof(float[h2][w2]));
|
89 |
-
float* const syy = (float* const)malloc(sizeof(float[h2][w2]));
|
90 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
91 |
-
|
92 |
-
sobelY(iy, h, w, gray);
|
93 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
94 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
95 |
-
|
96 |
-
sum3x3(sxx, h1, w1, ixx);
|
97 |
-
sum3x3(sxy, h1, w1, ixy);
|
98 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
99 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
100 |
free(gray);
|
101 |
free(ix);
|
102 |
free(iy);
|
103 |
-
|
104 |
-
free(ixy);
|
105 |
-
free(iyy);
|
106 |
-
free(sxx);
|
107 |
-
free(sxy);
|
108 |
-
free(syy);
|
109 |
}
|
67 |
for (int y = 0; y < h; y++) {
|
68 |
for (int x = 0; x < w; x++) {
|
69 |
float det = sxx[y][x] * syy[y][x] - sxy[y][x] * sxy[y][x];
|
70 |
float trace = sxx[y][x] + syy[y][x];
|
71 |
out[y][x] = det - kappa * trace * trace;
|
72 |
}
|
73 |
}
|
74 |
}
|
75 |
|
76 |
void harris(float* out, int h, int w, const float* in) {
|
77 |
+
|
|
|
78 |
+
for (int y = 0; y < -4 + h; y += 32) {
|
79 |
+
float* const iy = (float* const)malloc(sizeof(float[4][-2 + w]));
|
80 |
+
float* const ix = (float* const)malloc(sizeof(float[4][-2 + w]));
|
81 |
+
float* const gray = (float* const)malloc(sizeof(float[4][w]));
|
|
|
|
|
82 |
+
for (int y_out = 0; y_out < min(h, 36 + y) - y; y_out++) {
|
83 |
+
|
84 |
+
for (int x = 0; x < w; x++) {
|
|
|
|
|
|
|
|
|
85 |
+
gray[y_out % 4 * w + x] =
|
86 |
+
0.298999994993f * in[(y_out + y) * w + x] +
|
87 |
+
0.587000012398f * in[h * w + (y_out + y) * w + x] +
|
88 |
+
0.11400000006f * in[2 * h * w + (y_out + y) * w + x];
|
89 |
+
}
|
90 |
+
if (2 <= y_out) {
|
91 |
+
|
92 |
+
for (int x = 0; x < -2 + w; x++) {
|
93 |
+
float acc_ix = 0.f;
|
94 |
+
acc_ix += -0.0833333333333f * gray[(-2 + y_out) % 4 * w + x];
|
95 |
+
acc_ix += 0.0833333333333f * gray[2 + (-2 + y_out) % 4 * w + x];
|
96 |
+
acc_ix += -0.166666666667f * gray[(-1 + y_out) % 4 * w + x];
|
97 |
+
acc_ix += 0.166666666667f * gray[2 + (-1 + y_out) % 4 * w + x];
|
98 |
+
acc_ix += -0.0833333333333f * gray[y_out % 4 * w + x];
|
99 |
+
acc_ix += 0.0833333333333f * gray[2 + y_out % 4 * w + x];
|
100 |
+
ix[(-2 + y_out) % 4 * (-2 + w) + x] = acc_ix;
|
101 |
+
float acc_iy = 0.f;
|
102 |
+
acc_iy += -0.0833333333333f * gray[(-2 + y_out) % 4 * w + x];
|
103 |
+
acc_iy += -0.166666666667f * gray[1 + (-2 + y_out) % 4 * w + x];
|
104 |
+
acc_iy += -0.0833333333333f * gray[2 + (-2 + y_out) % 4 * w + x];
|
105 |
+
acc_iy += 0.0833333333333f * gray[y_out % 4 * w + x];
|
106 |
+
acc_iy += 0.166666666667f * gray[1 + y_out % 4 * w + x];
|
107 |
+
acc_iy += 0.0833333333333f * gray[2 + y_out % 4 * w + x];
|
108 |
+
iy[(-2 + y_out) % 4 * (-2 + w) + x] = acc_iy;
|
109 |
+
}
|
110 |
+
}
|
111 |
+
if (4 <= y_out) {
|
112 |
+
|
113 |
+
for (int x = 0; x < -4 + w; x++) {
|
114 |
+
float ix0 = ix[(-4 + y_out) % 4 * (-2 + w) + x];
|
115 |
+
float ix1 = ix[1 + (-4 + y_out) % 4 * (-2 + w) + x];
|
116 |
+
float ix2 = ix[2 + (-4 + y_out) % 4 * (-2 + w) + x];
|
117 |
+
float ix3 = ix[(-3 + y_out) % 4 * (-2 + w) + x];
|
118 |
+
float ix4 = ix[1 + (-3 + y_out) % 4 * (-2 + w) + x];
|
119 |
+
float ix5 = ix[2 + (-3 + y_out) % 4 * (-2 + w) + x];
|
120 |
+
float ix6 = ix[(-2 + y_out) % 4 * (-2 + w) + x];
|
121 |
+
float ix7 = ix[1 + (-2 + y_out) % 4 * (-2 + w) + x];
|
122 |
+
float ix8 = ix[2 + (-2 + y_out) % 4 * (-2 + w) + x];
|
123 |
+
float iy0 = iy[(-4 + y_out) % 4 * (-2 + w) + x];
|
124 |
+
float iy1 = iy[1 + (-4 + y_out) % 4 * (-2 + w) + x];
|
125 |
+
float iy2 = iy[2 + (-4 + y_out) % 4 * (-2 + w) + x];
|
126 |
+
float iy3 = iy[(-3 + y_out) % 4 * (-2 + w) + x];
|
127 |
+
float iy4 = iy[1 + (-3 + y_out) % 4 * (-2 + w) + x];
|
128 |
+
float iy5 = iy[2 + (-3 + y_out) % 4 * (-2 + w) + x];
|
129 |
+
float iy6 = iy[(-2 + y_out) % 4 * (-2 + w) + x];
|
130 |
+
float iy7 = iy[1 + (-2 + y_out) % 4 * (-2 + w) + x];
|
131 |
+
float iy8 = iy[2 + (-2 + y_out) % 4 * (-2 + w) + x];
|
132 |
+
float acc_sxx = 0.f;
|
|
|
133 |
+
acc_sxx += ix0 * ix0;
|
134 |
+
acc_sxx += ix1 * ix1;
|
135 |
+
acc_sxx += ix2 * ix2;
|
136 |
+
acc_sxx += ix3 * ix3;
|
137 |
+
acc_sxx += ix4 * ix4;
|
138 |
+
acc_sxx += ix5 * ix5;
|
139 |
+
acc_sxx += ix6 * ix6;
|
140 |
+
acc_sxx += ix7 * ix7;
|
141 |
+
acc_sxx += ix8 * ix8;
|
142 |
+
float acc_sxy = 0.f;
|
143 |
+
acc_sxy += ix0 * iy0;
|
144 |
+
acc_sxy += ix1 * iy1;
|
145 |
+
acc_sxy += ix2 * iy2;
|
146 |
+
acc_sxy += ix3 * iy3;
|
147 |
+
acc_sxy += ix4 * iy4;
|
148 |
+
acc_sxy += ix5 * iy5;
|
149 |
+
acc_sxy += ix6 * iy6;
|
150 |
+
acc_sxy += ix7 * iy7;
|
151 |
+
acc_sxy += ix8 * iy8;
|
152 |
+
float acc_syy = 0.f;
|
153 |
+
acc_syy += iy0 * iy0;
|
|
|
|
|
154 |
+
acc_syy += iy1 * iy1;
|
155 |
+
acc_syy += iy2 * iy2;
|
156 |
+
acc_syy += iy3 * iy3;
|
157 |
+
acc_syy += iy4 * iy4;
|
158 |
+
acc_syy += iy5 * iy5;
|
159 |
+
acc_syy += iy6 * iy6;
|
160 |
+
acc_syy += iy7 * iy7;
|
161 |
+
acc_syy += iy8 * iy8;
|
162 |
+
float det_out = acc_sxx * acc_syy - acc_sxy * acc_sxy;
|
163 |
+
float trace_out = acc_sxx + acc_syy;
|
164 |
+
out[(-4 + y_out + y) * (-4 + w) + x] =
|
165 |
+
det_out - 0.0399999991059f * trace_out * trace_out;
|
166 |
+
}
|
167 |
+
}
|
168 |
+
}
|
169 |
free(gray);
|
170 |
free(ix);
|
171 |
free(iy);
|
172 |
+
}
|
|
|
|
|
|
|
|
|
|
|
173 |
}
|