Halcon基础学习(一)
Halcon基础学习(一)
初见
目标:
提取出U4的位置坐标
结果:
编程逻辑
-
读取图片
-
按照RGB3通道处理图片
-
使用中值滤波
-
使用灰度滤波
-
使用二值化滤波
-
组件区域分割
-
使用特征直方图设置上下限
-
直到过滤到唯一一个以后,使用区域选择工具
-
在新打开的图片上面绘制十字叉
编程实现
read_image (CircuitBoard, 'E:/halconTest/aa.jpg')
//三通道彩色图像分离
decompose3 (CircuitBoard, Image1, Image2, Image3)
// 中值滤波器
median_image (Image3, ImageMedian, 'circle', 5, 'mirrored')
// 扩展最大灰度值
scale_image (ImageMedian, ImageScaled, 1.8, 0)
// 二进制阈值
binary_threshold (ImageScaled, Region, 'smooth_histo', 'light', UsedThreshold)
// region特征筛选
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 1252.32, 1994.43)
// 存在两个区域,再次过滤一下
select_shape (SelectedRegions, SelectedRegions1, 'area', 'and', 1856.75, 1901.11)
// region的中心和坐标
area_center (SelectedRegions1, Area, Row, Column)
// 打开一个适应图像大小的窗口
dev_open_window_fit_image (CircuitBoard, 0, 0, -1, -1, WindowHandle)
// 显示图像
dev_display (CircuitBoard)
// 设置画笔线的宽度
dev_set_line_width (8)
// 在指定行和列的地方绘制十字叉
disp_cross (WindowHandle, Row, Column, 100, 0)
提取Halcon代码作为函数
把获取当前图片的行和列进行的方法进行提取
第一步 勾选,然后点击创建新函数
第二步 编辑创建新函数的信息
在参数页面,删除不用的参数信息
仅仅保留 输入参数:图片名称 、 输出参数:行号和列号
导出当前工程库和代码文件
-
导出当前工程库
工程库提供了Halcon引擎的调用方法
-
导出当前代码文件
当前看到的Halcon代码实现
文件说明:
- Out_Center 这个是项目库
- 042301.cs 是生成的Halcon转C#代码文件
使用 VisualStudio 进行编程
第一步:引入 Halcon控件
使用工具箱功能
添加当前版本对应的Halcon控件
第二步:添加dll控件的引用
第三步:引入先前的Halcon代码
-
先引入c#实现代码
-
引入项目库文件
- 引入c#文件
-
将Res文件夹下面的文件移动到VS项目的执行文件夹下面
第四步:编写具体代码
先做界面:
其中那个黑框Halcon控件,右边是两个button
获取图片的button如下(先读取图片,获取图片的尺寸,然后设置HWindow控件显示的图片尺寸):
private void BtnGetImage_Click(object sender, EventArgs e)
{
HOperatorSet.ReadImage(out ho_CircuitBoard, "E:/halconTest/aa.jpg");
HOperatorSet.GetImageSize(ho_CircuitBoard,out hv_width,out hv_height);
HTuple width = hv_width;
HTuple height = hv_height;
HTuple width_start = 0;
HTuple hight_start = 0;
_window.SetPart(hight_start, width_start, height, width);
_window.DispObj(ho_CircuitBoard);
}
处理图标的button如下(从导出的库项目文件中使用封装的center_looking函数):
private void BtnProcessImage_Click(object sender, EventArgs e)
{
Out_Center.center_looking(ho_CircuitBoard,out HTuple row,out HTuple column);
_window.DispCross(row,column,50,0);
}
为啥这么写,要学会去抄,在哪抄写?
看Halcon实现的c#代码里面的action()部分
先抄写 读取图片部分ReadImage,然后获取图片尺寸GetImageSize
然后抄写使用的参数的类
最后程序的效果如下:
先点击读取按钮:
再点击图像处理
此时效果和Halcon处理的情况基本一致
可能出现的错误情况:
-
dll版本报错:
我目前使用的是x64版本