《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的图像采集步骤
- 开启图像采集接口
- 读取图像
- 关闭图像采集接口
4.2.2 使用Halcon接口连接相机
- 选择工业相机
- 插入代码
* 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)
- 获取图像
4.2.3 使用相机的SDK采集图像
4.2.4 外部触发采集图像
4.3 多相机采集图像
- 连接多个采集设备
- 多相机异步采集图像
- 多相机同步采集图像
4.4 Halcon图像的基本结构
- Image:指Halcon的图像类型
- Region:指图像中的一块区域
- XLD:指图像中某一块区域的轮廓
- Tuple:类似于数组,可用于存储一幅或多幅图像
4.5 实例:采集Halcon图像并进行简单处理
- 撕几个小纸片摆好
- 找出这几个小纸片
* 关闭当前窗口,清空屏幕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)