很明显,图像的采集是所有机器视觉应用中必须解决的问题,HALCON提供了为各种图像采集设备执行这种交互的接口,图像采集的任务被简化为几行代码,只需几个操作符的调用,更重要的是,这种简单并不是以限制可用功能为代价。使用HALCON,可以在不同的时间模式下从不同的采集设备和相机中获取图像。除了从相机中获取图像外,HALCON还可以将存储在文件中的图像显示出来(支持的文件格式:BMP、TIFF、GIF、JPEG、PNG、PNM、PCX、XWD)。

基本概念

用HALCON获取图像基本上只需要三个步骤,而从文件中读取图像则更为简单:只需调用read_image操作符即可。

打开图像采集设备

如果想从一个摄像机中获取图像,第一步就是要连接到这个设备。HALCON可以解决所有与设备相关的细节问题;只需要调用算子 open_framegrabber,指定相应的图像采集接口名称。

还有一个 "虚拟 "的图像采集界面叫File。顾名思义,这个 "抓帧器 "读取文件中的图像,以及所谓的图像序列文件。后者是Halcon特有的文件类型,典型的扩展名是.seq,它们包含一个图像文件名的列表,用新的行隔开(可以用文本编辑器很容易地创建它),如果你链接到这样的序列,随后调用grab_image就会返回文件中指定的序列图像。 然后,不必创建一个序列文件,而只需指定目录名称而不是序列文件作为参数'CameraType'的值。后续调用grab_image会返回在指定的图像目录中找到的图像。如果想用图像文件序列或者在真实的图像采集设备上来测试应用程序,那么以上这两种方法都很有用。

获取图像

连接到设备后,只需调用grab_image就可以获取图像。

要从磁盘中加载图像,需要使用read_image,图像会在当前目录中和当前设备环境变量HALCONIMAGES指定的目录中被搜索到。

关闭图像采集设备

在应用程序结束时,可以使用运算符close_framegrabber关闭与图像采集设备的连接以释放其资源。

例子

如前所述,从文件中获取图像调用对应的一个运算符:

read_image(Image,'particle')

下面的代码处理从图像序列中读取的图像:

SequenceName:='pendulum/pendulum.seq'
open_framegrabber('File',-1,-1,-1,-1,-1,-1,'default',-1,'default',-1,'default',SequenceName,'default',-1,-1,AcqHandle)
while(ImageNum<=MaxImageNum)
grab_image(Image,AcqHandle)
...处理图像...
ImageNum := ImageNum+1
endwhile

扩展概念

在实际应用中,通常不需要让摄像机来获取图像,而重要的是在正确的时刻或速率下获取图像,并且摄像机和图像采集接口都要有合适的参数。因此,HALCON允许进一步参数化采集过程。在HDevelop中,通过菜单项Assistants>Image Acquisition提供了一个助手,它可以帮助选择图像源,调整参数,并生成合适的代码。

打开图像采集设备

当用open_framegrabber连接到图像采集设备时,主要参数是对应的HALCON图像采集接口的名称,因此,会得到一个所谓的handle,可以用它来访问该设备,例如,用grab_image或grab_image_async来采集图像。

通过open_framegrabber的其他参数,可以描述图像采集设备和摄像机的配置,在这里使用更多完整的配置时是必要的,例如,多个摄像机连接到不同的采集卡的不同端口。更多的参数允许指定所需的图像格式(尺寸,分辨率,像素类型,颜色空间)。这些参数中大多数都有默认值,如果想使用这些参数,可以使用指定 "default"(字符串参数)或 -1(数字参数)。

通过算子info_framegrabber,可以查询接口的版本号、可用的板卡、端口号和摄像机类型等信息。

设置参数

如上所述,在连接到图像采集设备时,已经设置了一些参数,如open_framegrabber。这些参数(图像采集设备/摄像机的配置和图像大小等)是所谓的通用参数,因为它们几乎是所有图像采集接口所共有的。然而,图像采集设备在所提供的功能上有很大的不同,导致了有更多的特殊参数。这些参数可以通过算子set_framegrabber_param进行自定义。

通过算子get_framegrabber_param,可以查询普通参数和特殊参数的当前值。

采集图像

实际上,在实际机器视觉应用中,不会使用算子grab_image来获取图像,而是使用grab_image_async。这两个操作符的区别如下。如果在循环中获取和处理图像 grab_image总是请求获取一个新的图像,然后暂停程序,直到获取完成。然后,对图像进行处理,之后,程序等待下一张图像。相反,当使用 grab_image_async 时,图像的采集和处理是并行的。当一幅图像 处理完毕,下一张图像已经在采集中,大大加快了应用程序在处理图像的速度。

HALCON提供了更多的图像采集模式,例如,通过外部信号触发采集或从多台相机同时采集图像(现实场景中经常用到)。有兴趣的话可以了解一下。

涉及算子

打开图像采集设备

基础:open_framegrabber

高级:info_framegrabber

设置参数

基础:set_framegrabber_param, get_framegrabber_param

采集图像

基础:read_image, grab_image, grab_image_async

