这篇主要是C#和Halcon的混合编程,写给新手们看的。

halcon源程序:

dev_open_window(0, 0, 512, 512, 'black', WindowHandle)

read_image (Image, 'C:/Users/Administrator/Desktop/猫.jpg')

dev_display(Image)

get_image_size(Image, Width, Height)

rgb3_to_gray(Image, Image, Image, ImageGray)

dev_display(ImageGray)

注意:写halcon程序时,如果过程中的图片需要显示出来,则需要在每个过程中都添加dev_display(**)

第一步:导出C#程序,建立项目,并添加此类

//

//  File generated by HDevelop for HALCON/DOTNET (C#) Version 10.0

//

//  This file is intended to be used with the HDevelopTemplate or

//  HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c#

usingSystem;

usingHalconDotNet;

publicpartialclassHDevelopExport

{

public HTuple hv_ExpDefaultWinHandle;

// Main procedure

private void action()

{

// Local iconic variables

HObject ho_Image, ho_ImageGray;

// Local control variables

HTuple hv_Width, hv_Height;

// Initialize local and output iconic variables

HOperatorSet.GenEmptyObj(out ho_Image);

HOperatorSet.GenEmptyObj(out ho_ImageGray);

//dev_open_window(...);

ho_Image.Dispose();

HOperatorSet.ReadImage(out ho_Image, "C:/Users/Administrator/Desktop/猫¨.jpg");

HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);

HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);

ho_ImageGray.Dispose();

HOperatorSet.Rgb3ToGray(ho_Image, ho_Image, ho_Image, out ho_ImageGray);

HOperatorSet.DispObj(ho_ImageGray, hv_ExpDefaultWinHandle);

ho_Image.Dispose();

ho_ImageGray.Dispose();

}

public void InitHalcon()

{

// Default settings used in HDevelop

HOperatorSet.SetSystem("do_low_error", "false");

}

public void RunHalcon(HTuple Window)

{

hv_ExpDefaultWinHandle = Window;

action();

}

}

第二步:布局设计

本程序需要显示图片的halconWindow控件和读图以及处理图片的两个button控件;如下图:

第三步:将导出的类进行框架分解

如果想在程序中添加不同的按键,比如一个用来打开图片,一个用来处理图片,则就需要将halcon导出的类进行分解;

框架如下:

//定义变量

//初始化halcon

public void InitHalcon()

{

//初始化halcon程序

}

//读取图片

publicvoidReadPicture(HTuple Window)

{

//读图程序

}

//处理图片

publicvoidProcess()

{

//处理程序

}

第四步:填补框架

将对应框架下得程序进行填补操作(下边程序可以代替publicpartialclassHDevelopExport下的所有程序):

//定义变量

publicHTuple hv_ExpDefaultWinHandle;

HObject ho_Image, ho_ImageGray;

HTuple hv_Width, hv_Height;

//初始化halcon

public void InitHalcon()

{

// Default settings used in HDevelop

HOperatorSet.SetSystem("do_low_error", "false");

}

publicvoidReadPicture(HTuple Window)

{

//读图并显示

hv_ExpDefaultWinHandle = Window;

HOperatorSet.GenEmptyObj(out ho_Image);

ho_Image.Dispose();

HOperatorSet.ReadImage(out ho_Image, "C:/Users/Administrator/Desktop/猫¨.jpg");

HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);

HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);

}

publicvoidProcess()

{

//处理程序

HOperatorSet.GenEmptyObj(outho_ImageGray);

ho_ImageGray.Dispose();

HOperatorSet.Rgb3ToGray(ho_Image, ho_Image, ho_Image, out ho_ImageGray);

HOperatorSet.DispObj(ho_ImageGray, hv_ExpDefaultWinHandle);

ho_Image.Dispose();

ho_ImageGray.Dispose();

}

第五步:在主程序Form1.cs中添加程序:

①在主程序Form1的类下对刚才添加的类进行实例化:

HDevelopExporthd = newHDevelopExport();

②在按键下添加相应程序

privatevoidbutton1_Click(objectsender, EventArgs e)

{

hd.ReadPicture(hWindowControl1.HalconWindow);

}

private void button2_Click(object sender, EventArgs e)

{

hd.Process();

}

此步骤完成之后,程序可以运行。

上面那句:hd.ReadPicture(hWindowControl1.HalconWindow);

不能写成hd.ReadPicture(hWindowControl1.handle);

否则会报下面的错误:

HALCON error #5100:Wrong(logical) window number in operator disp_obj

因为有些算子的参数是传入handle,即halcon窗口的句柄,所以有许多人容易犯这个错误,传入hWindowControl1.handle

附加步骤1:

在以上程序中,已经可以将图片显示出来,并进行处理,但由于窗口与图片的大小不一致,导致在显示窗口中不能适应程序窗口的大小,下面是解决此类问题的方法:

在读图程序中,将获取图片的大小的程序HOperatorSet.GetImageSize(ho_Image,outhv_Width,outhv_Height);放在显示图片之前,并在显示图片程序之前加入下面程序:

HOperatorSet.SetPart(hv_ExpDefaultWinHandle, 0, 0, hv_Height - 1, hv_Width - 1);然后图片就可以适应窗口大小。

此步骤也可以在halcon中更改。

附加步骤2:

如果想在程序中能够打开本地文件夹的图片进行处理,则需要改以下程序:

注意:①②是添加的类中③④是主程序中

①将publicvoidReadPicture(HTuple Window)的括号中加入参数,改为publicvoidReadPicture(HTuple Window,stringImagePath)

②将ReadPicture下的程序HOperatorSet.ReadImage(outho_Image,"C:/Users/Administrator/Desktop/猫¨.jpg");改为HOperatorSet.ReadImage(out ho_Image, ImagePath);

