6 #if ( CV_MAJOR_VERSION >= 4) 7 #include <opencv2/imgproc/types_c.h> 22 cv::cvtColor(src, gimg, CV_BGR2GRAY);
24 dst.create(height, width, CV_8UC3);
25 for (
int y = 0;
y < height;
y++) {
26 for (
int x = 0;
x < width;
x++) {
27 cv::Vec3b& px=dst.at<cv::Vec3b>(
y,
x);
28 for (
int k = 0; k < 3; k++) {
36 for (
int y = 1;
y < height - 1;
y++) {
37 for (
int x = 1;
x < width - 1;
x++) {
40 float dxx,dyy,dxy,dyx;
43 dxx = (
float)gimg.at<
unsigned char>(
y,
x + 1)
44 - (
float)gimg.at<
unsigned char>(
y,
x - 1);
45 dyy = (
float)gimg.at<
unsigned char>(
y + 1,
x)
46 - (
float)gimg.at<
unsigned char>(
y - 1,
x);
47 dxy = (
float)gimg.at<
unsigned char>(
y + 1,
x + 1)
48 - (
float)gimg.at<
unsigned char>(
y - 1,
x - 1);
49 dyx = (
float)gimg.at<
unsigned char>(
y + 1,
x - 1)
50 - (
float)gimg.at<
unsigned char>(
y - 1,
x + 1);
52 dx = 0.5 * (dxx + 0.5 * r2 * (dxy - dyx));
53 dy = 0.5 * (dyy + 0.5 * r2 * (dxy + dyx));
56 m = (
int)(
sqrt(0.5 * (dx * dx + dy * dy)));
59 if (dth < 0.0) dth += 180.0;
60 if (dth >= 180.0) dth -= 180.0;
63 dst.at<cv::Vec3b>(
y,
x) = cv::Vec3b(th, 255, m);
77 std::vector<cv::Point>& result,
87 for (
int y = bs;
y < height - bs;
y++) {
88 for (
int x = bs;
x < width - bs;
x++) {
89 cv::Vec3b& px0 = dst.at<cv::Vec3b>(
y,
x);
92 for (
int dx = -bs; dx <= bs; dx++) {
93 for (
int dy = -bs; dy <= bs; dy++) {
94 if (dx == 0 && dy == 0)
break;
95 cv::Vec3b& px1 = dst.at<cv::Vec3b>(y + dy,
x + dx);
96 if (px0[2] < px1[2]) iskey =
false;
99 if (iskey) result.push_back(cv::Point(
x, y));
113 cv::Mat intimg, sqintimg, tintimg;
115 int width = src.cols;
118 cv::cvtColor(src, gimg, CV_BGR2GRAY);
120 dst.create(height, width, CV_8UC3);
121 unsigned char *gradbuf = dst.ptr();
123 intimg.create(height + 1, width + 1, CV_32S);
124 sqintimg.create(height + 1, width + 1, CV_32S);
125 tintimg.create(height + 1, width + 1, CV_32S);
127 cv::integral(gimg, intimg, sqintimg, tintimg);
129 float r2 =
sqrt(2.0);
131 int hscale = scale / 2;
132 int bsize = hscale * 2 + 1;
133 int barea0 = scale * scale;
134 int barea1 = scale * bsize;
136 for (
int y = margin;
y < height - margin;
y++) {
138 for (
int x = margin;
x < width - margin;
x++) {
141 float dxx, dyy, dxy, dyx;
144 dxx = ((
float)(intimg.at<
int>(
y + hscale + 1,
x + scale + 1)
145 + intimg.at<
int>(
y - hscale,
x + 1)
146 - intimg.at<
int>(
y - hscale,
x + scale + 1)
147 - intimg.at<
int>(
y + hscale + 1,
x + 1))
148 - (
float)(intimg.at<
int>(
y + hscale + 1,
x)
149 +intimg.at<
int>(
y - hscale,
x - scale)
150 -intimg.at<
int>(
y - hscale,
x)
151 -intimg.at<
int>(
y + hscale + 1,
x - scale))) / barea1;
152 dyy = ((
float)(intimg.at<
int>(
y + scale + 1,
x + hscale + 1)
153 + intimg.at<
int>(
y + 1,
x - hscale)
154 - intimg.at<
int>(y + scale + 1,
x - hscale)
155 - intimg.at<
int>(y + 1,
x + hscale + 1))
156 - (
float)(intimg.at<
int>(y - scale,
x - hscale)
157 +intimg.at<
int>(y,
x + hscale + 1)
158 -intimg.at<
int>(y - scale,
x + hscale + 1)
159 -intimg.at<
int>(y,
x - hscale))) / barea1;
161 dxy = ((
float)(intimg.at<
int>(y + scale + 1,
x + scale + 1)
162 + intimg.at<
int>(y + 1,
x + 1)
163 - intimg.at<
int>(y + 1,
x + scale + 1)
164 - intimg.at<
int>(y + scale + 1,
x + 1))
165 - (
float)(intimg.at<
int>(y,
x)
166 + intimg.at<
int>(y - scale,
x - scale)
167 - intimg.at<
int>(y,
x - scale)
168 - intimg.at<
int>(y - scale,
x))) / barea0;
169 dyx = ((
float)(intimg.at<
int>(y + scale + 1,
x)
170 + intimg.at<
int>(y + 1,
x - scale)
171 - intimg.at<
int>(y + 1,
x)
172 - intimg.at<
int>(y + scale + 1,
x - scale))
173 - (
float)(intimg.at<
int>(y,
x + scale + 1)
174 + intimg.at<
int>(y - scale,
x + 1)
175 - intimg.at<
int>(y - scale,
x + scale + 1)
176 - intimg.at<
int>(y,
x + 1))) / barea0;
178 dx = 0.5 * (dxx + 0.5 * r2 * (dxy - dyx));
179 dy = 0.5 * (dyy + 0.5 * r2 * (dxy + dyx));
181 m = (
int)(
sqrt(0.5 * (dx * dx + dy * dy)));
184 if (dth < 0.0) dth += 180.0;
185 if (dth >= 180.0) dth -= 180.0;
188 gradbuf[(xidx +
x) * 3] = th;
189 gradbuf[(xidx +
x) * 3 + 1] = 255;
190 gradbuf[(xidx +
x) * 3 + 2] = m;
200 cv::Mat intimg, sqintimg, tintimg;
202 int width = src.cols;
205 std::vector<std::vector<float> > gradimglist;
206 std::vector<int> scalelist;
208 cv::cvtColor(src, gimg, CV_BGR2GRAY);
210 dst.create(height, width, CV_8UC3);
211 unsigned char *gradbuf = dst.ptr();
213 intimg.create(height + 1, width + 1, CV_32S);
214 sqintimg.create(height + 1, width + 1, CV_32S);
215 tintimg.create(height + 1, width + 1, CV_32S);
217 cv::integral(gimg, intimg, sqintimg, tintimg);
221 scalelist.resize(width * height);
224 gradimglist.resize((maxscale + 1) * 3);
226 for(
int i = 0; i < gradimglist.size(); i++)
227 gradimglist[i].
resize(width * height);
230 float r2 =
sqrt(2.0);
232 for (
int y = 1;
y < height - 1;
y++) {
234 for (
int x = 1;
x < width - 1;
x++) {
236 float dxx, dyy, dxy, dyx;
238 dxx = (
float)gimg.at<
unsigned char>(
y,
x + 1)
239 - (
float)gimg.at<
unsigned char>(
y,
x - 1);
240 dyy = (
float)gimg.at<
unsigned char>(
y + 1,
x)
241 - (
float)gimg.at<
unsigned char>(
y - 1,
x);
242 dxy = (
float)gimg.at<
unsigned char>(
y + 1,
x + 1)
243 - (
float)gimg.at<
unsigned char>(
y - 1,
x - 1);
244 dyx = (
float)gimg.at<
unsigned char>(
y + 1,
x - 1)
245 - (
float)gimg.at<
unsigned char>(
y - 1,
x + 1);
247 dx = 0.5 * (dxx + 0.5 * r2 * (dxy - dyx));
248 dy = 0.5 * (dyy + 0.5 * r2 * (dxy + dyx));
251 gradimglist[0][idx] = dx * dx + dy * dy;
252 gradimglist[1][idx] = dx;
253 gradimglist[2][idx] = dy;
258 for (
int scale = 2; scale <= maxscale; scale++) {
260 int hscale = scale / 2;
261 int bsize = hscale * 2 + 1;
262 int barea0 = scale * scale;
263 int barea1 = scale * bsize;
266 int sidx = (scale - 1) * 3;
267 for (
int y = margin;
y < height - margin;
y++) {
269 for (
int x = margin;
x < width - margin;
x++) {
271 float dxx, dyy, dxy, dyx;
273 dxx = ((
float)(intimg.at<
int>(
y + hscale + 1,
x + scale + 1)
274 + intimg.at<
int>(
y - hscale,
x + 1)
275 - intimg.at<
int>(
y - hscale,
x + scale + 1)
276 - intimg.at<
int>(
y + hscale + 1,
x + 1))
277 - (
float)(intimg.at<
int>(
y + hscale + 1,
x)
278 + intimg.at<
int>(
y - hscale,
x - scale)
279 - intimg.at<
int>(
y - hscale,
x)
280 - intimg.at<
int>(
y + hscale + 1,
x - scale)))
282 dyy = ((
float)(intimg.at<
int>(
y + scale + 1,
x + hscale + 1)
283 + intimg.at<
int>(
y + 1,
x - hscale)
284 - intimg.at<
int>(y + scale + 1,
x - hscale)
285 - intimg.at<
int>(y + 1,
x + hscale + 1))
286 -(
float)(intimg.at<
int>(y - scale,
x - hscale)
287 +intimg.at<
int>(y,
x + hscale + 1)
288 -intimg.at<
int>(y - scale,
x + hscale + 1)
289 -intimg.at<
int>(y,
x - hscale))) / barea1;
292 dxy = ((
float)(intimg.at<
int>(y + scale + 1,
x + scale + 1)
293 + intimg.at<
int>(y + 1,
x + 1)
294 - intimg.at<
int>(y + 1,
x + scale + 1)
295 - intimg.at<
int>(y + scale + 1,
x + 1))
296 - (
float)(intimg.at<
int>(y,
x)
297 + intimg.at<
int>(y - scale,
x - scale)
298 - intimg.at<
int>(y,
x - scale)
299 - intimg.at<
int>(y - scale,
x))) / barea0;
300 dyx = ((
float)(intimg.at<
int>(y + scale + 1,
x)
301 + intimg.at<
int>(y + 1,
x - scale)
302 - intimg.at<
int>(y + 1,
x)
303 - intimg.at<
int>(y + scale + 1,
x - scale))
304 - (
float)(intimg.at<
int>(y,
x + scale + 1)
305 + intimg.at<
int>(y - scale,
x + 1)
306 - intimg.at<
int>(y - scale,
x + scale + 1)
307 - intimg.at<
int>(y,
x + 1))) / barea0;
309 dx = 0.5 * (dxx + 0.5 * r2 * (dxy - dyx));
310 dy = 0.5 * (dyy + 0.5 * r2 * (dxy + dyx));
313 gradimglist[sidx][idx] = dx * dx + dy * dy;
314 gradimglist[sidx + 1][idx] = dx;
315 gradimglist[sidx + 2][idx] = dy;
321 int ofs = 1 + maxscale;
322 for (
int y = ofs;
y < height - ofs;
y++) {
324 for (
int x = ofs;
x < width - ofs;
x++) {
330 mmax = gradimglist[sscale][idx];
331 for (
int scale = sscale + 1; scale <= maxscale; scale++) {
332 m = gradimglist[scale * 3][idx];
341 dx = gradimglist[mscale * 3 + 1][idx];
342 dy = gradimglist[mscale * 3 + 2][idx];
344 if (th < 0.0) th += 180.0;
345 if (th >= 180.0) th -= 180.0;
346 scalelist[idx] = mscale;
348 gradbuf[idx * 3] = (
unsigned char)th;
349 gradbuf[idx * 3 + 1] = 255;
350 gradbuf[idx * 3 + 2] = (
unsigned char)m;
355 for (
int y = ofs;
y < height - ofs;
y++) {
357 for (
int x = ofs;
x < width - ofs;
x++) {
359 int scale = scalelist[idx];
360 float m = gradimglist[scale][idx];
364 for (
int sc = scale > 0 ? scale - 1 : 0;
365 sc < (scale < maxscale ? scale + 1 : maxscale);
367 for (
int xx = -1; xx <= 1; xx++) {
368 if (m < gradimglist[sc][idx + xx]
369 || m < gradimglist[sc][idx + xx + width]
370 || m < gradimglist[sc][idx + xx - width]) {
382 cv::Scalar(0, 0, 255),
void calcOrientedGradient(cv::Mat &src, cv::Mat &dst)
void calcScaledOrientedGradient(cv::Mat &src, cv::Mat &dst, int scale)
void calcOGKeyPoints(cv::Mat &src, cv::Mat &dst, std::vector< cv::Point > &result, int thres=32, int bs=1)
void calcSOGKeyPoints(cv::Mat &src, cv::Mat &dst)
GLvoid resize(GLsizei, GLsizei)