我们用Halcon的目的是什么?
这个问题值得思考
最终不是为了在Halcon软件上去做识别操作
而是根据需求把这些Halcon功能移植到我们的程序里面
halcon目前支持C,C++,C#
这个可以从帮助文档里面看到
在上一篇教程 我做了一个回形针的识别案例
现在我们要将识别回形针的这段程序集成到我们的C#程序里面
那么这个时候就要去掉不需要的函数
原先用到的很多算子啥的都是为了在halcon的窗口显示
而现在我们需要去我们自己的程序显示
也就是上面的这些数据
我们需要做到一个什么事情
在我的C# 程序里面
只需要更改文件的路径 就可以识别其他图像
然后得到数据
那么该怎么做
第一步:导出halcon程序代码为C#格式
点击文件-导出
然后这样进行选择
确定后 下面会出现目录
然后我们去找到这个文件
复制它
第二步:创建一个.net控制台窗口程序
直接拷贝到这个工程下
然后程序会报错 因为缺少dll文件
点击引用,添加应用 浏览
找到halcon安装目录
找到dll文件 选择确定 报错解决
我们可以打开一下那个文件看一下 他是封装死了的
需要进行一些修改
using System;
using System.IO;
using HalconDotNet;
public partial class HDevelopExport
{
public HTuple hv_ExpDefaultWinHandle;
public string Path { get; set; }
public HDevelopExport()
{
}
public HDevelopExport(string Path)
{
this.Path = Path;
}
// Main procedure
public void action()
{
// Local iconic variables
HObject ho_Clip1, ho_Clip, ho_Dark, ho_Single;
HObject ho_Selected;
// Local control variables
HTuple hv_Width = new HTuple(), hv_Height = new HTuple();
HTuple hv_Phi = new HTuple(), hv_Area = new HTuple(), hv_Row = new HTuple();
HTuple hv_Column = new HTuple(), hv_Number = new HTuple();
// Initialize local and output iconic variables
HOperatorSet.GenEmptyObj(out ho_Clip1);
HOperatorSet.GenEmptyObj(out ho_Clip);
HOperatorSet.GenEmptyObj(out ho_Dark);
HOperatorSet.GenEmptyObj(out ho_Single);
HOperatorSet.GenEmptyObj(out ho_Selected);
ho_Clip1.Dispose();
HOperatorSet.ReadImage(out ho_Clip1, Path);
Console.WriteLine("open:"+ Path);
ho_Clip.Dispose();
HOperatorSet.Rgb1ToGray(ho_Clip1, out ho_Clip);
hv_Width.Dispose();
hv_Height.Dispose();
HOperatorSet.GetImageSize(ho_Clip, out hv_Width, out hv_Height);
Console.WriteLine(hv_Width.ToString());
Console.WriteLine(hv_Height.ToString());
ho_Dark.Dispose();
HOperatorSet.Threshold(ho_Clip, out ho_Dark, 128, 255);
ho_Single.Dispose();
HOperatorSet.Connection(ho_Dark, out ho_Single);
ho_Selected.Dispose();
HOperatorSet.SelectShape(ho_Single, out ho_Selected, "area", "and", 5000, 10000);
hv_Phi.Dispose();
HOperatorSet.OrientationRegion(ho_Selected, out hv_Phi);
hv_Area.Dispose();hv_Row.Dispose();hv_Column.Dispose();
HOperatorSet.AreaCenter(ho_Selected, out hv_Area, out hv_Row, out hv_Column);
Console.WriteLine(hv_Area.ToString());
Console.WriteLine(hv_Row.ToString());
Console.WriteLine(hv_Column.ToString());
hv_Number.Dispose();
HOperatorSet.CountObj(ho_Selected, out hv_Number);
Console.WriteLine(hv_Number.ToString());
Console.WriteLine("end");
ho_Clip1.Dispose();
ho_Clip.Dispose();
ho_Dark.Dispose();
ho_Single.Dispose();
ho_Selected.Dispose();
hv_Width.Dispose();
hv_Height.Dispose();
hv_Phi.Dispose();
hv_Area.Dispose();
hv_Row.Dispose();
hv_Column.Dispose();
hv_Number.Dispose();
}
public void InitHalcon()
{
// Default settings used in HDevelop
HOperatorSet.SetSystem("width", 512);
HOperatorSet.SetSystem("height", 512);
}
public void RunHalcon(HTuple Window)
{
hv_ExpDefaultWinHandle = Window;
action();
}
}
修改完成
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HalconConsole
{
class Program
{
static void Main(string[] args)
{
HDevelopExport hd = new HDevelopExport(@"D:/paperclip.png");
hd.RunHalcon(hd.hv_ExpDefaultWinHandle);
HDevelopExport hd2 = new HDevelopExport(@"D:/paperclip2.png");
hd2.RunHalcon(hd2.hv_ExpDefaultWinHandle);
Console.ReadLine();
}
}
}
在主程序上这样进行操作
我输入了两个自己拍的回形针图像
然后点击运行
识别成功!
那么下一步 我将才用WPF进行操作
将程序可视化
学习教程,需要的可看,自己整理 http://47.102.101.57:8848/buy/3