浅谈OpenCV[轉]

     OpenCV是一个由Interl公司支持的开源机器视觉库,关于它的介绍,网上随便一搜就车载斗量。这里我不谈OpenCV的主要内容,而是将这段时间来对它的使用心得作个简单介绍,以启发打算用这个库的朋友的思路,与大家一起来分享。

     我在学校的时候,虽然是图像处理研究方向,但真正具体的应用到图像的很多东西,还是在参加工作以后的事。以前在处理图像的时候,我们从不担心速度的问题,以为计算机硬件发展到今天,无所不能的了,双核乃至四核的处理速度简直要赶上宇宙飞船了。但用在机器视觉上,那又是另外一码事。通常而言,机器视觉要求对图像的处理速度都是以毫秒(ms)为单位,具体而言是几点几个毫秒,硬件再硬,如果算法不好,速度就永远提不上去,所以速度还是至关重要的东西,并不是所谓由硬件技术就决定了的。

     速度是一个方面,精度又是另一个重要方面了。视觉中对精度的要求,通常是以亚像素标准来衡量的。所以对图像处理的算法,不是一般的算法来解决,往往都得使用子像元算法,这样才能达到亚像素标准。通常我们对一幅图像的像素坐标都是用整数计算,但在机器视觉中普遍采用亚像素标准,都是浮点数来计算的。但有的虽然写出来的是浮点数,未必就是用的子像元算法,它的结果根本就不是亚像素。视觉中精度的要求,也是要求极高,一般以微米(um)为计量单位,像几点几个微米,而只有使用子像元算法才能真正达到这个要求。

    总的说来,目前国内还没有一个真正意义上的成功的机器视觉开发包,国内的机器视觉方面的大公司基本上还是以代理国外的软件为主。一方面固然是国内的起步晚,但我觉得更多原因还是国内在这方面没有下功夫去做一些基础性的研究工作,总是靠代理别人的东西来实现一个视觉系统的开发。而OpenCV就是一个在机器视觉方面基础工作做得最好的。

    总的说来,OpenCV提供的函数库涉及的方面很广,图像处理功能强大,但它仅仅是供研究的一个基础的东西,并不是一计膏药,往哪一贴哪就好使。我们只有在借助它提供的一些基础功能上进行深入研究,才能开发出属于自己的产品来。

     OpenCV作为一个开源的函数库,为我们提供了很多方便,看它的源代码,确实有很多值得学习的独到地方。但作为开源的,局限也就在此。它的很多东西并不是最优的,如果真要那样,直接就可以拿来在商业上运用了。所以,我们只有不断的对它进行改造,才能更贴近我们的应用,这里结合我在使用的几处加以说明。

     首先是图像的定位。OpenCV也提供了一个图像匹配的函数,这个函数还是写的不错的,但要直接用到商业上就不行了。因为它的处理速度很慢,精度也不是亚像素的,而且没有旋转。它仅仅是一个单纯的灰度定位。要怎么用好这个函数呢,在使用这个函数的时候,我还是下了很多功夫的,对此做了一些改进,让它真正的实现了商业价值。如今我用OpenCV编写的定位软件,其速度和精度丝毫不比国外的那些名牌软件差多少,像halcon和sapera这样的软件巨头,我用OpenCV做出来的定位效果,比如一幅分辨率为1280*1024的图像,它们的速度是几个毫秒,而我做出来的也最多多3至4个毫秒,精度也差不多,但由于OpenCV本身不是亚像素的局限所在,所以精度通常在一个像素左右。   

    再说说几何定位,halcon是采用基于几何形状的算法来进行定位的,可以说做得非常的好,好就好在它的模版图像形状可以任意选取,任意旋转。而Sapera的基于边缘轮廓的定位还要上一个层次,关于它的算法,目前还没有人了解,至今还是个谜。在很多机器图像定位上,几何定位效果更好,更准确。灰度定位在一些图像区域直方图相近似的情况下,往往很难找准目标区域。而几何定位,根据区域的几何特征来做出判断,不单准确,而且执行起来效率更高。目前我用OpenCV做的几何定位总体上说效果还不错,但精度还赶不上,在图像边缘的离合上还不那样准确,不过在后续的研究中,还是会赶上的。

     一般而言,对于图像的目标区域都是有形状的,但在实际运用中,我遇到一个客户只要求定位直线的,由于直线不属于一个有形状的区域,它的特征很难描述,所以看似最简单的却最难办。OpenCV采用Hough变换来检测直线和圆,效果也并不好。因为Hough变换的实质也就是两种不同空间的映射,它在噪声大的图像中,检测出来的结果千奇百怪。所以要准确的找到边,必然得对图像做好预处理,让处理后的边缘很明显表现出来,再进行Hough检测就容易多了。

    在机器视觉中,Blob分析是要经常遇见的,OpenCV也有Blob跟踪的实例,但我没去认真用过,而是自己做了个算法采用它也实现了,且效果也不错。我在做一个啤酒瓶磨具号码检测的项目里,就调用了自己设计的Blob分析算法,效果都还不错。在具体使用中,往往要用到我们自己定义的图像类型,于是我又把OpenCV里的IplImage结构进行了改造,然后定义了属于自己的图像类,可以随意读取,这样方便了很多。其实OPenCV里面对文件的操作写得相当好,非常方便。

    总的来说,OpenCV是一个非常不错的开源项目,有很多东西需要我们去学习。但它的源代码,要读明白也非易事。因为它涉及到大量的宏定义,很多函数语句都是些宏定义在里面,还互相嵌套,看起来相当的困难。而且本人接触它的时间也不过两三个月,所以理解得也不透彻。还得一边用一边学,在实践中摸索和消化。在此只为提示一个思路而言,个中算法不便言明,否则老板看见,定然要批评了。商场如战场,一切都要做好保密工作,哈哈!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【pyqt5学习】——tablewidget控件学习

