2009年4月29日星期三

An Approach to Korean License Plate Recognition

申明:来源于网络,引用请注明原作者!

论文,下载

firefox和IE下,下载后,是没有扩展名的一个文件(Chrome下正常),拖到你的PDF浏览器后即可打开。
部分内容来自网络,所引内容并不代表认同其观点。本博内容如有不当或侵犯权益,请来信告知!



A Novel Binarization Approach for License Plate

申明:来源于网络,引用请注明出处!

论文:下载
firefox和IE下,下载后,是没有扩展名的一个文件(Chrome下正常),拖到你的PDF浏览器后即可打开。
部分内容来自网络,所引内容并不代表认同其观点。本博内容如有不当或侵犯权益,请来信告知!




2009年4月28日星期二

Google Chrome 背后的天才:不在美国工作的Google员工[转帖]

导读:本文为金融时报》网站发表的一篇人物特写,文章的主角是 Google Chrome V8引擎的开发者拉斯巴克(Lars Bak)。他是一个编程天才,却远离计算机世界的核心,在丹麦为Google工作。

Lars Bak在他的农场

远离计算机世界核心

奥尔胡斯(Aarhus)是丹麦第二大城市,也是日德兰半岛(Jutland)的非正式首府。在该市郊外5英里的地方,有一座改造过的农舍。里面有 宽敞的木地板和拱形的顶(曾经是马厩的一部分),在距离DVD播放机不远的地方摆着一个大的棕色皮沙发。从外面看,这座房子看上去仍略显陈旧:粗糙的石子 路,凹陷得小窗;但正是这里孕育了互联网未来的关键部分之一。

从哥本哈根开车到这里的路程比预期的更漫长,房子也很难找。房子的主人叫拉斯巴克,是一个年轻的编程天才,他之所以把家安在这里是因为他非常不愿意让别人找到自己。他的阿尔萨斯牧羊犬,米奇,见到我们也有些受惊:主人把它看住之后我才敢下车。

那是丹麦寒冷十二月的一天。这地方比爱丁堡还靠北,但天色如同东英格兰沼泽地的一样,灰蒙蒙一片。我们握手的时候,巴克看上去很不自在,我觉得他好 像压根不想让我靠近他的居所。不过,我们还是走进了放有棕色皮沙发的拱形顶房子里。现在这里是家庭影院,之前曾是他编程的办公室。温度只比外面稍高一点。 我拿出笔记本的时候还在瑟瑟发抖。好吧,您想了解些什么呢?巴克发问了。我们有四个小时的采访时间。

拉斯巴克并非家喻户晓的名字至少这个拉斯巴克不是。在丹麦还有一个拉斯巴克更出名,那是一位职业自行车选手。但是这位巴克可比任何运动员对你生活的影响更加深远。他最近的计算机软件程序V8是Chrome浏览器(谷歌商业计划的关键)的一部分。

网页浏览器都不赚钱,无论是IE、Safari、还是火狐。那么,新浏览器对谷歌的重要性何在?为什么要投入时间和精力在免费产品上,而这些又不能 给公司带来收入?答案不在浏览器本身,而在于它能访问的内容:也就是网络应用程序。这些才是给谷歌带来收入的东西。比如,该公司对Google文档寄予厚 望,这是一套在线办公软件,和微软的当代企业工具桌面版Office程序(Word, Excel和PowerPoint)类似。但为了更好地体验获得这些程序和其他在线应用,用户需要更好的浏览器,以便更好地运行相关代码。我们很多人已经 在使用网络程序了,比如Hotmail, Yahoo邮箱或Gmail,不过它们都相对简单,比起一般的桌面软件,它们的复杂性相形见绌。

浏览器已经无法处理日益复杂的网络应用。就好比是很多高性能的跑车跑在辙颠簸不平的路上一样。但是没有哪家跑车制造商会出钱修路,毕竟自己修路对手 也会沾光,更不要提高昂的费用。软件开发的成本不高,但依然存在竞争问题。不过谷歌说它不在乎,它说:没有好的浏览器,大家伙儿都会遭殃。

通过网络访问复杂程序的能力被称为云计算,并且谷歌并非唯一一家声称领先的公司。即使微软,桌面应用软件和操作系统的代名词,也在跃跃欲试。史蒂夫鲍尔默,微软的首席执行官,已经承诺研发在互联网中运行的操作系统他称之为视窗云,不过要想真正实现云计算,必须改进浏览器。

恰在此时,巴克出现了。这个丹麦人首次在加州硅谷引起人们的注意是在1991年,那时他在Sun公司工作,后来成为业界最佳程序员之一。1994 年,他离开Sun,帮助创建了Animorphic系统,该公司后来被Sun收购。再次回到Sun之后,巴克开发了后来成为Java HotSpot(行业标准计算系统之一)的程序。

可是2000年初,他却离开了计算机世界的核心,回到了丹麦,搬家是为了幸福生活,为了他的女儿们(他想让她们上丹麦语学校),为了自己的身心健 康。美国的开发者社区工作很紧张,生活方式不健康。当巴克回到丹麦时,两个月之内他减了20斤(多亏了美国的阿式饮食疗法【Atkins diet】),而且再也没有反弹。

享受工作和生活两个世界中最好的东西

2002年,巴克在奥尔胡斯创建了一家名为OOVM的公司。2004年,他将公司卖给了一家瑞士公司Esmertec,然后又在该公司干了两年,帮 助两个公司的融合。离开Esmertec时,他并不特别想找新项目:他有足够的钱养家糊口,也有各种打发时间的方式,包括粉刷农舍的计划。他估计得要一年 时间。

然后Google的电话就来了。对于Google,巴克是不二选择他编写了JavaScript引擎(Chrome的核心部分)。对于巴克,为 Google工作就是 小菜一碟。我不在乎当什么高级经理。我在乎的是推动技术边界。巴克接受了这份工作,但不会回到加州。事实上他从没打算再次回加州虽然谷歌的人性化办公室闻 名远近,餐厅里的美食,还可以免费理发,巴克却宁可在家工作离总部5000英里,相差9个时区。谷歌做好了信任我的准备。他们知道我不会消磨时间。重新装 修农场的计划要搁置一下。最后,他说,我只有14天的时间(粉刷)。涂料还留着呢。

巴克在日德兰半岛的居家办公室,他和妻子,孩子还有宠物阿尔萨斯牧羊犬米奇住在一起

巴克开始工作,在现在是家庭影院的地方建立了办公室。农舍是围绕院子修的,家就在办公室对面。每天,他走过石子路到办公室,然后开始写代码。每天结 束时,他又穿过院子,走回家,把工作彻底放下。在这些行走之间,他投入到浏览器开发中,有了这种浏览器,其他人就有更多机会做他所做的事:在家工作,与总 部连接,所需要的全部工具就是互联网的力量。

