mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
Fix temlate matching
This commit is contained in:
parent
f99ae139ad
commit
a888f769bc
@ -9,42 +9,23 @@
|
|||||||
#include "xalloc.h"
|
#include "xalloc.h"
|
||||||
#include "imlib.h"
|
#include "imlib.h"
|
||||||
#include <arm_math.h>
|
#include <arm_math.h>
|
||||||
float imlib_template_match(struct image *f, struct image *t_orig, struct rectangle *r)
|
float imlib_template_match(struct image *f, struct image *t, struct rectangle *r)
|
||||||
{
|
{
|
||||||
int den_b=0;
|
int den_b=0;
|
||||||
float corr =0.0;
|
float corr =0.0;
|
||||||
|
|
||||||
struct image img;
|
|
||||||
struct image *t=&img;
|
|
||||||
|
|
||||||
struct integral_image sum;
|
struct integral_image sum;
|
||||||
struct integral_image *f_imgs=∑
|
struct integral_image *f_imgs=∑
|
||||||
|
|
||||||
/* allocate buffer for scaled template */
|
|
||||||
t->w = t_orig->w;
|
|
||||||
t->h = t_orig->h;
|
|
||||||
t->bpp = t_orig->bpp;
|
|
||||||
t->data = xalloc(sizeof(*t->data)* t_orig->w * t_orig->h);
|
|
||||||
|
|
||||||
/* allocate buffer for integral image */
|
|
||||||
f_imgs->w = f->w;
|
|
||||||
f_imgs->h = f->h;
|
|
||||||
f_imgs->data = (uint32_t*) (f->data+(f->w * f->h*2));/* after the framebuffer */
|
|
||||||
|
|
||||||
/* get integeral image */
|
/* get integeral image */
|
||||||
|
imlib_integral_image_alloc(f_imgs, f->w, f->h);
|
||||||
imlib_integral_image(f, f_imgs);
|
imlib_integral_image(f, f_imgs);
|
||||||
|
|
||||||
/* copy template */
|
|
||||||
t->w = (int) t_orig->w;
|
|
||||||
t->h = (int) t_orig->h;
|
|
||||||
memcpy(t->data, t_orig->data,(sizeof(*t->data)* t_orig->w * t_orig->h));
|
|
||||||
|
|
||||||
/* get normalized template sum of squares */
|
/* get normalized template sum of squares */
|
||||||
int t_mean = imlib_image_mean(t);
|
int t_mean = imlib_image_mean(t);
|
||||||
for (int i=0; i < (t->w*t->h); i++) {
|
for (int i=0; i < (t->w*t->h); i++) {
|
||||||
int c = (int8_t)t->data[i]-t_mean;
|
int c = (int)t->data[i]-t_mean;
|
||||||
den_b += c*c;
|
den_b += c*c;
|
||||||
t->data[i]=(int8_t)c;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int v=0; v < f->h - t->h; v+=3) {
|
for (int v=0; v < f->h - t->h; v+=3) {
|
||||||
@ -56,8 +37,8 @@ float imlib_template_match(struct image *f, struct image *t_orig, struct rectan
|
|||||||
|
|
||||||
for (int y=v; y<t->h+v; y++) {
|
for (int y=v; y<t->h+v; y++) {
|
||||||
for (int x=u; x<t->w+u; x++) {
|
for (int x=u; x<t->w+u; x++) {
|
||||||
int a = (int8_t)f->data[y*f->w+x]-f_mean;
|
int a = (int)f->data[y*f->w+x]-f_mean;
|
||||||
int b = (int8_t)t->data[(y-v)*t->w+(x-u)];
|
int b = (int)t->data[(y-v)*t->w+(x-u)]-t_mean;
|
||||||
num += a*b;
|
num += a*b;
|
||||||
den_a += a*a;
|
den_a += a*a;
|
||||||
}
|
}
|
||||||
@ -75,7 +56,5 @@ float imlib_template_match(struct image *f, struct image *t_orig, struct rectan
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
xfree(t->data);
|
|
||||||
return corr;
|
return corr;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user