博客转载自:https://blog.csdn.net/sunflower_boy/article/details/50783179

//Img_scanner.c 文件内
int zbar_scan_image (zbar_image_scanner_t *iscn, zbar_image_t *img)

经过Zbar example的分析后发现图像扫描的工作都是由zbar_scan_image完成的,zbar_scan_image主要根据设定的扫描密度(density)控制像素点读取(Z字形),scanner.c文件内的zbar_scan_y()来完成滤波,阈值,确定边缘,转化成宽度流。

//先判断有没有设定y密度
if(ydensity > 0)
{
while(y < h) //y从0以ydensity递增到h
{
  while(x < w) //x先从0递增到w,再递减回0
{
x += 1;
zbar_scan_y();
}
x = w - 1;
y = y+ ydensity //y从0以ydensity递增到h
if(y >= h)
break;
while(x >=0)// x开始递减
{
x -= 1;
zbar_scan_y();
}
x = 0 + 1;
y = y + ydensity;
}
//接着判断x方向扫描密度(xdensity),同理Z字形扫描
}

逐点扫描判断边界,实际的条形码波形不是理论中的方波,而是高斯退化的波,其边界处是凹凸交界的位置。求边界的原理是二阶导数为0或者异号的位置可能为边界即Scanner.c中247行的注释/* 2nd zero-crossing is 1st local min/max - could be edge */

通过第138行dprintf(1, ” thr=%d t=%ld x=%d last=%d.%d (%d)”, thresh, t, scn->x, scn->last_edge >> ZBAR_FIXED, 可以看出关于ZBAR_FIXED是小数位数,ROUND换算下就是0.5。 函数一开头使用EWMA对原始数据滤波,抑制突变。再用y0数组存储邻近点的数据,用来求一阶导数和二阶导数, scn->y0[(x - 1) & 3]很巧妙的限制住了数组索引不越界,循环使用。 紧接着开始求一阶导,二阶导. register int是设置变量常驻cpu,加快执行速度.

但第234行的判断不知何意

if((abs(y1_1) < abs(y1_2)) &&
((y1_1 >= 0) == (y1_2 >= 0)))
y1_1 = y1_2;
//如果y11与y12同向且y11小于y12,则y11=y12

函数

static inline unsigned calc_thresh (zbar_scanner_t *scn)
dx = x - lastedge;
t = thresh*dx;
t /= scn->width;
t /=8;

  

这一段程序主要是为了使thresh逐渐回归到thresh_min,如果dx在8width范围内,则thresh=thresh(1-dx/8w);即如果dx=width,则thresh=7/8thresh。如果dx超出8w范围,则直接置为thresh_min。thresh在每次确定新的边界时更新为此处的y11的0.44倍。

Zbar -- 源码分析的更多相关文章

  1. ABP源码分析一:整体项目结构及目录

    ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...

  2. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

  3. nginx源码分析之网络初始化

    nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...

  4. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

  5. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  6. zookeeper源码分析之三客户端发送请求流程

    znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...

  7. java使用websocket,并且获取HttpSession,源码分析

    转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...

  8. ABP源码分析二:ABP中配置的注册和初始化

    一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...

  9. ABP源码分析三:ABP Module

    Abp是一种基于模块化设计的思想构建的.开发人员可以将自定义的功能以模块(module)的形式集成到ABP中.具体的功能都可以设计成一个单独的Module.Abp底层框架提供便捷的方法集成每个Modu ...

随机推荐

  1. Redis中redis.conf配置总结

    redis.conf 配置项说明如下:1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程  daemonize no2. 当Redis以守护进程方式运行时,Re ...

  2. python--匿名函数lambda

    Python语言使用lambda关键字来创建匿名函数. 所谓匿名,即不再使用def语句这样标准的形式定义一个函数. lambda只是一个表达式,而不是一个代码块,函数体比def简单很多. 仅仅能在la ...

  3. PHPEMS在线模拟考试系统 v4.2

    官网地址 :http://www.phpems.net/ 下载地址 : http://www.phpems.net/index.php?content-app-content&contenti ...

  4. bzoj 4059:Non-boring sequences 分治

    题目: 我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短.一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子序列里至少存在一个数字只出现一次.给定一个整数序列,请 ...

  5. Codeforces 808F. Card Game

    题目大意 一个物品有三个属性 : 价值,键值,等级. 你不能选取等级高于\(level\)的物品,键值之和为质数的两个数字不共存. 问最低的等级使得可以选出价值之和超过\(k\)的物品. \(n\le ...

  6. springCloud组件启动时,提示内部tomcat无法加载

    忘记拷贝当时的异常信息了. 本地启动模块,做测试 大概就是emmble tomcat就是表示内部tomcat无法启动. 出现这样的异常是由于配置中心得代码已经修改,但是没有从git上down下来,然后 ...

  7. c++11之三: sizeof运算符 auto的优势 __func__预定义标识符

    在C++11中,对非静态成员变量使用sizeof操作是合法的. auto推导的一个最大优势就是在拥有初始化表达式的复杂类型变量声明时简化代码.如:std:vector<std::string&g ...

  8. java bean Format注解用法

    @NumberFormat(style=Style.NUMBER)    private int number; @DateTimeFormat(pattern="yyyy-MM-dd&qu ...

  9. [C++] 递归之全排列问题、半数集

    一.递归的定义 一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个原问题相似的规模较小的问题来求解. 二.用递归求解问题的主要步骤 1.找出相似性 ...

  10. Spring Boot 集成Swagger2生成RESTful API文档

    Swagger2可以在写代码的同时生成对应的RESTful API文档,方便开发人员参考,另外Swagger2也提供了强大的页面测试功能来调试每个RESTful API. 使用Spring Boot可 ...