欢迎来到福建省加一伟业机电有限公司官方网站,涵盖全系列工业相机、智能相机、智能读码器、立体相机、视觉控制器、算法平台、镜头及相关配件!

工业相机代理海康威视

海康威视工业相机福建总代理是以视频为核心的物联网解决方案提供商

全国咨询热线: 0592-5908095

当前位置网站首页 > 新闻资讯 > 公司动态 > CCD工业相机分类,编程流程及SDK接口使用汇总

CCD工业相机分类,编程流程及SDK接口使用汇总

来源:加一伟业 发布日期:2020-04-21

  CCD工业相机分类

  典型的一般包括如下部分:光源、镜头、相机、图像处理单元(或图像捕获卡)、图像处理软件、监视器、通信/输入输出单元等。创盈时代下面主要为大家对相机分类进行详细的介绍。

  相机作为机器视觉系统中的核心部件。相机根据功能和应用领域可分为工业相机、可变焦工业相机和OEM(Original Equipment/Entrusted Manufacture,原始设备制造商或原产地委托加工)工业相机。

  工业相机可根据数据接口分为USB2.0、1394Fire Wire和GigE(千兆以太网)三类,其中每一类都可根据色彩分为黑白、彩色及拜尔(彩色但不带红外滤镜)三种机型;每种机型的分辨率都有640*480、1024*768、1280*960等多个级别;每个级别中又可分为普通型、带外触发和数字I/O接口两类。值得一提的是,部分机型带有自适应光圈,这一功能使得相机在光线变化的照明条件下输出质量稳定的图像成为可能。

  可变焦工业相机,也叫自动聚焦相机、缩放相机,分类相对简单,只有黑白、彩色及拜尔三大类。该系列相机可通过控制软件或SDK(Software Development Kit,软件开发工具包)调节内置电动镜头组的焦距,而且该镜头组还可在自动模式下根据目标的移动而自动调节焦距、使得相机对目标物体的成像处理最佳质量。与工业相机相似,可变焦工业相机中也有部分款型提供外触发与I/O接口,供用户自行编程使用。

  OEM工业相机在分类方法上与普通工业相机基本相同,最大的区别只是在于OEM相机的编号已含有可变焦工业相机的OEM型号,所以其产品列表略长。与工业相机相似,OEM工业相机中也有部分款型提供外触发与I/O接口,供用户自行编程使用。

  工业相机编程流程及SDK接口使用汇总

  1.工业相机编程模型和流程

  不同的工业相机提供不同的编程接口(SDK),尽管不同接口不同相机间编程接口各不相同,他们实际的API结构和编程模型很相似,了解了这些再对工业相机编程就很简单了。

  DMA技术

  DMA是一种高速的数据传输操作,允许在外部设备和存储器之间直接读写数据,既不通过CPU,也不需要CPU干预。整个数据传输操作在一个称为"DMA控制器"的控制下进行的。CPU除了在数据传输开始和结束时做一点处理外,在传输过程中CPU可以进行其他的工作。这样,在大部分时间里,CPU和输入输出都处于并行操作。因此,使整个计算机系统的效率大大提高。

  对于工业相机来说,当CMOS或CCD芯片曝光然后将数据转到相机缓存后,这时候DMA会负责将缓存中数据保存到硬盘上指定位置,正好满足相机高速大数据的传输。一般都会使用DMA来完成实时的数据采集和保存。

  多数时候,DMA控制器存在各种接口的图像采集卡中,包括1394/GigE/USB/Camera Link等,这些采集卡有自己的时间控制单元完成和相机曝光的同步,并控制DMA的存取行为。

  工作流程

  当相机工作时,就是连续的采集-处理-采集-处理...的过程,但是这就存在一个问题,如果采集的速度比处理速度快,处理不过来,怎么办?在实际中,我们使用队列来解决这个问题,当前帧没有处理完,下一帧到来时直接放入队列等待当前处理完成后再处理它。

  如下图

  这里使用三个队列完成采集和处理同步。

  DMA队列:当CMOS或CCD芯片曝光然后将数据转到相机缓存后,这时候DMA会负责将缓存中数据写入到“DMA队列”头Buffer中。

  准备队列:一旦“DMA队列”头Buffer被填充完成,会被加到“准备队列”尾后,这时候会发送中断通知用户程序:当前又有一帧数据采集完成,您看着处理吧。

  处理队列:当用户接收到中断会自动跳转到中断函数中,使用GetFrame拿取“准备队列”头Buffer,然后加到当前用户程序“处理队列”尾,用户程序从“处理队列”头拿取Buffer处理完成后使用PutFrame将Buffer再添加到原始的“DMA队列”尾。

  需要说明如下几点:

  1.这里的初始队列为1-10,都是初始分配为DMA队列的,这个内存分配和释放过程有的SDK是自己负责的,有的则需要用户自己分配和释放,SDK只负责托管使用。

  2.一般最开始注册一个中断处理函数,当“准备队列”填充完成会自动跳转到中断函数中,借此完成同步操作。也可以是用户自己维护同步结构体,使用查询和等待的方式判断“准备队列”头是否填充完成,是否该用户程序获取数据和处理了。

  3.如果用户处理任务非常简单,可以去掉“处理队列”,每次直接GetFrame->处理->PutFrame。如果用户处理任务比较复杂而不希望出现丢帧的现象,则需要用户使用“处理队列”来保存所有可用的Buffer。

  4.这里队列也只是能够解决处理速度比采集速度慢少许的情况,主要是对不同处理速度做平均来保证采集和处理同步。如果每一帧的处理时间太长,这时候“DMA队列” Buffer全部转移到“处理队列” Buffer,就会出现异常情况,这时不同的相机会有不同的处理方法。

  数据传输和显示流程

  如图,每个相机可能有不同的流采集器(Grab Streamer)或同一接口上安装了多个相机(也对应多个流采集器),对应多个通道(Channel)。对每个通道来说,在实际采集时数据传输实际上是拆分成如图的数据包(Packet) RawData形式传递的,内存中存储形式为一维数组,在每一帧图像的起始存在不同的标识表明一帧的开始和结束,每一个Packet都有标识表明当前所属的通道。为了显示图像,用户程序需要重新将一维数组数据拼装成图像形式,这一过程由用户完成,通常可借助OpenCV或MIL等图像处理包完成该操作。

  编程模型和流程

  对于相机来说,常见编程时我们关注三个对象——相机对象、采集对象、参数对象。

  相机对象(Camera Object):负责相机的连接、断开等工作。

  采集对象(Grab Streamer):负责相机的采集队列分配、相机单帧、连续采集。

  参数对象(Parameter Object):负责相机参数的设置。

  不同的SDK可能安排不一样,一般来说要不是三种对象的功能合并到“相机对象”中,要不是分为三种对象,其实采集对象和参数对象都是在“相机对象”上封装而来。

  通用编程流程如下图:

