# zbar库中的zbar_scan_y函数

zbar_symbol_type_t zbar_scan_y (zbar_scanner_t *scn,
int y)
{
/* FIXME calc and clip to max y range... */
/* retrieve short value history */
register int x = scn->x;
register int y0_1 = scn->y0[(x - 1) & 3];
register int y0_0 = y0_1;
if(x) {
/* update weighted moving average */
y0_0 += ((int)((y - y0_1) * EWMA_WEIGHT)) >> ZBAR_FIXED;
scn->y0[x & 3] = y0_0;
}
else
y0_0 = y0_1 = scn->y0[0] = scn->y0[1] = scn->y0[2] = scn->y0[3] = y;
register int y0_2 = scn->y0[(x - 2) & 3];
register int y0_3 = scn->y0[(x - 3) & 3];
/* 1st differential @ x-1 */
register int y1_1 = y0_1 - y0_2;
{
register int y1_2 = y0_2 - y0_3;
if((abs(y1_1) < abs(y1_2)) &&
((y1_1 >= 0) == (y1_2 >= 0)))
y1_1 = y1_2;
}

/* 2nd differentials @ x-1 & x-2 */
register int y2_1 = y0_0 - (y0_1 * 2) + y0_2;
register int y2_2 = y0_1 - (y0_2 * 2) + y0_3;

dprintf(1, "scan: x=%d y=%d y0=%d y1=%d y2=%d",
x, y, y0_1, y1_1, y2_1);

zbar_symbol_type_t edge = ZBAR_NONE;
/* 2nd zero-crossing is 1st local min/max - could be edge */
if((!y2_1 ||
((y2_1 > 0) ? y2_2 < 0 : y2_2 > 0)) &&
(calc_thresh(scn) <= abs(y1_1)))
{
/* check for 1st sign change */
char y1_rev = (scn->y1_sign > 0) ? y1_1 < 0 : y1_1 > 0;
if(y1_rev)
/* intensity change reversal - finalize previous edge */
edge = process_edge(scn, y1_1);

if(y1_rev || (abs(scn->y1_sign) < abs(y1_1))) {
scn->y1_sign = y1_1;

/* start at multiple of new min/max */
scn->y1_thresh = (abs(y1_1) * THRESH_INIT + ROUND) >> ZBAR_FIXED;
dprintf(1, "\tthr=%d", scn->y1_thresh);
if(scn->y1_thresh < scn->y1_min_thresh)
scn->y1_thresh = scn->y1_min_thresh;

/* update current edge */
int d = y2_1 - y2_2;
scn->cur_edge = 1 << ZBAR_FIXED;
if(!d)
scn->cur_edge >>= 1;
else if(y2_1)
/* interpolate zero crossing */
scn->cur_edge -= ((y2_1 << ZBAR_FIXED) + 1) / d;
scn->cur_edge += x << ZBAR_FIXED;
dprintf(1, "\n");
}
}
else
dprintf(1, "\n");
/* FIXME add fall-thru pass to decoder after heuristic "idle" period
(eg, 6-8 * last width) */
scn->x = x + 1;
return(edge);
}

0 条评论

• ### 【PMP】8.9早上题

1、审查商业论证后，项目经理下一步应该做什么？C A、制定项目进度计划 B、审查工作分解结构 C、创建项目章程 D、审核范围管理计划 2、项目管理办公...

• ### SCN(3)

1、系统正常关闭： system scn=datafile scn=start scn=stop scn 1)system scn=datafile scn=s...

• ### 故障恢复：从未知错误ORA-600 [3712]以猜测推理达成恢复

李真旭 Oracle ACE，云和恩墨技术专家 个人博客：www.killdb.com 在Oracle数据库的日常维护中，我们可能经常会遇到一些从未见过的错误，...

• ### Android App 与 U 盘通信详解

在 U 盘插入或插出的时候，系统都会发出一条相关的广播，所以我们需要自定义广播接收器，接收这两条广播，然后进行相应的处理。

• ### Jmeter接口测试之案例实战（十一）

在前面的知识体系中详细的介绍了Jmeter测试工具在接口自动化测试中的基础知识，那么今天更新的文章主要是对昨晚的上课内容做个总结。

• ### Kafka 事务之偏移量的提交对数据的影响

消费者提交偏移量的主要是消费者往一个名为_consumer_offset的特殊主题发送消息，消息中包含每个分区的偏移量。

• ### Nodejs建站笔记-注册登录流程的简单实现

1. 使用Backbone实现前端hash路由 登录注册页面如下： ? 初步设想将注册和登录作为两个不同的url实现，但登录和注册功能的差距只有form表单...

• ### Android开发(14) 可以横向滚动的ListView（固定列头）

由于项目需要，我们需要一个 可以横向滚动的，又可以竖向滚动的 表格。而且又要考虑大数据量（行）的展示视图。经过几天的研究终于搞定，做了一个演示。

### 心跳包

chipsemi技术经理

chipsemi · 技术经理 (已认证)