halcon与C#混合编程进阶版

这篇主要是C#和Halcon的混合编程,在此基础上对按键不同功能的划分,以及图片适应窗口和从本地打开图片。

新手来这里:http://www.cnblogs.com/badguy518/p/5515054.html

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#

using System;

using HalconDotNet;

public partial class HDevelopExport

{

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程序

}

//读取图片

public void ReadPicture(HTuple Window)

{

//读图程序

}

//处理图片

public void Process()

{

//处理程序

}

第四步:填补框架

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

//定义变量

public HTuple 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");

}

public void ReadPicture(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);

}

public void Process()

{

//处理程序

HOperatorSet.GenEmptyObj(out ho_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的类下对刚才添加的类进行实例化:

HDevelopExport hd = new HDevelopExport();

②在按键下添加相应程序

private void button1_Click(object sender, EventArgs e)

{

hd.ReadPicture(hWindowControl1.HalconWindow);

}

private void button2_Click(object sender, EventArgs e)

{

hd.Process();

}

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

附加步骤1:

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

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

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

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

附加步骤2:

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

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

①将public void ReadPicture(HTuple Window)的括号中加入参数,改为public void  ReadPicture(HTuple Window, string ImagePath)

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

③主程序中定义变量string ImagePath

④将button1的程序改成如下:

private void button1_Click(object sender, 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);

}

}

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

参考地址:http://www.cnblogs.com/badguy518/p/5515054.html

来自为知笔记(Wiz)

时间: 2024-11-05 19:39:46

halcon与C#混合编程进阶版的相关文章

面向对象编程进阶版

isinstance(obj, cls)和issubclass(sub, super) isinstance(obj,cls)检查obj是否是类 cls 的实例化对象 issubclass(sub, super)检查sub类是否是 super 类的派生类 # isinstance(obj,cls)检查obj是否是类 cls 的实例化对象 class Foo(object): pass class Foo1(Foo): pass obj = Foo1() print(isinstance(obj,

halcon与C#混合编程(一)打开一张图片

转载:http://www.cnblogs.com/hanzhaoxin/archive/2013/02/01/2888839.html 说明:(1)导出halcon代码(文件->导出)时勾选1.导出本地函数内容,2.导出外部函数内容,3.导出所有引用的外部函数 (2)在Program.cs中复制导入的HDevelopExport类 (3)在From1.cs中添加代码

C# Halcon混合编程中遇到的问题(一)

目标平台 安装64位的halcon的情况下,目标平台必须使用x64而不能使用x86 目标框架 不能使用.Net Framework Client版本,有一些必须的程序集会缺失,测试使用.Net Framework 4.0能够正常. HObject 和 C#中的对象的互相转换问题. 在混合编程中,这个应该是一个大问题,我之前之所以一直没有意识到这个问题,是因为虽然说我在做混合编程,但是实际上我只是在C#的环境中用一些halcon中的算子玩了一下, 在wpf中的图像显示使用的也是halcon提供的控

用c/c++混合编程方式为ios/android实现一个自绘日期选择控件(一)

本文为原创,如有转载,请注明出处:http://www.cnblogs.com/jackybu 前言 章节: 1.需求描述以及c/c++实现日期和月历的基本操作 2.ios实现自绘日期选择控件 3.android实现自绘日期选择控件 目的: 通过一个相对复杂的自定义自绘控件来分享: 1.ios以及android自定义自绘控件的开发流程 2.objc与c/c++混合编程 3.android ndk的环境配置,android studio ndk的编译模式,swig在android ndk开发中的作

【5.1送礼】国内第一部Matlab和C#.Net混合编程入门级视频教程【完全免费】

上一次写博客很久了,一直在忙彩票分析系统架构的事情,写博客真是件费神的事情,非常花时间.今天抽空发布这篇博客,是为了开源一部自己录制的视频教程-Matlab和C#.Net混合编程视频教程[入门级].下面说说这部视频教程的来由和一些事情,想获取的仔细看看,别忘了点[推荐]哦! 一.为啥要开源 1.1 视频的来源 这部视频教程是在2012年年底闲时比较多,当初也是很多朋友,网友提出这个Matlab.Net混合编程入门比较难,没有资料,所有就特意录制了一部比较简单的视频教程.并有条件的对广大网友免费开

python基础学习05(核心编程第二版)部分

# -*- coding: utf-8 -*- # ==================== #File: python #Author: python #Date: 2014 #==================== __author__ = 'Administrator' #dict{键:值} #哈希 #注:字典是无顺序的,所以你懂的 #创建与赋值 dict1={} dict2={'name':'apply','avg':24,'sex':'man'} print dict1,dict2

[转] Matlab与C++混合编程(依赖OpenCV)

作者 [email protected],原文 Matlab与C++混合编程(依赖OpenCV) 之前在运行别人论文的代码的时候,经常有遇到Matlab与C++混合编程的影子.实际上就是通过Matlab的Mex工具将C++的代码编译成 Matlab支持调用的可执行文件和函数接口.这样一方面可以在Matlab中利用已经编写好的函数,尽管这个函数是用C++编写的.实现了交流无国界, 没有江山一统的谁,只有四海之内皆兄弟的豪气.另一方面,取C++所长补己之短.Matlab擅长矩阵运算,但对循环操作的效

VC调用matlab dll方式混合编程(c风格--例2)<二>

VC与Matlab混合编程之调用动态链接库dll--<二> 1.是先建立 matlab 的 m 文件. ellipsefit.m 其包含:function [Xc,Yc,A,B,Phi,P]=ellipsefit(x,y) 2.MCC命令编译生成得到h.dll.lib等文件 在matlab命令行中输入: mcc -B csharedlib:ellipsefit ellipsefit.m (此方式为c风格函数) (具体命令含义可参考<精通matlab与C/C++混合程序设计>刘维,第

VC与Matlab混合编程之调用动态链接库dll(C++)——&lt;二&gt;

VC与Matlab混合编程之调用动态链接库dll--<二> 1.是先建立 matlab 的 m 文件. ellipsefit.m 其包含:function [Xc,Yc,A,B,Phi,P]=ellipsefit(x,y) 2.MCC命令编译生成得到h.dll.lib等文件 在matlab命令行中输入: mcc -W cpplib:ellipsefit ellipsefit.m -T link:lib (此方式为c++风格函数) (具体命令含义可参考<精通matlab与C/C++混合程序