文章目录
软件准备 --vs2017 halcon2018
第一步:halcon程序
打开halcon软件,输入以下程序
实现功能:图像分割 ->>统计个数
输入以下程序
*1.读图
read_image (Test, 'F:/CYG/VirtualProject/C#example/exercise03/1.png')
*2.彩色图转灰度图
rgb1_to_gray (Test, GrayImage)
*3.二值化
threshold (GrayImage, Regions, 0, 248)
*4.孔洞填充
fill_up (Regions, RegionFillUp)
*5.区域分割
connection (RegionFillUp, ConnectedRegions)
*6.面积筛选
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 22504.6, 153432)
*7.统计个数
count_obj (SelectedRegions, Number)
area_center (SelectedRegions, Area, Row, Column)
结果如下:
第二步 导出C#程序
第三步 二次封装
01. 打开VS软件,新建类库TestValue;
右键解决方案的依赖项,选择“添加引用”;->添加
右键项目“TestValue”,点击“添加” ->“现有项”,选择刚才导出的程序文件;
将默认的Class1删除,并打开刚导入的类文件unnamed.cs,找到方法action(),除此方法外,将其他方法都删除,并将程序整理如下;
using HalconDotNet;
namespace CountObjTool
{
public class CountObjTool
{
public void action()
{
// Local iconic variables
HObject ho_Test, ho_GrayImage, ho_Regions;
HObject ho_RegionFillUp, ho_ConnectedRegions, ho_SelectedRegions;
// Local control variables
HTuple hv_Number = new HTuple();
// Initialize local and output iconic variables
HOperatorSet.GenEmptyObj(out ho_Test);
HOperatorSet.GenEmptyObj(out ho_GrayImage);
HOperatorSet.GenEmptyObj(out ho_Regions);
HOperatorSet.GenEmptyObj(out ho_RegionFillUp);
HOperatorSet.GenEmptyObj(out ho_ConnectedRegions);
HOperatorSet.GenEmptyObj(out ho_SelectedRegions);
//1.读图
ho_Test.Dispose();
HOperatorSet.ReadImage(out ho_Test, "C:/Users/Administrator/Desktop/test.png");
//2.彩色图转灰度图
ho_GrayImage.Dispose();
HOperatorSet.Rgb1ToGray(ho_Test, out ho_GrayImage);
//3.二值化
ho_Regions.Dispose();
HOperatorSet.Threshold(ho_GrayImage, out ho_Regions, 0, 248);
//4.孔洞填充
ho_RegionFillUp.Dispose();
HOperatorSet.FillUp(ho_Regions, out ho_RegionFillUp);
//5.区域分割
ho_ConnectedRegions.Dispose();
HOperatorSet.Connection(ho_RegionFillUp, out ho_ConnectedRegions);
//6.面积筛选
ho_SelectedRegions.Dispose();
HOperatorSet.SelectShape(ho_ConnectedRegions, out ho_SelectedRegions, "area",
"and", 52504.6, 153432);
//7.统计个数
hv_Number.Dispose();
HOperatorSet.CountObj(ho_SelectedRegions, out hv_Number);
ho_Test.Dispose();
ho_GrayImage.Dispose();
ho_Regions.Dispose();
ho_RegionFillUp.Dispose();
ho_ConnectedRegions.Dispose();
ho_SelectedRegions.Dispose();
hv_Number.Dispose();
}
}
}
02 整理输入参数、输出参数、检测方法,继续对此类封装,程序如下:
using HalconDotNet;
namespace HDevelopExport
{
public class HDevelopExport
{
/// <summary>
/// 输入源图像
/// </summary>
public HObject srcImg = null;
/// <summary>
/// 输出个数
/// </summary>
public int number = 0;
/// <summary>
/// 检测方法
/// </summary>
#if !NO_EXPORT_MAIN
// Main procedure
public void action()
{
//2.彩色图转灰度图
HOperatorSet.Rgb1ToGray(srcImg, out HObject ho_GrayImage);
//3.二值化
HOperatorSet.Threshold(ho_GrayImage, out HObject ho_Regions, 0, 248);
//4.孔洞填充
HOperatorSet.FillUp(ho_Regions, out HObject ho_RegionFillUp);
//5.区域分割
HOperatorSet.Connection(ho_RegionFillUp, out HObject ho_ConnectedRegions);
//6.面积筛选
HOperatorSet.SelectShape(ho_ConnectedRegions, out HObject ho_SelectedRegions, "area",
"and", 52504.6, 153432);
//7.统计个数
HOperatorSet.CountObj(ho_SelectedRegions, out HTuple hv_Number);
number = hv_Number[0].I;
ho_GrayImage.Dispose();
ho_Regions.Dispose();
ho_RegionFillUp.Dispose();
ho_ConnectedRegions.Dispose();
ho_SelectedRegions.Dispose();
hv_Number.Dispose();
}
}
}
#endif
第四步 : 新建winform工程
01 右击解决方案TestValue,“添加”-》“新建项目”,选择“WIndows窗体应用-Value”;
02 关联算法项目、halcondotnet.dll 以及halconWindow控件
a. 选择项目Value,右键"引用" - 》“添加引用”;
b. 选择"项目" -》"TestValue;
第五步 : 软件界面设计
01.添加如下窗体控件;
02: 逻辑代码设计
实例化对象计数工具类
HDevelopExport.HDevelopExport tool = new HDevelopExport.HDevelopExport();
双击读图按钮,其事件代码如下;
try
{
OpenFileDialog openFileDialog = new OpenFileDialog();
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
HOperatorSet.ReadImage(out tool.srcImg, openFileDialog.FileName);
HOperatorSet.GetImageSize(tool.srcImg, out HTuple hv_Width, out HTuple hv_Height);
HOperatorSet.SetPart(this.hWindowControl1.HalconWindow, 0, 0, hv_Height - 1, hv_Width - 1);
HOperatorSet.DispObj(tool.srcImg, this.hWindowControl1.HalconWindow);
}
}
catch (Exception)
{
MessageBox.Show("图片文件错误!");
}
双击运行按钮,其事件代码如下;
try
{
tool.action();
textBox1.Text = tool.number.ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
整个程序代码如下:
using HalconDotNet;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Test
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
HDevelopExport.HDevelopExport tool = new HDevelopExport.HDevelopExport();
private void button1_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog openFileDialog = new OpenFileDialog();
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
HOperatorSet.ReadImage(out tool.srcImg, openFileDialog.FileName);
HOperatorSet.GetImageSize(tool.srcImg, out HTuple hv_Width, out HTuple hv_Height);
HOperatorSet.SetPart(this.hWindowControl1.HalconWindow, 0, 0, hv_Height - 1, hv_Width - 1);
HOperatorSet.DispObj(tool.srcImg, this.hWindowControl1.HalconWindow);
}
}
catch (Exception)
{
MessageBox.Show("图片文件错误!");
}
}
private void button2_Click(object sender, EventArgs e)
{
try
{
tool.action();
textBox1.Text = tool.number.ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
}
第六步 运行
运行前先进行以下设置,否则可能报”试图加载不正确格式“的错误;
右键项目”Value“,选择“设为启动项目”;
右键项目”Value“,选择”属性“,取消勾选”首选32位“;(64位halcon)
结果显示