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

文章目录

  • 4.1 获取非实时图像
    • 4.1.2 读取视频文件
  • 4.2 获取实时图像
    • 4.2.1 Halcon的图像采集步骤
    • 4.2.2 使用Halcon接口连接相机
    • 4.2.3 使用相机的SDK采集图像
    • 4.2.4 外部触发采集图像
  • 4.3 多相机采集图像
  • 4.4 Halcon图像的基本结构
  • 4.5 实例:采集Halcon图像并进行简单处理

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 01open_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 somethingendwhileclose_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 01open_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 somethingclose_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)

相关推荐