分享

《HALCON机器视觉与算法原理编程实践》第4章软件图像采集

 乘舟泛海赏雨 2020-12-15

4.1 获取非实时图像

方法一:通过代码读取图像文件

* 读取单个文件
read_image (Image1, 'E:/Project/Halcon_Project/test/横条.jpg')
read_image (Image2, 'E:/Project/Halcon_Project/test/竖条.jpg')

* 遍历文件夹E:/Project/Halcon_Project/test/下包括子文件夹所有文件
list_files ('E:/Project/Halcon_Project/test/', ['files','follow_links'], ImageFiles)

* 筛选bmp或jpg或png文件
tuple_regexp_select (ImageFiles, ['\\.(bmp|jpg|png)$','ignore_case'], ImageFiles)

* 循环读取文件夹的图像
for Index := 0 to |ImageFiles|-1 by 1
    read_image (Image3, ImageFiles[Index])
endfor

在这里插入图片描述
方法二:通过Halcon图像采集助手读取文件
在这里插入图片描述
在这里插入图片描述

4.1.2 读取视频文件

* Image Acquisition 01: Code generated by Image Acquisition 01
open_framegrabber ('DirectShow', 1, 1, 0, 0, 0, 0, 'default', 8, 'rgb', -1, 'false', 'default', '[0] Altair USB2.0 Camera', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
while (true)
    grab_image_async (Image, AcqHandle, -1)
    * Image Acquisition 01: Do something
endwhile
close_framegrabber (AcqHandle)

在这里插入图片描述

4.2 获取实时图像

参考我另外一篇博客连接好工业相机:
海康威视MV-CA060-11 GM工业相机首次安装与MVS客户端操作
在这里插入图片描述

在这里插入图片描述

4.2.1 Halcon的图像采集步骤

  1. 开启图像采集接口
  2. 读取图像
  3. 关闭图像采集接口

4.2.2 使用Halcon接口连接相机

  1. 选择工业相机
    在这里插入图片描述
  2. 插入代码
    在这里插入图片描述
* Image Acquisition 01: Code generated by Image Acquisition 01
open_framegrabber ('GigEVision2', 0, 0, 0, 0, 0, 0, 'progressive', -1, 'default', -1, 'false', 'default', 'c42f90f77f12_Hikvision_MVCA06011GM', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
grab_image_async (Image, AcqHandle, -1)
* Image Acquisition 01: Do something
close_framegrabber (AcqHandle)
  1. 获取图像
    在这里插入图片描述

4.2.3 使用相机的SDK采集图像

4.2.4 外部触发采集图像

4.3 多相机采集图像

  1. 连接多个采集设备
  2. 多相机异步采集图像
  3. 多相机同步采集图像

4.4 Halcon图像的基本结构

  1. Image:指Halcon的图像类型
  2. Region:指图像中的一块区域
  3. XLD:指图像中某一块区域的轮廓
  4. Tuple:类似于数组,可用于存储一幅或多幅图像

4.5 实例:采集Halcon图像并进行简单处理

  1. 撕几个小纸片摆好
    在这里插入图片描述
  2. 找出这几个小纸片
* 关闭当前窗口,清空屏幕
dev_close_window ()
* 打开图像采集接口,这里用的是网线,其它默认
open_framegrabber ('GigEVision2', 0, 0, 0, 0, 0, 0, 'progressive', -1, 'default', -1, 'false', 'default', 'c42f90f77f12_Hikvision_MVCA06011GM', 0, -1, AcqHandle)
* 抓取一幅图像大小,这幅图是为了获取图像的大小以建立合适尺寸的窗口
grab_image (Image, AcqHandle)
* 获取图像的大小,以建立合适尺寸的窗口
get_image_size (Image, Width, Height)
* 创建新的显示窗口
dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle)

* 开始进入采集图像的循环
while (true)
    * 利用次采集接口的句柄获取图像
    grab_image (Image, AcqHandle)
    * 显示图像采集画面
    dev_display (Image)
    **
    * 此处可根据需要对图像做进一步处理。这里举一个简单的阈值处理并计数的例子
    **
    * 将图像转换为单通道灰度图像
    rgb1_to_gray (Image, GrayImage)
    dev_display (GrayImage)
    * 使用阈值处理提取较亮部分
    threshold (GrayImage, Region, 239, 255)
    * 填充区域
    fill_up (Region, RegionFillUp)
    * 将不相连的区域整体分割成独立的区域
    connection (RegionFillUp, ConnectedRegions)
    * 排除杂点,将面积较大的目标选择出来
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 70, 99999)
    * 目标计数
    count_obj (SelectedRegions, Number)
    * 即将显示文字,文字颜色设置为红色
    dev_set_color ('red')
    * 确定文字的显示位置
    set_tposition (WindowHandle, 10, 10)
    * 查询系统字体
    query_font (WindowHandle, Font) 
    * 设置字体
    * set_font(WindowHandle, Font[0])
    * 窗口输出文字
    write_string (WindowHandle, '有'+Number+'个零件')
    * 显示零件形状区域,设置颜色为红色
    dev_set_color ('red')
    * 显示模式为填充
    dev_set_draw ('fill')
    * 显示提取出的区域
    dev_display (Region)
endwhile


* 采集结束,关闭采集接口,释放相机资源
close_framegrabber (AcqHandle)

在这里插入图片描述

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多