目录 1、Table Widget 1.QTableWidget不能在mainwindow中随主窗口的大小变化? 2.将表格变为禁止编辑: 3.设置表格为整行选择 4.单个选中和多个选中的设置: 5.表格表头的显示与隐藏 6.对表头文字的字体、颜色进行设置 7.在单元格里加入…

吴忠军 - 如何理解马云所说的月入两三万,三四万的人最幸福?

这句话源于一段两分钟的视频,马云的一次阿里内部会议演讲。 马云坦承,自己从第一天起就没想过当首富,还为此稀释公司持股,“没想到把自己的股份降到8%,还是有那么多,这是我没有想到的。” 在马云看来&#…

iOS小知识点(非UI部分)

1。 _cmd 表示当前方法的SEL指针, - (void)putString{} 对于这个函数_cmd 等效于selector(putString)转载于:https://www.cnblogs.com/dongfangchun/p/5341599.html

jQuery 操作 CSS

jQuery 拥有若干进行 CSS 操作的方法。我们将学习下面这些: addClass() - 向被选元素添加一个或多个类removeClass() - 从被选元素删除一个或多个类toggleClass() - 对被选元素进行添加/删除类的切换操作css() - 设置或返回样式属性转载于:https://www.cnblogs.com/…

彩色CCD相机工作原理

原理 黑白(单色)相机 CCD原理并不复杂。我们可以把它想象成一个顶部被打开的记忆芯片。因此光束可以射到记忆单元中。根据"光电效应”,这些光束在记忆单元中产生负电荷(下图中右上部分)。 曝光后&…

Linux 系统常用命令汇总(二) vi 文本编辑

文本编辑vi命令作用文件名编辑文本文件,若文件不存在同时创建该文件Ctrlf向后翻一页Ctrlb向前翻一页Ctrld向后翻半页Ctrlu向前翻半页光标移动到下一行-光标移动到上一行数字空格光标向右移动n个字符0移动到本行首个字符处$ 移动到本行最后一个字符处H光标移动到屏幕…

图像处理与计算机视觉:基础,经典以及最近发展(2)图像处理与计算机视觉相关的书籍

1. 数学 我们所说的图像处理实际上就是数字图像处理,是把真实世界中的连续三维随机信号投影到传感器的二维平面上,采样并量化后得到二维矩阵。数字图像处理就是二维矩阵的处理,而从二维图像中恢复出三维场景就是计算机视觉的主要任务之一。这…

【HTML学习】——HTML常见标签属性和方法介绍

目录 1、HTML分块--------< div> 2、HTML段落--------< p> 3、HTML标题--------< h1>…< h6> 4、HTML链接--------< a> 1)< a href“http://www.baidu.com”>百度< /a>&#xff08;点击百度&#xff0c;直接跳转到网页&#xf…

开发者应警惕的七种糟糕职业规划错误

那些心灵鸡汤式的说辞总爱美化失败&#xff1a;失败是成功之母啦、失败使人成长啦、别畏惧失败等等。但事实上&#xff0c;这种思路在软件开发领域也许并不适用——至少不完全适用。每位开发者在职业生涯中都不可避免会遭遇失败&#xff0c;但为什么不从他人的经验中汲取教训来…