可以看到相机编程需要做三方面工作:

  1.初始化操作

  首先初始化相机驱动Com环境,然后遍历得到当前的相机列表,根据相机ID或List 编号选择对应相机。

  之后连接指定相机,首先设置本次采集的相机参数(帧速、图像大小、缩放比等),然后是分配和注册当前DMA队列,这里有的是用户完成,有的是SDK完成。

  之后先开启DMA逻辑等待相机采图,然后使相机开始工作采图,整个系统就按照之前工作流程运作起来了,许多SDK将“开启DMA”和“相机开始工作”合并为“开始采集”。

  2.结束操作

  先停止相机工作再关闭DMA逻辑,许多SDK将“开启DMA”和“相机开始工作”合并为“结束采集”。

  然后清理DMA队列,和分配时对应,这里有的是用户完成,有的是SDK完成。

  最后断开相机并清理工作环境。

  3.中断响应操作

  当相机一帧采集完成后,自动跳转进入中断回调函数,这里分了两种中断回调函数。

  第一种为简单的取Buffer->处理->放回。

  第二种结合Windows的消息队列,在此处再给一个“处理队列”,给处理一个缓冲时间。

  这里的处理包括常见的图像处理、计算和显示及RawData拼装为图像等用到Buffer的地方。

  前面也说过,常用的是中断响应处理,除此之外,自己去查询Buffer填充状态并作相关同步操作在某些场合也会用到,这个请查询不同相机SDK给出的同步方案。

  差不多所有的工业相机SDK都是这样的编程模型和流程,AVT 1394相机和Basler Camera Link相机和AVT GigE相机相关代码在笔者网站可下载,还有之前讲的Basler Pylon SDK相机编程,他们基本流程都是一样,恕不详述!

  转载自: http://blog.csdn.net/wenzhou1219

  2. 工业相机SDK接口使用总结

  相机调用

  我们利用相机采集图像,首先要对相机进行相关参数设置及控制,这需要对相机的SDK包比较了解,一般相机厂家都会提供相机SDK,其中包含用户手册和调用Demo,这些都大大降低了调用门槛,提高了二次开发用户的效率。目前用过Balser、海康、大华等相机,其实都是一个套路,都是按照下面几个步骤进行的。

  1)枚举设备

  2)创建句柄

  3)打开设备

  4)开始抓图

  5)获取一帧并保存图像

  6)停止抓图

  7)关闭设备

  8)销毁句柄

  相机同步

  若是开发过程中用到双目或者多目的话,则需要外接同步触发器或者外部触发信号,通过相机同步触发线来实现同步问题。以实际应用过的Basler acA1300-200uc为例,其相机同步触发线具体类型如下:

  1 -—— +12 VDC 红

  2 —— I/O Input 1 黄

  3 —— VCC(加电阻) 蓝

  4 —— I/O Out 1 绿

  6 —— DCcam Power GND 黑

  0000—— I/O GND 白

  3. Basler Pylon工业相机SDK的使用

  Pylon库有C++ .Net等各种封装版本,一般用C++版本,功能全面效率高,但对于不同接口(GigE USB3.0 CameraLink)的相机必须对应使用不同的类,之间不能通用。

  基于GenAPI通用相机抽象接口使用的是Node结构,以字符串形式访问相机参数,可以统一管理不同接口类型的相机。但效率低,使用不方便。

  Pylon高层用C++封装,形成本地相机对象

  如何管理多个相机,最靠谱的方法是按相机ID标定顺序,需要读一个配置文件,比如XML或JSON,然而一开始不知道ID,需要先列举出来。

  4.Pylon 以实时图像采集讲解PylonC SDK使用流程

  一般的对于提供硬件编程来说,硬件生产厂家都会提供好SDK使用的手册和实例。手册中一般包括安装和配置流程,一些基本概念的介绍,SDK每个函数使用,SDK使用流程和实例(有些硬件实例直接写在手册中,有些会以单独文件存在,还有的两者皆有)。对于上位机软件开发人员来说拿到一个硬件上位机编程任务。

  首先应该阅读了解其SDK概念,再按照其介绍的SDK开发流程阅读其提供的实例,修改相应的实例为自己所用,有不懂的函数查询一下其用法即可。有些开发人员习惯性的去记其API,这是费时费力的做法,并不推荐。下面主要以实时图像采集讲解Basler相机的PylonC SDK的使用流程。

  PylonC SDK的使用的总体流程图如下:

  下面是其中对于不同的工作要求,加载相机对象和卸载相机对象是通用的。而要使用其他模块,如事件对象时,相应的改为加载事件对象和卸载事件对象,以及使用事件对象完成相关任务即可。编程时一定要对整个流程做好规划,特别是硬件编程时一定留意内存泄露,前面分配的资源一定要在后面释放。

  下面是五个大流程的详细解析,需要的地方已经加以说明,并注解了需要用到的函数

  加载相机对象