打开图像采集设备

基础:close_framegrabber

进阶

直接访问内存中的外部图像

还可以将外部创建的图像(即计算机内存中的原始图像矩阵)传递给HALCON。

使用操作符gen_image1、gen_image3、gen_image1_extern或gen_image3_extern。

不支持的图像采集设备

如果想使用 HALCON 目前不支持的图像采集设备,也就是说,HALCON不支持的设备,可以创建自己的接口。创建和使用HALCON接口方法可从MVTec的网络服务器下载图像采集接口以及可作为集成基础的模板源代码,网址为http://www.mvtec.com/products/interfaces。

Halcon采集图像Image Acquisition解析的更多相关文章

  1. vs联合halcon——采集图像(实时采集与单次采集)

    摘要 在对vs进行环境配置好以后,就可以开始与halcon联合进行实战.本篇就对图像的采集进行总结.通过构建采集相机GrabImage类的三个方法实现图像的采集: open() 打开相机 grabim ...

  2. Halcon WPF C#采集图像区域灰度值

    源码下载地址:https://github.com/lizhiqiang0204/ImageGray.git Halcon代码如下: *读取图片,转换成灰度图片 read_image (Image1, ...

  3. Halcon一维测量官方案例解析

    下面的例子简要介绍了如何使用HALCON的一维测量工具.最长的部分是预处理和后处理:测量本身只包括两个操作符调用. 测量保险丝-fuse 预处理主要是测量线的生成.在示例程序中,这个步骤是通过将测量对 ...

  4. camera按键采集图像及waitKey的用法(转)

    源: camera按键采集图像及waitKey的用法

  5. camera按键采集图像及waitKey的用法

    前言 项目需要通过摄像头采集图像并保存,主要是用于后续的摄像头标定.实现过程其实很简单,需要注意一些细节. 系统环境 系统版本:ubuntu16.04:opencv版本:opencv2.4.13:编程 ...

  6. Camera 采集图像的方法

    使用 Camera 采集图像, 实现步骤如下: 需要权限: android.permission.CAMERA android.permission.WRITE_EXTERNAL_STORAGE // ...

  7. halcon采集一幅图像

    **顺序也很重要,必须现有窗口,才能设置属性 dev_close_window()dev_open_window (0, 0, 1400, 1200, 'black', WindowHandle)de ...

  8. halcon连续采集图像

    dev_close_window()dev_update_window('off')create_bar_code_model ([], [], BarCodeHandle)dev_open_wind ...

  9. halcon二 图像校正

    1.get_image_size(Image : : : Width, Height) 返回图像的尺寸. 2.parameters_image_to_world_plane_centered (Cam ...

随机推荐

  1. 五月天的线上演唱会你看了吗?用Python分析网友对这场线上演唱会的看法

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:CDA数据分析师 豆瓣9.4分!这场线上演唱会到底多好看? 首先让我 ...

  2. 95题--不同的二叉搜索树II(java、中等难度)

    题目描述:给定一个整数 n,生成所有由 1 ... n 为节点所组成的 二叉搜索树 . 示例如下: 分析:这一题需要对比LeetCode96题来分析:https://www.cnblogs.com/K ...

  3. JSP+Structs+JDBC+mysql实现的诚欣电子商城

    项目简介 项目来源于:https://github.com/SuperiorNature/Java-Enterprise-electronic-mall 本系统是基于JSP+Structs+JDBC+ ...

  4. vj提交时常见问题

  5. 【分区】使用 GPT 分区表分区并格式化 (FreeBSD 系统)

    1. 查看磁盘列表 使用命令 diskinfo -v /dev/vtbd1 查看磁盘设备列表. 2. 创建 GPT 分区 1). 执行命令 gpart create -s gpt vtbd1.2). ...

  6. numpy中的浅复制和深复制

    浅复制:主要有两种方式,简单的赋值或者使用视图(view) 简单的赋值:其实就是制造了一个别名,数组并没有被copy成新的一份,当使用其中一个别名改变数组值的时候,另一个别名对应的值一并改变. > ...

  7. 基于docker-compose部署jumpserver

    基于docker-compose部署jumpserver 组件说明 Jumpserver 为管理后台, 管理员可以通过 Web 页面进行资产管理.用户管理.资产授权等操作, 用户可以通过 Web 页面 ...

  8. cc22a_demo_c++重载自增自减操作符-代码示范

    cc22a_demo_c++重载自增自减操作符-代码示范 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespa ...

  9. 一文带你了解Redis持久化完整版本

    本文讲解知识点 持久化的简介 RDB AOF RDB与AOF的区别 持久化应用场景 对于持久化这个功能点,其实很简单没有那么复杂 演示环境 centos7.0 redis4.0 redis存放目录:/ ...

  10. 006.OpenShift持久性存储

    一 持久存储 1.1 持久存储概述 默认情况下,运行容器使用容器内的临时存储.Pods由一个或多个容器组成,这些容器一起部署,共享相同的存储和其他资源,可以在任何时候创建.启动.停止或销毁.使用临时存 ...