Splay模板

打LCT的时候发现Splay很不熟, 因此这里贴一下模板 洛谷P3369 https://www.luogu.org/problem/show?pid3369#sub /* 提一些要注意的点: 1. 注意判断边界, 不要访问到空节点 2. 每一次操作或访问完以后, 记得要splay到root 3. insert操作只要update当前节点和父亲节点即可, 因为…

图像处理与计算机视觉 基础、经典以及最近发展

申明&#xff1a;本文非笔者原创&#xff0c;原文转载自&#xff1a;http://blog.csdn.net/liuyue2046/article/details/12658441 ***************************************************************************************************************************************…

【HTML学习】——一个网页HTML编程的构成

目录 1、html网页构成介绍 2、HTML标签介绍 全部的html标签&#xff1a; HTML: HyperText Markup Language | MDNhttps://developer.mozilla.org/en-US/docs/Web/HTML 一个网页文件一般由.html结尾的文件组成&#xff0c;主要由不同的标签对和内容组成&#xff0c;常见的html…

hbase里插入big int数据用Phoenix查看的报错问题

Phoenix建表create table "test_big_int"("ROW" varchar primary key,"ci"."column1" bigint) 在hbase里put数据hbase 里面进行put: put test_big_int,001,ci:column1,1 在Phoenix里进行查看&#xff08;问题出现&#xff09;第二个尝…

机器学习:利用卷积神经网络实现图像风格迁移 (一)

相信很多人都对之前大名鼎鼎的 Prisma 早有耳闻&#xff0c;Prisma 能够将一张普通的图像转换成各种艺术风格的图像&#xff0c;今天&#xff0c;我们将要介绍一下Prisma 这款软件背后的算法原理。就是发表于 2016 CVPR 一篇文章&#xff0c; “ Image Style Transfer Using Co…

jquery中attr和prop的区别

在高版本的jquery引入prop方法后&#xff0c;什么时候该用prop&#xff1f;什么时候用attr&#xff1f;它们两个之间有什么区别&#xff1f;这些问题就出现了。 关于它们两个的区别&#xff0c;网上的答案很多。这里谈谈我的心得&#xff0c;我的心得很简单&#xff1a; •对于…

博客园自定义样式

碎碎念&#xff1a; 已经很长时间没有更新过博客了&#xff0c;分析一下&#xff0c;一个是太懒了。。。所以很久没整理一下了。还有就是嫌弃博客园默认的博客界面真的太丑了&#xff0c;作为颜控的我真的无法忍受啊。个人比较喜欢用makedown来编写博客&#xff0c;但是博客园自…

【CSS】——cascading stylesheets层叠式样式表

目录 0、CSS介绍 1、CSS语句组成 2、CSS选择器的选择方式 1&#xff09;CSS选择器的方式和选择器大全&#xff1a; 2&#xff09;常见的三种方式&#xff1a; 3、添加CSS方式 1&#xff09;外部样式表 html调用css代码 css文件 html文件 展示 2&#xff09;内部样式表…

四 Apache Axis2 部署 WebService

最新版本1.7.4发布日期2016-10-21 Axis2官网下载如下文件&#xff1a; axis2-1.6.2-bin&#xff1a;二进制的axis axis2-1.6.2-docs&#xff1a;帮助文档 axis2-1.6.2-war&#xff1a;axis.war 文件 axis2-eclipse-codegen-plugin-1.6.2&#xff1a;Eclipse axis client 插件 a…

安装OpenCV:OpenCV 2.4.8或OpenCV 2.4.9 +VS 开发环境配置

因为读研期间的研究方向是图像处理&#xff0c;所以浅墨这段时间闭门研究了很多OpenCV和图像处理相关的知识与内容。眼看自己积累到一定的程度了&#xff0c;于是决定开始开设这个OpenCV系列专栏&#xff0c;总结自己所学&#xff0c;也分享知识给大家。 好了&#xff0c;这篇文…

powerdesigner中如何在自动生成建表SQL时添加模式名schema

1、在主菜单中选择“模型”→“users and roles”→“users”&#xff0c;新增一个user&#xff0c;其中"name"字段就是要添加的模式名。 2、在新增表时&#xff0c;在表属性的“general”页签中选择"owner"&#xff0c;选择刚才新增的user&#xff0c;即可…