卸载相机对象

加载数据流抓取对象

卸载数据流抓取对象

单帧或连续抓图过程

按照以上介绍的流程即可实现实时图像采集

  源代码下载链接:http://download.csdn.net/download/wenzhou1219/8721495 (点击阅读原文进入) 。很多人问我要源代码,翻了以前的程序文件夹找到了这个程序,演示了利用Pylon SDK进行相机采集的过程,使用MIL完成界面显示,采集部分封装成了类,可以直接重用。测试相机为Basler相机。注意Pylon仅完成Raw Data的采集,使用MIL的MbufPut完成图像数据的重组,然后MIL自动显示。

  在工业控制当中,用到basler工业相机sdk编程,主要是使用c或者c++,当项目庞大时,又需要良好的用户界面,用C++是不错的选择。

  以实例和看过的一些参照讲讲PylonCppSDK使用流程。

  首先,同C一样,这里给出一个bolg链接,写的不错,即上面文大侠这篇http://blog.csdn.net/wenzhou1219/article/details/7543420。

  从中我们知道,总的开发流程图如下:

  那么,用C++开发也大抵如此。

  这里我们看一个basler的cpp sample:

  把这个和上面的流程图对比理解,再看看文档和sdk的结构,理解起来就容易多了。

  5.关于使用维视工业相机 SDK 采集图像的问题

  问:最近一直在研究怎么用相机的SDK采集图像且能实时采集。用的维视MV-1300UC,它提供了DEMO,还有说明文档(一些函数的定义),我发现例子里面没有给出类,就直接定义类中的函数,看不明白。有开发经验的老师吗?给点指导,自己一个人学习一点进展也没有,谢谢!

  答:

  引用

  工业相机的SDK,为了通用性应该提供的是C接口

  既然如此,例子中的类应该就只限那个例子有效,并不是使用该相机必须的

  只要你看懂了每个函数的功能,用不着照抄例子中使用的类

  有包含文件(.h)和静态链接库(.lib)我看了例子都没有看到主函数基本都是void 类名::函数名(){ }这种形式。

  所以说你的问题在于看不懂例程,而不是看不懂相机开发包

  一般工控领域提供的例程都是MFC程序,你到里面找main函数当然找不到

  问:哦,这样啊,老师你有这方面的经验吗?这个东西我都弄了两周了,还是无从下手,难怪我还一直找主函数。给的说明文档我都看了好几遍了,感觉例子里面用到的也不多,自己想把里面的函数单独拿出来来实现功能,参数经常发生错误。

  答:你说的这款相机我没用过。

  建议你简单学习一下MFC。工控方面的编程用MFC比较多,毕竟搞工控的都不是专业程序员,没精力去专研那些复杂先进的软件技术,MFC算是最普及最简单的图形界面库了。

  相机的话,应该是程序启动时【Open】,关闭时【Close】,采集图像前需要【设置采集参数】,采集单幅图像可以随时【采集】,采集连续图像的话需要【Start】和【Stop】,Start前要【设置连续采集参数】大多还需要【设置回调函数】。你可以去找这些功能的函数以及它们在例程中的位置和用法,配合MFC简单编程的学习,应该能快一点上手吧。

  转自:CSDN论坛

  6.工业相机SDK之opencv二次开发

  做视觉的第一步是选好相机镜头等硬件设备,接下来就是将自己开发的算法在硬件上实现。我最近做一个项目,实现了一下Opencv在相机SDK上的运用,下面小结一下具体实现步骤.

  1. 安装相机自带的驱动和SDK开发包;

  2. 用VS2010新建一个工程,配置好SDK的动态链接库(或者静态),具体动态链接库的使用可参见孙鑫的那本书,这里不多说;

  3. 条用SDK开发包中的函数建立相机和PC机件的链接;

  4. 建立视频流数据,设立一个回调函数(具体参见各SDK),并将数据拷贝到Mat中的data中;

  5. 有了opencv中的Mat数据结构,接下来就可以实现我们的各种算法了。

  我使用的是LuCam相机,由于时间关系没有研究很深入

  以下是相关网友的提问:

  1、关于工业相机的分辨率(我想买一个工业相机,但是现在的工业相机1700美元左右的都才只有100万的分辨率,200W的分辨率就要3000美元左右。。。。。现在的一般相机都已经500W的分辨率了,为什么工业相机分辨率这么低还这么贵啊?有没有200多W分辨率才只要2000美元左右的阿?)

  工业相机的分辨率的选择

  首先考百虑待观察或待测量物体的精度,根据精度选择分辨率。相机像素精度=单方向视野范围大小/相机单方向分辨率。则相机单方向分辨率=单方向视野范围大小/理论精度度。

  若单视野为5mm长,理论精度为0.02mm,则单方向分辨率=5/0.02=250。然而为增加系统稳定性,不会只用一个像素单位问对应一个测量/观察精度值,一般可以选择倍数4或更高。这样该相机需求单方向分辨率为1000,选用130万像答素已经足够。

  其次看工业相机版的输出,若是体式观察或机器软件分析识别,分辨率高是有帮助的;若是VGA输出或USB输出,在显示器上观察,则权还依赖于显示器的分辨率,工业相机的分辨率再高,显示器分辨率不够,也是没有意义的;利用存储卡或拍照功能,工业相机的分辨率高也是有帮助的。

  2、工业相机最高的像素有多高?

  CIS公司是一家在机器视觉行业有着几十年丰富经验的大品牌公司,公司总部位于日本东京。

  CIS凭借工厂的坚实基础,对产品品质的无限追求,在业界享有良好的声誉,全世界机器视

  市场份额也在逐年增加。CIS把诚信放在首位,通过不懈的致力于技术和品质赢得了客户的

  赞誉和信任。7a64e59b9ee7ad9431333431333938同时CIS也认识到了环境保护的重要性,并通过我们的日常活动来代表环境保

  护工作的展开,CIS也是索尼的合作伙伴,CIS将全心全意的为客户服务。

  CIS相机主要分为CameraLink系列和CoaXPress系列:

  CameraLink系列:VCC-5CL4M 500万相机(全局曝光,164帧);

  CameraLink系列:VCC-12CL4M 1200万相机(全局曝光,54帧);

  CameraLink系列:VCC-25CL1M 2500万相机(全局曝光32帧);

  CoaXPress系列:VCC-5XP2M 500万相机(全局曝光63帧);

  CoaXPress系列:VCC-12XP4M 1200万相机(全局曝光163帧);

  CoaXPress系列:VCC-16XP1M 1600万相机(全局曝光124帧)

  CoaXPress系列:VCC-25XP1M 2500万相机(全局曝光81帧);

  CoaXPress系列:VCC-120XP1M 1亿2000

  3、工业相机一个pixel代表多少mm?

  如果成像是100*100mm的 精度应该这样计算,假如一个ccd相机是200w像素,1600*1200的,那它的横向就是百1600个像素点,度每毫米的像素点就是1600/100=16个,你所谓的精度就是1/16=0.0625mm。如果是2448*2048呢,就是1/24.48=0.0408mm

  现在说说我知道的,ccd相机国内品牌一般都是140w 不能再多了吧,进口的一般也就200w了,IMI-tech的相机有500w cdd的 ,500w是2448*2048的,不过貌似国内只有我们这专里有 嘿嘿~~详细的可属以hi我哦,记得是ccd500w 并不是cmos500w

  你的长条形状是咋意思,几比几?比如16:9的?

  4、工业视觉相机品牌有哪些

  工业相机是机器视觉系统的重要组成部分之一,在机器视觉系统中有着非常重要的作用。复工业相机不管是在功能特点还是 在使用性能方面,相比普通相机都有着绝对的优势。

  例如TEO迪奥就可以

  1、工业相机的性能强劲,稳定可靠,易于安装,相机结构紧凑结实不易损坏,连续工作时间长,可在较恶劣的环境下使 用。

  2、工业相机的快门时间可以很短,曝光可以全局曝光,可以抓拍高速运动的物体。工业相机的快门时间一般可以从1/ 100000秒~10秒的范制围内调整,配合机器视觉光源、及频闪控制器,可以将快门时间设置在微秒级,而全局曝光,可以有效解 决拖影等问题。

  3、工业相机的图像传感器是逐行扫描的,逐行扫描的图像传感器生产工艺比较复杂,成品率低,出货量少,世界上只有 少数公司能够提供这类产品,

  4、工业相机的帧率远远高于普通相机。工业相机根据相机分辨率不同,每秒可以拍摄几张到几百张图片,甚zd至成千上万 张图片,而民用相机只能拍摄几张图像,相差较大。

  5、工业相机通常输出的是裸数据(raw data),其光谱范围也往往比较宽,比较适合进行高质量的图像处理算法。