巴克也许是个计算天才,但他是上大学之后才开始接触计算机的。高中的计算机室又黑又臭,只有书呆子才去,他说,我喜欢运动。弹板跳水特酷。我后来才成为书呆子的。

在《局外人》中,Malcolm Gladwell探讨了天才和成功的本源,作者陈述了这样的观点,你需要苦练10000小时才能在所选择的领域里真正成功。我问巴克,你做足10000小 时了么?我能看出来他觉得这压根不相关;他对此也不感兴趣。我只是很高兴大器晚成,他再次强调,而不是年少就成名。

也许是因为大器晚成,巴克从不热衷于传说中那种靠咖啡提神彻夜写编程代码的故事。不过这可能也缘于巴克精通的程序类型:虚拟机,这是计算机科学家 Gerald Popek 和他的项目伙伴Robert Goldberg早在1970年代所探讨的一个想法。虚拟机器名副其实真正机器的计算机世界版,能够在单机程序或整套程序上使用。Chrome浏览器属于 后者。V8,巴克的虚拟机器,编辑不同程序通用的代码,以便减少冗余,让网络应用程序更快运行。

虚拟机是头怪兽,Bak说,没有完美的解决方案,你只能为最佳时机进行优化。有很多技术含量在其中。这是个漫长的游戏,你玩不完的。

工作量是恒定的,他补充说,所以我总要停下来吃饭。你可以有正常生活。对巴克而言,这意味这家庭和隐私。工作/生活平衡的问题在谈话中一再冒出来虽 然他不反对美式生活,但显然他更喜欢丹麦的生活方式。在美国,需要进取和格外自信。欧洲的生活方式则不然。而在美国,你能有晋升机会,能与技术发展保持同 步。在欧洲,你就只能做办公室当经理,没有活可干。通过在丹麦为谷歌工作,巴克意在一箭双雕,同时享受两个世界中最好的东西。

巴克将他的V8项目成为笑话:V8引擎就好像汽车镀铬发动机罩下面安装的那个东西 而Google就那么酷不论项目最初的名字是什么,以后不会改变。不会因适应市场营销而改变名字。

独立并从空白开始开发工作

从开展谷歌项目的第一天,巴克就征募了他以前的学生卡斯帕伦德的帮助。伦德年轻也更外向,他同意来农舍上班。他还有其他作用让巴克娱乐。伦德和他那 竞争力很强的老板习惯于用乒乓和Wii网球来调剂工作。谁的乒乓能赢,我在想;巴克回答说:问卡斯帕。哦,那么卡斯帕能赢喽。不是。稍后,他透了口风:他 打得比我好,不过还是我赢。他们的关系已经从师生变得更像同事,但又不完全是;有朋友把这比作巫师和学徒。

许多程序都是用以前的版本或相关代码创建的,但V8是白手起家一片空白。后来当我在丹麦之旅中遇见伦德时,他很乐于强调这一点:这是最纯粹的编码形式。巴克显然有共识在伦德说话的时候,他不停地微笑。

随着V8深入,项目扩展,巴克和伦德把编写代码从农舍搬到奥尔胡斯的一座大学,巴克在此任教。骑车需要30分钟,把通勤当作锻炼和巴克将工作和生活平衡的哲学不谋而合。

大学办公室虽然在距离上与加州山景Googleplex总部遥遥相隔,不过一看就是谷歌的风格。在进门的地方,五颜六色的椅子和小布袋到处都是,然 后是两个主要房间,有10来个人在这里工作。不过没有餐厅,只有厨房,里面有坚果贩卖机,还有一冰箱的瓶装水和健怡可乐。巴克引入了无糖政策:不是完全无 糖你可以从水果里得到自然糖分。不过没有巧克力,没有明目张胆的糖果而已。

每个人愿意接受这里的管理制度,见证了办公室的忠诚度。好像所有人都骑自行车来上班,下午5点左右就离开。我们开始的也早,累了还工作没有意义,所 以我们就回家,伦德说。这是两小时前巴克在他的农场上给我讲述的工作生涯的逐字描述。这令人心服口服。但和谷歌的人沟通怎么办?当巴克、伦德和其他成员在 奥尔胡斯时间下午5点下班时,旧金山还不过早上9九点。他们是利用硅谷24小时工作的趋势吗,还是并不需要和总部保持联络?伦德说大多数时候用电子邮件就 可以了。我采访的当天,在其他同事下班之后,巴克需要参加电话会议。他努力不把情绪流露出来,但很显然,他并不想参加。

编程可以是很单调的事情。虽然巴克和伦德紧密合作,但还是有种遗世独立的感觉。你写代码,测试,修改,再写,周而复始,直到你得到自己需要的。对于巴克,这很简单,也很隐蔽。然后,出于某种原因,外界就想进来干扰想要认识你,想要了解你的工作。

巴克很看重自己的隐私。在家给他照相也让他明显不自在。但当我告诉他,把他的名字输入谷歌搜索引擎里,得到的都是一页又一页和他同名的自行车手,这肯定遮挡了他本该有的光彩,他耸耸肩,我老了,不在乎别人说我什么。

真正让他恼火的是大家误会他的工作或按他的说法,技术。他举了一个例子,在有篇关于他的文章里,记者混淆了Java和 JavaScript(前者是可以在线进入的独立程序,而后者是依靠浏览器的脚本语言)。对此我们都笑起来,在那么一瞬间,我觉得巴克和我有了默契。

世界以非同寻常的方式发现了Chrome。故事是通过谷歌早前发布的专门漫画传出去的显然犯了个错误。公关忙成一团来支持这个消息,匆匆忙忙地举行了电话会议,发表博客日志解释到底发生了什么,随后又是新闻发布会,然后在Googleplex举办产品展示。

在群情激动地讨论为什么谷歌要发布新浏览器,泄密是不是有意而为之时,认真看漫画的人寥寥无几。虽然是由Scott McCloud(也算是漫画界的传奇人物)编撰的漫画,这可是艰难的工作。讨论的是Java Script (不是Java哟!),CPU和存储器漏洞大多数都不想知道的计算细节。但是这漫画却显示了Chrome特性背后的思想理念,还有独立小组解决拼图各个部 分的方式。巴克和伦德最初出现在第二页上,不过是到了大约三分之一的时候,在第13页,才有对丹麦V8团队的介绍,解释了这个虚拟机器的开发,不过没有提 到为什么V8距离谷歌总部那么远,隔着大陆和海洋。

伦德和巴克喜欢这个漫画。在奥尔胡斯办公室里,整幅漫画都用相框框起,挂在墙上。开始,我觉得这想法很怪异,巴克说。但是我意识到这太有才了。与其他白皮书相比,这要强10倍。大家都觉得这很有趣。

我怀疑他们俩都喜欢它的原因是它平等地对待巴克和伦德虽然与巴克相比,伦德可算是个大块头。让我看上去像个15岁的男孩,巴克说。他矜持地微笑了。

