Halcon教程九:把Halcon程序放到C#程序里

14 篇文章 625 订阅

我们用Halcon的目的是什么?
这个问题值得思考
最终不是为了在Halcon软件上去做识别操作
而是根据需求把这些Halcon功能移植到我们的程序里面
halcon目前支持C,C++,C#
这个可以从帮助文档里面看到
halcon教程
在上一篇教程 我做了一个回形针的识别案例
现在我们要将识别回形针的这段程序集成到我们的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

  • 12
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值