③主程序中定义变量stringImagePath

④将button1的程序改成如下:

privatevoidbutton1_Click(objectsender, EventArgs e)

{

OpenFileDialog openFileDialog1 = new OpenFileDialog();

openFileDialog1.Filter ="JPEG文件|*.jpg*|BMP文件|*.bmp*";

openFileDialog1.RestoreDirectory = true;

openFileDialog1.FilterIndex = 1;

if (openFileDialog1.ShowDialog() == DialogResult.OK)

{

ImagePath = openFileDialog1.FileName;

hd.ReadPicture(hWindowControl1.HalconWindow, ImagePath);

}

}

接下来可以试试运行程序。

---------------------

作者:hackpig

halcon与python混编_halcon与C#混编的入门贴相关推荐

  1. python怎么安装myqr模块-python二维码操作:对QRCode和MyQR入门详解

    python是所有编程语言中模块最丰富的 生活中常见的二维码功能在使用python第三方库来生成十分容易 三个大矩形是定位图案,用于标记二维码的大小.这三个定位图案有白边,通过这三个矩形就可以标识一个 ...

  2. 分轨混音制作|分轨混音多少钱?分轨混音母带处理服务| MZD Studios

    混音太单薄没有力量?人声像贴唱没有立体感?乐器太混不够清晰?不想太业余低端? 高端混音服务就找 MZD Studios. MZD Studios 职业混音/唱片制作:主攻欧美向/电子及重型音乐制作: ...

  3. 不推荐二周目跑重复剧情 不推荐开混10,建议开混11,游戏文本的奖励减半并没有生效. 混10=混11+混乱词条 1.经济获取(学自大佬:小小银Salmon【B站号】) 金币获取:刚通关开混乱11,拿主

    不推荐二周目跑重复剧情 不推荐开混10,建议开混11,游戏文本的奖励减半并没有生效. 混10=混11+混乱词条 1.经济获取(学自大佬:小小银Salmon[B站号]) 金币获取:刚通关开混乱11,拿主 ...

  4. Python 基础 之 jupyter notebook 中机器学习的简单入门书写数字识别 demo 操作学习

    Python 基础 之 jupyter notebook 中机器学习的简单入门书写数字识别 demo 操作学习 目录 Python 基础 之 jupyter notebook 中机器学习的简单入门书写 ...

  5. Python+OpenCV人脸识别签到考勤系统(新手入门)

    Python+OpenCV人脸识别签到考勤系统(新手入门) 前言 项目效果图 项目需要的环境 编译器 辅助开发QT-designer 项目配置 代码部分 核心代码 项目目录结构 后记 正式版改进 项目 ...

  6. [Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  7. 【Python】【进阶篇】十二、Python爬虫的Xpath简明教程(十分钟入门)

    目录 十二.Python爬虫的Xpath简明教程(十分钟入门) 12.1 Xpath表达式 12.2 Xpath节点 12.3 节点关系 12.4 Xpath基本语法 12.4.1 基本语法使用 12 ...

  8. cruise软件模型,混动仿真模型,IMMD架构混联混动仿真模型,Cruise混动仿真模型

    cruise软件模型,混动仿真模型,IMMD架构混联混动仿真模型,Cruise混动仿真模型,混联混动汽车动力性经济性仿真. 关于模型 1.本模型是基于IMMD架构搭载的混联混动仿真模型,关于IMMD架 ...

  9. 基于c#的区块链编程_C#编程之C#区块链零基础入门,学习路线图

    本文主要向大家介绍了C#编程之C#区块链零基础入门,学习路线图,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助. 一.1分钟短视频<区块链100问>了解区块链基本概念 http: ...

最新文章

  1. 机器学习-Andrew Ng课程笔记
  2. python中change是什么意思_Change是什么意思?
  3. html中after伪类原理,css :after伪类+content使用说明和方法
  4. jzoj3337-[NOI2013模拟]wyl8899的TLE【字符串hash,二分】
  5. C语言-freopen函数输入简单使用举例
  6. 这是可用于下一个项目的React Native工具列表
  7. 百度回应“抄袭天猫精灵”;ofo 押金退完需 12 年;VS Code 1.36 发布 | 极客头条...
  8. csync2+sqlite实现数据的高效实时的增量备份
  9. 盛大“传奇”的网游启示录
  10. react-native-router-flux 页面跳转与传值
  11. 龙芯2F Debain编openssl报/usr/local/bin/ld: /usr/lib/libdl.so: error adding symbols: file in wrong format
  12. Android Studio 导入图片标红错误
  13. mysql 5.1 变量专题
  14. 消息中间件 - MQ的相关概念
  15. opencv转换图片格式
  16. 诗词格律[6] 词的格律
  17. android动画之帧动画(drawable animation)和补间动画(view animation)
  18. 毕业论文(二)文章中多次引用同一参考文献的不同内容该如何标注
  19. python实现直方图均衡化(CLAHE、HE)
  20. php 图片自动播放,Android实现自动播放图片功能

热门文章

  1. tcpdump man 手册页的详细中文翻译
  2. sapjco3的安装
  3. paper 43 :ENDNOTE下载及使用方法简介
  4. 【已解决】Unknown error 1146
  5. 在C#中使用MSMQ的方法
  6. LeetCode——11. 盛最多水的容器
  7. db2 replace函数的用法_48R软件数据的基本处理之删除重复数据(duplicated()、unique()、distinct()函数)...
  8. 实战——幂等性+海量数据处理
  9. GreenPlum-6 最简步骤安装
  10. 代码敲累了就来看看《PPT制作经验分享-发布版PPT》