在刚推出的100天内,Chrome就已经吸引了一千万用户。虽然这个数字很震撼,可也只代表在线浏览器使用的百分之一。它还需要假以时日方能与火 狐、IE及其他产品抗衡。去年12月,谷歌宣布Chrome已经结束研发或Beta(测试)阶段,准备在某些个人电脑上作为预选安装的浏览器发行。这样可 以迅速增加用户数量。而且,欧洲委员会与微软就其IE浏览器如何并入视窗(Windows)操作系统所产生的反托拉斯战争以及其他纷争可能会给谷歌这样的 竞争者占领市场的机会。

抛开法律和市场份额不说,技术挑战已经存在了。微软不得不创建比V8更好的东西,巴克说。很多技术观察家很怀疑他们能够在短时间内完成:在测试 中,V8处理JavaScript的速度比最常见的IE浏览器要快56倍。我们一开始就是高标准,巴克说。随后谦虚地加了一句:还算成功啦。

即使Chrome漫画没有让巴克迅速成名,他的知名度在这几个月中也迅速增加。越来越多的人想了解Chrome背后的这个人。他宁可写虚拟机器,也 不愿意管理奥尔胡斯办公室,而且他宁可做其他所有事情,而不是和记者谈话,可那是游戏的一部分,他接受了。话虽如此,他离Facebook的创建者马克 扎克伯格或比尔盖兹还有很远的距离。我问,在漫画出来之后,你有没有收到粉丝的邮件?他笑了:没。不过我也没有收到抱怨的邮件。

背景知识介绍:浏览器大战

互联网在其短短历史中,已经看到各种浏览器的产生,但是主角只有四个:网景(Netscape)导航器,IE浏览器,火狐(Firefox)和Chrome。

说到普遍使用,网景浏览器是第一。每个人都用过导航器部分原因是没有其他正儿八经的替代者而且它用起来不错。然后是微软的IE浏览器,该产品是公司主导产品Windows操作系统的一部分,从而带动着它的增长。截止1998年,IE在使用方面已经取代了网景。

微软被指控违反了反托拉斯法,但那时已经太迟。IE控制了90%的市场份额,虽然有官司在身,时至今日,它还是以默认浏览器的身份安装在世界上绝大多数个人电脑上。网景被美国在线(AOL)收购了,在历经波折之后,于2007年停止研发。

要不是开源社区,事情到此就结束了。开源软件曾是(而且在某种程度上仍然是)微软之鞭。总裁史蒂夫鲍尔默曾说Linux的开源操作系统是癌症。此类 软件由软件开发者团队的人不断改善,他们这么做基本上是什么都不为。劳动果实通常都免费分发。1998年,网景将导航器的代码转换为名为 Mozilla的开源项目火狐正是从此演变而来的。

火狐占了IE市场份额的20%,而且仍在增长。它的众多属性如分页浏览和读取设置在其他产品如浏览器Opera上出现得其实还更早,但是得益于口碑 相传、出色的市场营销和火狐的对于技术水平较高用户的吸引力,它已然成了IE最强劲的挑战者。而且,它是开源的,第三方开发者可以通过创建新应用程序扩展 火狐的容量,让它更加强大。

在2008年谷歌推出Chrome之前,浏览器市场好像成了IE和火狐二者之间的竞争,当然也得提及以Mac为基础的Safari。

Chrome仍然只有百分之一的浏览器份额,但这会增长。有了拉斯巴克的V8引擎,Chrome简直如虎添翼。该浏览器使用许多开源代码和开放标 准,但也引入了一些重要的创新,如独立页面的使用。这听起来很无聊,但其实很至关重要。原因如下:通常,通过浏览器运行几个网络应用程序会导致崩溃。而且 当一个浏览器页面崩溃时,整个程序都需要重启,其他页面上的工作或活动都会丢失。

Chrome的运作方式意味着任何浏览器的崩溃都仅限于当页,所以,如果你在一个页面上写邮件,而另一页面的视频崩溃了,你的邮件并不受影响。你可以把崩溃的页面关掉,继续工作。让浏览器以这样的方式工作好像桌面一样对于未来网络应用程序至关重要。

当然,Chrome的运行速度也很关键。为了网络应用程序能够成功,它们需要反应迅速,否则用户会郁闷。速度、稳定、安全这些都是我们未来在线活动的关键方面。而浏览器则是大门。

注:本文转载自:1986 To Present

原文链接:http://www.1986tp.cn/2009/04/the-genius-behind-google-chrome/



2009年4月27日星期一

MFC中应用OpenCV教程

申明:来源于网络,引用请注明出处!

论文:下载
下载后,是没有扩展名的一个文件,拖到你的word后即可打开。
部分内容来自网络,所引内容并不代表认同其观点。本博内容如有不当或侵犯权益,请来信告知!

2009年4月26日星期日

自信是怎样炼成的[转帖]

转自

本文摘自文汇报《开放你的人生》

关于如何培养自信,很多的书中都有介绍各种理论。但自信是怎样炼成的,用案例最有说服力,这里有几个小案例供大家分享。

  • 有才华就要大胆地展示

1984年,现中国科技部部长、当时还是同济大学力学系研究生的万钢,登上了前往德国的飞机。在德国第一件事,就是跟同伴一起到克劳斯塔尔大学的外办,了解学习计划的安排。当时,外办的老师提出,作为外国留学生,首先必须参加PNDS考试(德语入学考试)。考试半年举行一次,他必须等到秋季参加考试通过后才能开始他的博士学业。万钢当场就很自信地表示:自己的德语这么好,为什么一定要考试?一定要等这么久才开始正式的学习?

外办的老师表示怀疑,来该校就读的留学生不知道有多少,还从来没人敢说自己德语好到不需要考试的地步。但经过万钢用德语毫不妥协的"攻关"之后,外办老师最后只能表态:"如果你真觉得不需要考试,那去跟几个教授谈谈,看看是否可以免试。"

后来,万钢就和外办指定的几个教授聊了整整一个小时,用德语回答各种问题,接受各种语言测试,最终让教授们心服口服――同意免试。万钢也因此成了克劳斯塔尔大学历史上唯一一个没有参加PNDS考试而直接入学的外国留学生。他自己总结说:在该自信的地方就一定要敢于自信,不过分谦虚就是实事求是的精神,有才华就要大胆地展示。

许多人都有过这样的亲身经历,一旦认定某件事不可能取得成功,那么,你就算尽力而为,成功的可能性也大大降低。因为你戴上了心理的镣铐,拒绝了超常的努力,所以也拒绝了奇迹的发生。而你相信自己在擅长和具有优势的方向上的努力,并坚持行动,虽然不一定能够迎来转机,但奇迹发生的可能性肯定会大大增加。

  • 潘杰客初到美国为什么会被看不起?

北京华商会监事潘杰客的人生事业非常开放,他做过国家建设部党委宣传部副部长,当过凤凰卫视的主持人,还创业当过老板,也做过职业经理人。但是他初到美国时,却被身边的同学所看不起。

