Merge pull request #106 from yamt/finder_scan
finder_scan: Improve capstone detection on small images
This commit is contained in:
commit
fd7792177e
1 changed files with 16 additions and 14 deletions
|
@ -380,7 +380,8 @@ static void record_capstone(struct quirc *q, int ring, int stone)
|
||||||
perspective_map(capstone->c, 3.5, 3.5, &capstone->center);
|
perspective_map(capstone->c, 3.5, 3.5, &capstone->center);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_capstone(struct quirc *q, int x, int y, int *pb)
|
static void test_capstone(struct quirc *q, unsigned int x, unsigned int y,
|
||||||
|
unsigned int *pb)
|
||||||
{
|
{
|
||||||
int ring_right = region_code(q, x - pb[4], y);
|
int ring_right = region_code(q, x - pb[4], y);
|
||||||
int stone = region_code(q, x - pb[4] - pb[3] - pb[2], y);
|
int stone = region_code(q, x - pb[4] - pb[3] - pb[2], y);
|
||||||
|
@ -389,7 +390,7 @@ static void test_capstone(struct quirc *q, int x, int y, int *pb)
|
||||||
y);
|
y);
|
||||||
struct quirc_region *stone_reg;
|
struct quirc_region *stone_reg;
|
||||||
struct quirc_region *ring_reg;
|
struct quirc_region *ring_reg;
|
||||||
int ratio;
|
unsigned int ratio;
|
||||||
|
|
||||||
if (ring_left < 0 || ring_right < 0 || stone < 0)
|
if (ring_left < 0 || ring_right < 0 || stone < 0)
|
||||||
return;
|
return;
|
||||||
|
@ -417,14 +418,14 @@ static void test_capstone(struct quirc *q, int x, int y, int *pb)
|
||||||
record_capstone(q, ring_left, stone);
|
record_capstone(q, ring_left, stone);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void finder_scan(struct quirc *q, int y)
|
static void finder_scan(struct quirc *q, unsigned int y)
|
||||||
{
|
{
|
||||||
quirc_pixel_t *row = q->pixels + y * q->w;
|
quirc_pixel_t *row = q->pixels + y * q->w;
|
||||||
int x;
|
unsigned int x;
|
||||||
int last_color = 0;
|
int last_color = 0;
|
||||||
int run_length = 0;
|
unsigned int run_length = 0;
|
||||||
int run_count = 0;
|
unsigned int run_count = 0;
|
||||||
int pb[5];
|
unsigned int pb[5];
|
||||||
|
|
||||||
memset(pb, 0, sizeof(pb));
|
memset(pb, 0, sizeof(pb));
|
||||||
for (x = 0; x < q->w; x++) {
|
for (x = 0; x < q->w; x++) {
|
||||||
|
@ -437,17 +438,18 @@ static void finder_scan(struct quirc *q, int y)
|
||||||
run_count++;
|
run_count++;
|
||||||
|
|
||||||
if (!color && run_count >= 5) {
|
if (!color && run_count >= 5) {
|
||||||
static int check[5] = {1, 1, 3, 1, 1};
|
const int scale = 16;
|
||||||
int avg, err;
|
static const unsigned int check[5] = {1, 1, 3, 1, 1};
|
||||||
int i;
|
unsigned int avg, err;
|
||||||
|
unsigned int i;
|
||||||
int ok = 1;
|
int ok = 1;
|
||||||
|
|
||||||
avg = (pb[0] + pb[1] + pb[3] + pb[4]) / 4;
|
avg = (pb[0] + pb[1] + pb[3] + pb[4]) * scale / 4;
|
||||||
err = avg * 3 / 4;
|
err = avg * 3 / 4;
|
||||||
|
|
||||||
for (i = 0; i < 5; i++)
|
for (i = 0; i < 5; i++)
|
||||||
if (pb[i] < check[i] * avg - err ||
|
if (pb[i] * scale < check[i] * avg - err ||
|
||||||
pb[i] > check[i] * avg + err)
|
pb[i] * scale > check[i] * avg + err)
|
||||||
ok = 0;
|
ok = 0;
|
||||||
|
|
||||||
if (ok)
|
if (ok)
|
||||||
|
@ -1024,7 +1026,7 @@ static void test_neighbours(struct quirc *q, int i,
|
||||||
record_qr_grid(q, best_h, i, best_v);
|
record_qr_grid(q, best_h, i, best_v);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_grouping(struct quirc *q, int i)
|
static void test_grouping(struct quirc *q, unsigned int i)
|
||||||
{
|
{
|
||||||
struct quirc_capstone *c1 = &q->capstones[i];
|
struct quirc_capstone *c1 = &q->capstones[i];
|
||||||
int j;
|
int j;
|
||||||
|
|
Loading…
Reference in a new issue