潘杰客刚去美国时,住在美国的父母家里,吃、穿、用都依赖父母。这在中国人看来,是再习以为常不过了。但是,潘杰客晚上去英文夜校补习外语时,却发现周围的同学都看不起他,并且孤立他。

"我特别骄傲地跟人说我父亲是康奈尔大学毕业的,英文特别好,我还说我父亲教我英文。结果这些同学对我不屑一顾,说我们也英语不行,可我们一样能打工,然后到夜校读书,你竟然还有优越感?你都是靠别人啊!"

最后,潘杰客不得不改变自己:"我在家里住了三个月就搬出来,住在纽约的地下室,因为地下室便宜,并且还在快餐店送外卖养活自己。我觉得,如果我再要兄弟姐妹和父母的帮助,是一种耻辱,因为美国的文化是18岁就开始靠自己,我那时30岁了,所以我必须靠自己。"

这样来看西方国家的家庭教育就很好理解了:一方面,他们淡化家庭之间互相依附的关系,培养孩子独立、自立的意识和能力,个性的文化正是其教育观的体现;另一方面,他们尊重普遍性的人性和人权,实际上也就尊重了孩子的基本权益,并引导孩子养成这样的价值观。

自立并不意味着不需要别人的帮助,而是强调自主,不成为他人的附属物。独立也不意味着排他性或者封闭性,不去学习和借鉴成功者,只是强调要有自己的思考和判断。

  • 克服消极浮躁的心态

前亚洲开发银行驻中国首席经济学家汤敏曾回忆道,1973年,他被派到广西南宁第四中学当数学老师。他高中都没有毕业,但他必须去给一群跟自己差不多大的学生上课。有人这样问他:"你在讲台上如何能够自信?"

汤敏的回答是:克制情绪,保持乐观,然后自学。他经常是"上周自己刚自学完,这周就要给学生上课"。

1977年10月恢复高考,广西考区对考生的年龄限制是25岁,汤敏已经24岁了。他很想参加高考,可有三个原因在向他说"NO":第一,没有把握,除了数学自学过外,英语、物理、化学都没学过;第二,朋友家人不支持,因为他已经有份稳定的教师工作,普通师范大学毕业也不过当一个中学老师;第三,面子问题,和学生一起考试,"压力很大,如果考不过学生或者考砸了,肯定很丢脸"。

人要做成什么事,就不能有那么多的疑虑,人生难免有些尴尬,关键在于保持心态的良好和积极,汤敏这样认为。最后,他参加了考试,并且改变了自己的一生,最终成为中国著名的经济学家。

对于刚毕业的大学生以及初入职场的年轻人来说,最常见的心态问题有两种,一是眼高手低;二是有些自卑,不敢争取机会。

年轻人在找工作之前,应该结合自己的具体情况,包括学历、专业、年龄、籍贯、学习、工作、兴趣、理想等各方面因素,进行综合考虑,进行恰当定位,这样心态的积极才有落点和杠杆。

如何培养良好的心态和情绪,坚定自己的自信,在对200多位成功人士调研的基础上,我归纳出如下建议:

    1. 永远不要有绝对不可能的消极想法;
    2. 确立切实可行的目标,然后树立必胜的信念;
    3. 罗列自己的特长和优点以及能够在竞争中取胜的优势;
    4. 学会宽容该宽容的人包括自己的过失,也欣赏别人以及自己的成就;
    5. 学会感激别人的帮助,培养双赢的合作思维;
    6. 学会乐观地看待身边的人和事,哪怕是一些不如意的。
    • 敢于放弃也是一种冒险

    美国凯雷投资集团董事总经理何欣曾提到过自己一次没有"敢于放弃"的经历。2001年,何欣从INTEL投资部加盟凯雷投资集团担任亚太投资部副总裁。年底,他接触一个韩国"下一代OLED"的有机显示屏项目。何欣看上了这个团队的技术能力和OLED的市场潜力,但这也是一个非常典型的早期项目," 我们开始看这个项目时,只有专利和图纸。"

    第一轮融资,凯雷投入500万美元。随后问题来了:"OLED技术的实现,需要周边配套技术。"技术发明人是个姓金的博士,而金博士团队只有产品研发能力和生产流程的设计,没有生产技术设备的制造能力。凯雷和其他VC第二轮于是又投入1500万美元,可问题又来了,原材料价格上升,公司需要降低生产成本等等。凯雷再次联合众多VC进行了第三轮融资。

    第三次投资之后,问题还是不断。这时,金博士说:"我想辞职。"何欣了解到作为发起人的金博士还有另外一个公司,他的心已经不在这儿了。"在凯雷的带动下有三轮融资,最后项目融资总额接近1亿美元。但第四轮时,我决定不投了。我对团队很失望。"

    最后的损失当然很大。凯雷的亚太基金负责人祖文萃评价说:第一笔投资没有问题,经过8个月的调研,事先的风险都想过。错就错在第三笔投资不应该再追加,出现这么多的问题,说明团队的执行力不行。不能一错再错了,这时放弃也是值得去冒险的行为。

    我们有胆略去冒险,其实就意味着把冒险当作一门战略艺术。我归纳了一些成功人士的经验教训,希望能为年轻人作些参考:

      1. 首先要确立可以专注的核心目标冒险不是无头苍蝇一般乱飞乱闯,或者飞蛾扑火一般莽撞,千万不要异想天开,没有企业能够什么都做得好。
      2. 评估风险。行动前要明确自己所能承受的风险范围,有时不可不做最坏的估算,不要相信这个世界上有大收益却没有风险的好事,天上不会掉馅饼。
      3. 不要拒绝盟友,也切勿替别人去冒险,替别人冒险通常不是件吃力就能讨好的事。
      4. 制定合适的行动计划不要怀着试试看的心态在重要的事上冒险。如果是为了失败而行动,那又是何苦呢?最可怕的事永远是你既不全力去争取成功,又继续投入精力和成本。
      5. 注意随机应变。勇敢不是没有恐惧和担心,问题也绝不会忽视你,到头来你仍然要逐一解决,因此,应该选择最有利的时机做最有利的事。
        • 刘江南立足阿尔卡特公司的"非常道"策划

        阿尔卡特公司中国区副总裁刘江南刚进公司时,他发现公司里每个人都忙忙碌碌,像机器一样定期把自己的工作和业绩变成表格上的数字,逐级上报直至变成公司的报表。而公司的几个核心人物再根据这些数字,把好的分出来拿到市场上去卖了。而他来公司快一个月了,"还不知道自己应该干什么。参加了几次公司的业务会,满篇的专有名词,弄得我一头雾水,不知所云。我甚至怀疑,阿尔卡特是否找错人了。"

        刘江南认为"在这样的公司里,命运不是掌握在自己手里的"。他曾找到公司总裁,但是"总裁说他很忙,顾不上细想我的事……"刘江南意识到,"自己不是这个专业出身,在这样技术很强的公司里,能有什么作为?"经过思考,刘江南认为"要以非常态的作为使自己进入常态",就必须策划一件"公司上下都认为不可能的大事"。

        刘江南的计划就是让中国的国家主席会见公司的最高领导――这是一个"乍看起来有点像铤而走险,但仔细想想实际上是一项风险极小而获利极高的策划"。后来,当CCTV播放中国国家主席接见阿尔卡特公司董事长的新闻时,刘江南一下子受到了公司高层的认可。

        许多人的人生之所以失败,就是因为对自己的人生缺乏主动策划,或者缺乏有效的策划,因此总是被命运和生活所奴役,不能自主人生。

        缺少策划者多半是自己都不知道自己在做什么、不为自己而是为现实生活主控的人,也是"当一天和尚,撞一天钟"随波逐流混日子的人。当然,我们也不会知道他能做出什么来。

        英文的车牌识别综述文章

        英文的车牌识别综述文章

        汉王车牌识别指标

        申明:来源于网络,引用请注明原作者!
        内容来自网络,所引内容并不代表认同其观点。本博内容如有不当或侵犯权益,请来信告知!

        车牌识别技术指标

          1、系统具备对92式民用、2002式民用、警用、2004式军用、武警、港澳式等汽车号牌的计算机自动识别能力。
          2、车牌整牌识别率 ≥95%
          3、车牌定位率 ≥99%
          4、车牌字符识别率 ≥99%
          5、识别速度 <0.15s
          6、抓拍车辆通行速度 <250km/h
          7、图像分辨率 768x576
          8、输出图像格式 JPGE
          9、输出图像色彩 彩色
          10、通讯端口 RS485/RS232串口/以太网
          11、平均无故障运行时间(MTBF) >30000小时
          12、工作电压 165V~240V AC 50Hz±1Hz
          13、功耗 10―15W







        基于Hausdorff距离的多尺度轮廓匹配算法

        来源于网络,引用请注明出处
        论文:下载


        2009年4月25日星期六

        综述性论文——几种车牌字符识别算法的比较


        几种车牌字符识别算法的比较.pdf

        The full "Square Detector" program.//检测矩形的例子

        矩形检测程序,
        浏览
        //
        // The full "Square Detector" program.
        // It loads several images subsequentally and tries to find squares in
        // each image
        //
        #ifdef _CH_
        #pragma package
        #endif

        #ifndef _EiC
        #include "cv.h"
        #include "highgui.h"
        #include
        #include
        #include
        #endif

        int thresh = 50;
        IplImage* img = 0;
        IplImage* img0 = 0;
        CvMemStorage* storage = 0;
        CvPoint pt[4];
        const char* wndname = "Square Detection Demo";

        // helper function:
        // finds a cosine of angle between vectors
        // from pt0->pt1 and from pt0->pt2
        double angle( CvPoint* pt1, CvPoint* pt2, CvPoint* pt0 )
        {
        double dx1 = pt1->x - pt0->x;
        double dy1 = pt1->y - pt0->y;
        double dx2 = pt2->x - pt0->x;
        double dy2 = pt2->y - pt0->y;
        return (dx1*dx2 + dy1*dy2)/sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10);
        }

        // returns sequence of squares detected on the image.
        // the sequence is stored in the specified memory storage
        CvSeq* findSquares4( IplImage* img, CvMemStorage* storage )
        {
        CvSeq* contours;
        int i, c, l, N = 11;
        CvSize sz = cvSize( img->width & -2, img->height & -2 );
        IplImage* timg = cvCloneImage( img ); // make a copy of input image
        IplImage* gray = cvCreateImage( sz, 8, 1 );
        IplImage* pyr = cvCreateImage( cvSize(sz.width/2, sz.height/2), 8, 3 );
        IplImage* tgray;
        CvSeq* result;
        double s, t;
        // create empty sequence that will contain points -
        // 4 points per square (the square's vertices)
        CvSeq* squares = cvCreateSeq( 0, sizeof(CvSeq), sizeof(CvPoint), storage );

        // select the maximum ROI in the image
        // with the width and height divisible by 2
        cvSetImageROI( timg, cvRect( 0, 0, sz.width, sz.height ));

        // down-scale and upscale the image to filter out the noise
        cvPyrDown( timg, pyr, 7 );
        cvPyrUp( pyr, timg, 7 );
        tgray = cvCreateImage( sz, 8, 1 );

        // find squares in every color plane of the image
        for( c = 0; c < l =" 0;" l ="=" result =" cvApproxPoly(">total == 4 &&
        fabs(cvContourArea(result,CV_WHOLE_SEQ)) > 1000 &&
        cvCheckContourConvexity(result) )
        {
        s = 0;

        for( i = 0; i <>= 2 )
        {
        t = fabs(angle(
        (CvPoint*)cvGetSeqElem( result, i ),
        (CvPoint*)cvGetSeqElem( result, i-2 ),
        (CvPoint*)cvGetSeqElem( result, i-1 )));
        s = s > t ? s : t;
        }
        }

        // if cosines of all angles are small
        // (all angles are ~90 degree) then write quandrange
        // vertices to resultant sequence
        if( s < i =" 0;" contours =" contours-">h_next;
        }
        }
        }

        // release all the temporary images
        cvReleaseImage( &gray );
        cvReleaseImage( &pyr );
        cvReleaseImage( &tgray );
        cvReleaseImage( &timg );

        return squares;
        }


        // the function draws all the squares in the image
        void drawSquares( IplImage* img, CvSeq* squares )
        {
        CvSeqReader reader;
        IplImage* cpy = cvCloneImage( img );
        int i;

        // initialize reader of the sequence
        cvStartReadSeq( squares, &reader, 0 );

        // read 4 sequence elements at a time (all vertices of a square)
        for( i = 0; i <>total; i += 4 )
        {
        CvPoint* rect = pt;
        int count = 4;

        // read 4 vertices
        memcpy( pt, reader.ptr, squares->elem_size );
        CV_NEXT_SEQ_ELEM( squares->elem_size, reader );
        memcpy( pt + 1, reader.ptr, squares->elem_size );
        CV_NEXT_SEQ_ELEM( squares->elem_size, reader );
        memcpy( pt + 2, reader.ptr, squares->elem_size );
        CV_NEXT_SEQ_ELEM( squares->elem_size, reader );
        memcpy( pt + 3, reader.ptr, squares->elem_size );
        CV_NEXT_SEQ_ELEM( squares->elem_size, reader );

        // draw the square as a closed polyline
        cvPolyLine( cpy, &rect, &count, 1, 1, CV_RGB(0,255,0), 3, CV_AA, 0 );
        }

        // show the resultant image
        cvShowImage( wndname, cpy );
        cvReleaseImage( &cpy );
        }


        void on_trackbar( int a )
        {
        if( img )
        drawSquares( img, findSquares4( img, storage ) );
        }

        char* names[] = { "pic1.png", "pic2.png", "pic3.png",
        "pic4.png", "pic5.png", "pic6.png", 0 };

        int main(int argc, char** argv)
        {
        int i, c;
        // create memory storage that will contain all the dynamic data
        storage = cvCreateMemStorage(0);

        for( i = 0; names[i] != 0; i++ )
        {
        // load i-th image
        img0 = cvLoadImage( names[i], 1 );
        if( !img0 )
        {
        printf("Couldn't load %s\n", names[i] );
        continue;
        }
        img = cvCloneImage( img0 );

        // create window and a trackbar (slider) with parent "image" and set callback
        // (the slider regulates upper threshold, passed to Canny edge detector)
        cvNamedWindow( wndname, 1 );
        cvCreateTrackbar( "canny thresh", wndname, &thresh, 1000, on_trackbar );

        // force the image processing
        on_trackbar(0);
        // wait for key.
        // Also the function cvWaitKey takes care of event processing
        c = cvWaitKey(0);
        // release both images
        cvReleaseImage( &img );
        cvReleaseImage( &img0 );
        // clear memory storage - reset free space position
        cvClearMemStorage( storage );
        if( c == 27 )
        break;
        }

        cvDestroyWindow( wndname );

        return 0;
        }

        #ifdef _EiC
        main(1,"squares.c");
        #endif

        2009年4月14日星期二

        Re: ANPR/Car number-plate recognition


        Re: ANPR/Car number-plate recognition


        Posted by: "beat.naef"
        beat.naef@yahoo.com

         

        beat.naef



        Mon Apr 13, 2009 3:11 am (PDT)





        Monica,

        I uploaded a small image set taken by an IR LPC to the file/LPR Project dir and some BlobAnalysis-based code.



        Are you working on a LPR project also? If so would you mind sharing your experience and code?



        Regards

        Beat

        --- In OpenCV@yahoogroups.com, Monica Guzman <monait2003@...> wrote:

        > Hi, can you send me a lot of images and videos obtained from your ir camera....

        > Grettings..


        > --- El vie 10-abr-09, beat.naef <beat.naef@...> escribió:



        > De:: beat.naef <beat.naef@...>

        > Asunto: [OpenCV] Re: ANPR/Car number-plate recognition

        > A: OpenCV@yahoogroups.com

        > Fecha: viernes 10 de abril de 2009, 10:26



        > I have also started a LPR project using OpenCV. I am using
        gray-scale images taken by a true IR LPC (Bosch/ ExtremeCCTV Reg-X,
        combined with Axis 241S video server to capture jpg image sequences
        (M-JPEG)) that is installed in the field (actually several LPC
        installations) .

        >

        > I have tried a number of approaches:

        > 1. using the square.c code in the OpenCV src samples (experiment
        with different image smoothing, morphing techniques, etch/ contour
        detection techniques)

        > 2. tested with some SIFT code

        > 3. in the process of testing haar-like feature method

        > 4. in the process of testing background averaging method

        >

        > Approach 1 was initially promising. But when I tested about 100
        randomly selected images against it, the success rate was not very high
        (that maybe a reflection of my lack of experience in computer vision
        technologies and to fine-tune object recognition) .

        > Approach 2 initial tests were not very exciting because not too
        many matching candidates points were found. However, I have not spend a
        lot of time to fine-tune and experiment

        > Approach 3 still need to adapt code and learn more about the technology

        > Approach 4 same as 3

        >

        > I am interested in sharing my experience and data sets and
        starting an OpenSource project on SF anybody interested? Anybody
        interested?

        >

        > Beat

        >

        > --- In OpenCV@yahoogroups. com, Alper Yaman <alperyaman@ ...> wrote:

        > >

        > > You can use bottomhat transform to get rid of trouble in case
        of the same  color of car and plate. In addition, you can use radon
        transform to correct skewing. I tried so many methods to divide
        characters from the plate candidate region. First I extract the exact
        plate rectangle from the plate candidate region. Then I apply global
        threshold and labeling to get characters as objects. I elect the
        noncharacter object by some rules (area, width/length etc.). This
        method has some trouble while the exact plate region is somehow
        connected to the other regions. Does anyone have suggestion?

        > >

        > > Alper

        > >

        > >

        > > --- On Sat, 1/24/09, Carlos Frederico Mendes <opencvlist@ ...> wrote:

        > >

        > > From: Carlos Frederico Mendes <opencvlist@ ...>

        > > Subject: Re: [OpenCV] ANPR/Car number-plate recognition

        > > To: OpenCV@yahoogroups. com

        > > Date: Saturday, January 24, 2009, 3:36 PM



        > > Hi,

        > >

        > >

        > >

        > > I'm a novice in this area, but i already worked on a car license plate

        > >

        > > recognition program, i think you will have trouble to detect the rectangles

        > >

        > > in case the car have the same colour as the background of the license plate.

        > > Fred.


        > > On Fri, Jan 23, 2009 at 7:30 AM, ckd600 <alanp23@gmail. com> wrote:


        > > > Hi all,


        > > > Whilst I await delivery of my Learning OpenCV book, I'm thinking of

        > >

        > > > projects I'd like to look at. One is real-time car

        > >

        > > > license/registratio n plate alpha-numeric character recognition.


        > > > It's probably worth mentioning I had this idea in mind for UK plates

        > >

        > > > which are standard size, font, and colour.


        > > > My first idea of how it would work was like this:

        > > > - Detect rectangles(potentia l number plates) in an image

        > >

        > > > - Extract each rectangle found and try to split in to characters (not

        > >

        > > > sure how I'm going to do this, maybe I can detect the spacing between

        > > > the characters)

        > > > - Run each split character through a SURF scan of the standard UK font

        > > > character set and choose the highest % match

        > > > - Move to the next char



        > > > The only problem I can see is that it wont match if the image is

        > >

        > > > skewed, but that can be overcome by carefully planning the camera

        > >

        > > > position. An advantage is that it wont need to be trained, it will

        > >

        > > > just need a character set to work from.



        > > > What do you think?

        > >

        2009年4月11日星期六

        什么是库(library)

        http://docs.google.com/Doc?id=dcqjrshn_1373gx6cjcfx

        MFC与opencv示例文档

        http://docs.google.com/Doc?id=dcqjrshn_1370cvh8xdfd

        建立工程见

        http://www.opencv.org.cn/index.php/MFC%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%BA%94%E7%94%A8OpenCV

        Doc类中添加变量

        不要建立CImage m_image,改为

        public:

        IplImage *m_image;

        加头文件:

        #include "highgui.h"

        初始化 m_image

        CMFC_testDoc::CMFC_testDoc()

        {

        // TODO: add one-time construction code here

        m_image = NULL;

        }

        在工程中加入以下两个文件

        http://opencv-extension-library.googlec ... CvxWin32.h
        http://opencv-extension-library.googlec ... xWin32.cpp

        stdafx.h中,加入#include "CvxWin32.h"

        CvxWin32.cpp中加入 #include "stdafx.h"


        BOOL CMFC_testDoc::OnOpenDocument(LPCTSTR lpszPathName)

        {

        if (!CDocument::OnOpenDocument(lpszPathName))

        return FALSE;

        // TODO: Add your specialized creation code here

        m_image = cvLoadImage(lpszPathName);

        return TRUE;

        }

        BOOL CMFC_testDoc::OnSaveDocument(LPCTSTR lpszPathName)

        {

        // TODO: Add your specialized code here and/or call the base class

        cvSaveImage(lpszPathName,m_image);

        return TRUE;//CDocument::OnSaveDocument(lpszPathName);

        }

        View类中添加显示图像代码

        void CMFC_testView::OnDraw(CDC* pDC)

        {

        CMFC_testDoc* pDoc = GetDocument();

        ASSERT_VALID(pDoc);

        // TODO: add draw code for native data here

        CvxWin32::DrawToHDC(pDoc->m_image,pDC->GetSafeHdc(),NULL);

        }

        如果需要实现canny

        BOOL CMFC_testDoc::OnOpenDocument(LPCTSTR lpszPathName)

        {

        if (!CDocument::OnOpenDocument(lpszPathName))

        return FALSE;

        // TODO: Add your specialized creation code here

        m_image = cvLoadImage(lpszPathName,0);

        return TRUE;

        }


        void CMFC_testDoc::OnCanny()

        {

        // TODO: Add your command handler code here

        cvCanny(m_image,m_image,50,150,3);

        UpdateAllViews(NULL);

        }

        CvvImage的CopyOf()单通道解决


        另外听说,opencv1.1已经解决这个问题!

        2009年4月10日星期五

        关于CvvImage的CopyOf()函数的问题

        今天发现了一个问题,结果被证实貌似是OpenCV的bug。
        CvvImage cimg;
        cimg.CopyOf(img);
        其中img肯定是个 单通道的IplImage图像,cimg.CopyOf(img);出错。
        把img改成一个3通道的图像就没有问题了,是不是CopyOf只能拷3单通道的?

        我没有办法,又必须用CvvImage ,我用如下笨方法,结果是可以的
        CvvImage cimg;
        cimg.Create(img->width,img->height,8);
        IplImage* timg = cimg.GetImage();
        timg->imageData = img->imageData;//img为单通道

        我在论坛上发帖求助我又尝试搜了一下,看又有其他人遇到此问题
        结果果然有哥们比我先遇到了,呵呵。
        另外如果有用到
        CvvImage 的CopyOf()函数;而调试出错,估计都是这个问题。请注意!

        注: CvvImage 的CopyOf()函数常用于在控件 ID上显示图片。
        转一段代码
        void CTestDlg::DrawPicToHDC(IplImage *img, UINT ID)
        {
        CDC *pDC = GetDlgItem(ID)->GetDC();
        HDC hDC= pDC->GetSafeHdc();
        CRect rect;
        GetDlgItem(ID)->GetClientRect(&rect);
        CvvImage cimg;
        cimg.CopyOf(img);
        cimg.DrawToHDC(hDC,&rect);
        ReleaseDC(pDC);
        }


        2009年4月8日星期三

        基于笔画描述的文字识别OCR系统——技术说明

        基于笔画描述的文字识别OCR系统——技术说明
        时间: 2004-04-28 15:04:08 | [<<] [>>]

        1. 已排除的方法
          以下方法经过我们编写程序代码来实践验证了其不可行性。
          1.1 游程统计法
           思路:统计出点阵中的任意一点向六个角度0°、30°、60°、90°、120°、150°所能遍历的点数。如图2,最上一点往六个方向的最大值是 13,方向为上下方向(90°);又如,最左一点往六个方向的最大值是30,方向为左右方向(0°)。通过统计周围的点,可以轻易得到横竖捌捺点。

          
        图1 “南”字的游程统计

          缺点:文字在有杂点或扫描不清楚时,识别率很低或无法识别。例如:图2的“操”字就无法用游程统计法区分出横竖捌撇。

        图2

          1.2 瘦边法
          思路:对文字的笔画进行腐蚀、细线化处理,从而得到文字的骨架。

        图3 左图是瘦边法的理想效果,右图是黑体、粗体等瘦边后的效果

          缺点:由于黑体、粗体的笔画较粗,在进行腐蚀、细线化处理后,往往造成笔画丢失或产生多余笔画。如图4,由于“操”字有连笔,在使用瘦边法细化后产生了多余笔画,会造成误识别。

        图4

          1.3 X、Y方向归一法
          思路:对文字的笔画按X、Y方向求中点进行简化笔画。
          缺点:同上。
          
          此外,还有汉字特征法、匹配法、字根特征、粗外围特征法、笔画密度法等算法,但经我们编写代码来实践证明其效果不理想,所以在此不一一介绍。

        2. 我们现在采用的识别算法----双识别引擎
          我们采用双识别引擎,即:轮廓笔画描述、边角特征数据库。其中笔画描述是主要的识别算法,边角特征数据库是辅助的识别算法。
          2.1 轮廓笔画描述
           轮廓笔画描述为主要的识别方法,其关键是找出汉字点阵的轮廓,并对笔画的特性、关键性确定取舍。通过上面对传统OCR使用方法的分析,我公司花了近2年 的时间调研、编程测试,用实践来证明了:只有通过分析轮廓,才能更准确地得到横竖捌捺点。游程统计法、瘦边法、汉字特征法、匹配法、字根特征、归一法等算 法都无法成功地描述出笔画。
          原因一:只有基于“笔画描述”才能识别手写体文字,任何边角特征、匹配法、游程统计法等都无法归纳出手写体文字的特征,只能归纳印刷体。所以,“笔画描述”是手写体识别的唯一出路。
           原因二:经过我们编写代码来实践证明了瘦边法、归一法等简化笔画的识别方法是低效的、误差大的算法,这些算法容易丢失笔画或者产生多余的笔画。只有使用 “轮廓”才能体现出手写体文字的原貌,“轮廓”能够原汁原味地体现手写体文字的字形,而且能够实现二维的汉字点阵转化为二维矢量,实现汉字的高效识别。
          通过轮廓来描述笔画,使用许多无关大局的“短边”被“长边”归纳吞并,“曲线”被描述为“两段线段”,“局部凹凸”视周围环境也被归纳合并……这样,一个复杂的文字就被能用“尽可能少”的笔画描述出来。关键技术如下:
          2.1.1 描述轮廓,使用“逆(顺)时针搜索”算法描述出汉字的轮廓。见图5中的左图。
          假设:汉字是Width╳Height的点阵,任意一点都有左上、上、右上、右、右下、下、左下、左这8个方向的邻点。
          首先,x: 0→Width-1, y: 0→Height-1 搜索出一个黑点,该点设为P1;从点P1逆(顺)时针搜索出下一轮廓点P2,再从点P2逆(顺)时针搜索出下一轮廓点Pn……
          2.1.2 使用“切线最陡”算法区分出相邻的两个笔画。描述轮廓之后,笔画描述的关键在于决定从何处开始属于下一段笔画。经理论证明,使用“切线最陡”算法可以算出任意一点属于哪一笔画。见图5中的右图。
          假设:从第一步得到汉字的轮廓点的数组P1、P2……Pn,并且由于二维汉字点阵至少可以得到x、y坐标最大最小极值点(且至少存在4个符合这样条件的点MaxMin1、MaxMin2、MaxMin3、MaxMin4等);
           首先,遍历任意2个极值点(例如:MaxMin1和MaxMin2)之间的轮廓点,如果某一点Px的切线与MaxMin1、MaxMin2所在的直线的 夹角最大,且大于一定的角度Angle(如30°),则该点能把MaxMin1、MaxMin2“至少”分为两段笔画。
          接着,遍历MaxMin1和Px之间的轮廓点,同上步的原理判断是否再分为两段笔画;遍历Px和MaxMin2之间的轮廓点,同上步的原理判断是否再分为两段笔画。
          重复以上的步骤,就可以实现汉字轮廓矢量化。
          2.1.3 无关大局的“短边”被归纳、吞并、省略,一般取矩形的1/8或1/10为参考值,小于该参考值的边就考虑吞并、省略。
          2.1.4 由于描述曲线(撇、捺等)比较复杂,比较两条曲线的相对位置关系更复杂。因此,把曲线描述为两条或多条线段,转换为计算机易于操作的对象来处理。
          2.1.5 宋体字的横或竖等笔画起始端常有一个三角形的凸出点,通过强制记忆的方法,把它们省略。
          这样,所有印刷体、手写体都能用简单的笔画描述出来。

        图5 左图书是“林”的轮廓,右图是笔画描述的效果

          优点:识别速度快,不需要搜索数据库,直接由笔画得到识别结果。如果笔画足够清晰,能轻易地识别不同人书写的手写体,手写体文字识别率达到了80%以上。这正是传统OCR无法比拟的,因为传统OCR不是基于笔画描述的,不能识别或很难识别手写体。
          缺点:如果笔画模糊不清,很难用笔画来描述,如下图。

        图6 笔画描述对这样模糊不清的文字“矗”就无能为力

          解决方法:不要因为某方面的缺陷,而放弃一种不错的算法。使用下面介绍的第二种识别引擎,取长补短。


          2.2 边角特征数据库:改进型四边轮廓特征
          2.2.1 传统OCR的识别算法----四边轮廓特征法
           思路:每一汉字用32╳32点阵表示,分别从上下左右四个方向扫描汉字点阵,得到四个数值P1、P2、P3、P4,把这四个数值存入数据库。通过大量的 学习、记忆,得到一个所有汉字的四边特征数据库。用该方法识别汉字时,系统会从数据库中检索出一个最相似的汉字,得到识别结果。经我们编写程序、测试发 现,用该方法对印刷体文字进行识别,识别率可达60%以上。

        图1 “木”字的上边特征

          评价:中等

          2.2.2 改进型四边轮廓特征
           传统OCR的四边轮廓特征法,识别率不高,如:“国”、“囚”、“四”、“因”等字,因为它们的四边特征值是相同的,使用此方法无法区分、无法识别。因 此,我们使用提出了新的构思,使用新的算法:在汉字内部再次切割(按1/4切割),切割后再取四边特征Q1、Q2、Q3、Q4,这样,一个文字就的特征描 述就是P1、P2、P3、P4、Q1、Q2、Q3、Q4。通过大量的学习、记忆,得到一个所有汉字的内外四边特征数据库。识别汉字时,从数据库中检索出一 个最相似的汉字,得到识别结果。经过我们这样的改进,印刷体文字识别率达到了80%以上。

        图4 “囚”字按1/4切割后得到右边的图形

          评价:良

           通过以上同时使用两种识别引擎,扬长避短,印刷体文字的识别率提高到99%以上,手写体文字的识别率提高到90%以上。其中最显著的就是:成功解决了手 写体识别的关键问题。传统OCR识别局限于某种识别方法,无法同时解决模糊不清的印刷体、变形较多的手写体,而我们提出的两种识别引擎,将能轻易地解决这 种问题,并能在识别率、识别速度上有质的提高,可扩展性较强。

        欢迎访问、交流!对本博客有何建议,请
        来信告知!
        本博内容来源于网络,如有不当或侵犯权益,请来信告知,将及时撤除!
        如引用博客内容、论文,请注明原作者!

        Google一下本博客

        • 《Getting Things Done》读书笔记 - 本文来自 inertial 原创投稿。 我第一次听说《Getting Things Done》这本书的时候误以为它和世面上的那些成功学书籍没什么区别,后来在不少书中看到了这个名字,也看见了很多人的推荐,由此产生了很大的兴趣。上个月正好有不少空闲,就抽时间把这本书读完了。 本来打算读英文原版,但是原版的生...
          5 年前
        • [原]Linux下编译使用boost库 - Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一。 Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响甚大,是不折不扣的“准”标准库。Boost由于其对跨平台的强调,对标准C++的强调,与...
          6 年前
        • [原]猎头、培训与咨询的价值(2)【补1】——北漂18年(93) - 【上期用手机写的,同时用语音输入转化成文字,错字较多,经好友霍师傅提醒本期重写,并增加一部分新内容】 简单谈下我对猎头、培训与咨询的看法。三样都干过,算是有些浅见。 猎头 简单的说就是人才中介。虽然在公司看来是可以直接解决现有企业问题的一个直接方法,但很多时候都不太管用。 猎头费一般是人才的一个月月...
          6 年前
        • OpenCV統計應用-Mahalanobis距離 - Mahalanobis距離是一個可以準確找出資料分布上面極端值(Outliers)的統計方法,使用線性迴歸的概念,也就是說他使用的是共變數矩陣以及該資料分布的平均數來找尋極端值的產生,而可以讓一群資料系統具有穩健性(Robust),去除不必要的雜訊訊息,這邊拿前面共變數矩陣的資料為例,並且新增了兩個點座標向量來做...
          15 年前
        • 努力推进模式识别实际产品的开发与应用 - Salu 无论是手写体识别、文档处理、人脸识别、基于内容的图片搜索、嵌入人工智能的搜索技术、虚拟网络社区、还是其它相关新科技下的信息整合领域,现在都在努力实用化。 前两年、即使现在还有很多人在抱怨说人脸的方法都不能用,但是就今年出现的和正在做的有关人脸识别实际应用的各种形式的产品可以说如雨后春笋。这是一个趋...
          16 年前