怎样使用HALCON/.NET类

作者&投稿:糜竿 (若有异议请与网页底部的电邮联系)
如何让halcon程序应用在vs中显示~

开始做Halcon的上位机,选用VisualStudio10.0平台。C#第一步:VisualStudio10.0设置引用HalconDotNet.dll01.新建项目02.选择VisualC#03.修改文件名04.确认第二步VisualStudio10.0设置引用HalconDotNet.dll01.选择“解决方案资源管理器”02.选择“引用”,右键03.选择“添加引用”第三步VisualStudio10.0设置引用HalconDotNet.dll01.在添加引用选项卡选择浏览02.选择路径:X:\ProgramFiles\MVTec\HALCON-10.0\bin\dotnet2003.选择“HalconDotNet.dll”04.确认第四步VisualStudio10.0设置引用HalconDotNet.dll01.选择“工具箱”02.选择“所有工具”或任意工具控件,右键03.选择“选择项”第五步VisualStudio10.0设置引用HalconDotNet.dll选择Halcon图像控件VisualStudio10.0设置引用HalconDotNet.dll还有VB的设置,如下图:VisualStudio10.0设置引用HalconDotNet.dll01.选择项目名称02.点击显示全部文件,取消隐藏,就可以看到引用03.引用,邮件04.添加,之后的步骤和C#一样VisualStudio10.0设置引用HalconDotNet.dll选择工具控件,步骤和C#基本一样。VB的第二张图,步骤如下01.选择“工具箱”02.选择“所有工具”或任意工具控件,右键03.选择“选择项”04.在“.netframwork组件”的选项卡中,选择浏览05.出来的对话框中,选择X:\ProgramFiles\MVTec\HALCON-10.0\bin\dotnet2006.选择“HalconDotNet.dll”07.确认08.这时候的工具栏的控件是HWinwow控件。kamuixiao:X:\ProgramFiles\MVTec\HALCON-10.0\bin\dotnet20路径下的无法使用,在.netframework组件无法找到X:\ProgramFiles\MVTec\HALCON-10.0\bin\dotnet35路径下的可用,在.netframework组件下可以找到,并且在工具箱上能够找到并使用,但是功能无法实现,如下图我不作其他动作,程序代码内容仅是运行时候读取一张图片,在调试的时候能够运行,但读不到图片……楼主在VB.NET环境下正常运行了吗?求解~VisualStudio10.0设置引用HalconDotNet.dllx8515618:定义错了dimm_hWindowAsHtuple'这是一个句柄,不是窗体控件x8515618:Dimm_hWindowAsHtuple=Nothingkamuixiao:谢谢楼上的建议,但是我试了下发现仍然不行,我觉得问题不是出在这里,不知道使用VB.NET的各位有没有遇到过,反正我是没能正常实现过一次的,输出显示的错误情况如图:VisualStudio10.0设置引用HalconDotNet.dllx8515618:你只是读取了图片,都没有显示图片呢灵峤lencue:你最开始新建项目的时候选择的“.net框架”版本是多少的?.net2.0就用dotnet20文件夹,3.5就用dontnet35文件夹,你再查看一下,会不会是这个问题,看能不能解决。irun999:请问楼主,用在VS2008中用C#读入一直比较大的图片的时候只是显示部分图片,如何解决?灵峤lencue:dev_resize_window_fit_image(ho_Image,0,0,300,400);用这个算子,在C#的program.cs中可以用的,后面的300,400就是显示这个图片的大小的,会被缩放到这个比例。irun999:请问在VS2005C#处理视频,程序老是死掉,怎么?视频无法实时显示。是不是视频太大了,VS2005处理不够来?该怎么?灵峤lencue:采用C#的多线程,具体怎么使用,我还在学习中,要是有进展,再一起讨论。好吧,我写漏了,但事实上我把显示补上,然后按照兄台所说修改定义后仍然没能成功!~附图:VisualStudio10.0设置引用HalconDotNet.dllirun999:今天下午发现视频无法显示是因为hdevelop导出程序的死循环函数里没有HOperatorSet.DispObj显示函数。但是关闭程序就会出现vshost.exe无响应。这个问题可能得多线程解决了。

这里有完整教程,你参考一下:
连接地址:
http://www.360doc.com/content/14/0217/10/10724725_353155349.shtml
希望能帮到你,满意请采纳,欢迎追问。

在HALCON/.NET,我们可以用过一个类的实例
(instances of class)来调用HALCON算子。在HalconDotNet引用里,也就是动态链接库里包许多实例化一个类方法,这些
方法可能是重载的,静态的HALCON算子我们可以直接通过类名来调用(这些方法包括HALCON里所有的算子),而非静态的方法必须要通过实例化一个类
后才可以使用,通常HALCON/.NET封装了一个类的实例化方法以及类方法。

例如在C++中,可以使用以下两种方法:

1. C++(算子模式)

通过代码导出,以C++为例,默认导出为算子型的语法结构,而非面向对象的;在此模式下,全部函数声明为全局类型,数据类型只需要用Hobject、HTuple两类类型进行声明;

2. C++(面向对象)

可以以面向对象的方式重写代码,也即利用类及类的成员函数;在这种模式下,控制变量的类型仍未HTuple,而图形数据可以由多种类型,如HImage等;

HALCON手册建议使用者使用第二种方法。

例如我们使用第二种方法实现抓取图像序列(imagesequence)里第一张图像,并且将他显示在HWindowControl窗口中。代码是:

[cpp] view plaincopy
private HWindow Window;
private HFramegrabber Framegrabber;
private HImage Img;
Window= WindowControl.HalconWindow;
Framegrabber= new HFramegrabber("File", 1, 1, 0, 0, 0, 0, "default",
-1,"default", -1, "default",
"board/board.seq","default", 1, -1);
Img= Framegrabber.GrabImage();
Img.DispObj(Window);

GrabImage算子是通过HFramegrabber的实例来调用的。如果你是一个有经验的HALCON使用者,也许你已经看出来HFramegrabber的构造函数调用了OpenFramegraber算子。

但是对于新手来说,可能刚刚接触Halcon,对于Halcon算子还处于熟悉阶段,从Hdevelop中直接到出来的代码也是直接使用静态类。那么建议先使用第一种方法,你只需要明白通过HOperatorSet这个类你可以调用任何一个HALCON算子。

下面我们来看一下到底怎么样调用一个算子。以GrabImage算子为例:

[cpp] view plaincopy
static void HOperatorSet.GrabImage (out HObject image, HTuple acqHandle)//静态方法直接调用算子,包含的参数和halcon算子参数完全相同
void HImage.GrabImage (HFramegrabber acqHandle)//类中封装的类方法,要先实例化类后才可以使用
HImage HFramegrabber.GrabImage ()//重载的方法
image(output_object) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . image ; HImage
acqHandle(input_control) . . . . . . . . . . . . . . . . . . . . . . . . . .framegrabber ; HFramegrabber / HTuple

[cpp] view plaincopy

我们可以看出,算子可以通过三个类进行调
用:HOperatorSet, HImage,和HFramegrabber。其中第一种通过HOperatorSet调用主要是用在导出的
HDevelop中(如果你导出程序的话就会看到),也是建议新手使用的方法。而熟悉了之后一般我们在写程序时建议使用另外两种方式,就像下面这样进行调
用:

[cpp] view plaincopy
HImage Image1;
HImage Image4 = newHImage();
HFramegrabberFramegrabber =
newHFramegrabber("File", 1, 1, 0, 0, 0, 0, "default", -1,
"default",-1, "default", "board/board.seq", "default", -1,-1);
Image1 =Framegrabber.GrabImage();
HImage Image3 = null;

需要注意的是通过
HFramegrabber调用返回方法的值,而通过HImage调用没有返回值而是调用的类实例被修改,也就是HImage对象被修改。通常,调用类实
例不会被一个算子所修改,除了被上面所看到的“类构造器”(constructor-like)算子调用。

一些算子像CountSeconds可以当做类方法来使用,例如,你可以直接通过类名调用它们而不用生成一个实例:

[cpp] view plaincopy
double S1, S2;
S1 =HSystem.CountSeconds();

这是因为这些算子声明前面都有static关键字:

[cpp] view plaincopy
static void HOperatorSet.CountSeconds (outHTupleseconds)
static double HSystem.CountSeconds()<span style="font-family:'Times New Roman'; font-size:14px; line-height:21px"> </span>

下面我们看一下类的生命周期:从声明(Declaration)到终结(Finalization)

下面的声明仅仅声明了一个类HImage的变量,而没有指向任何的对象:

[cpp] view plaincopy
HImage Image1;

在这个语句中,你不能只使用变量直接去调用算子;有些语言里面甚至不能够将它用做一个输出参数(例如VB 2005)。只有先给它一个图像对象,例如:

[cpp] view plaincopy
Image1 =Framegrabber.GrabImage();

你也可以在声明的时候初始化一个变量:

[cpp] view plaincopy
HImage Image2 =Framegrabber.GrabImage();

[cpp] view plaincopy
<span style="font-family:Arial,Helvetica,sans-serif"></span><pre name="code" class="cpp">HImage Image3 = null;</pre>

你可以通过一个IsInitialized方法来检验一个类实例是否被初始化。

但是使用构造函数(Constructors)后的对象就可以了:

下面的式子是利用类HImage空的构造函数来初始化一个类变量

[cpp] view plaincopy
HImage Image4 = new HImage(); <span style="font-family:'Times New Roman'; font-size:14px"> </span>

类实例可以用来调用“类似构造函数”算子像GrabImage,用抓住的一张图片初始化类变量:

[cpp] view plaincopy
Image4.GrabImage(Framegrabber);

除了空的构造器,大部分HALCON/.NET类提供一个或者更多的构造器来初始化基于HALCON算子的对象。例如,HImage提供了一个构造器:

[cpp] view plaincopy
HImage Image5 = newHImage("fuse");<span style="font-family:'Times New Roman'; font-size:14px; line-height:21px"> </span>

reference manual和右键go to definition是很好的参考资料。

关于Finalizers

在.NET中程序员不需要考虑内存管理方面的事情,因为它有自动垃圾回收回收哪些不再使用的对象。HALCON/.NET完全遵循这种规则通过提供所有类的回收器,所以不需要管理资源,例如,一个图像采集设备的连接会被自动正确的删除。

对于大部分类,回收器自动调用合适的算子像CloseFramegrabber来释放资源。调用的算子在一个参考手册页中列了出来(例如HFramegrabber)。这个算子不可以通过类来调用,在相应的参考手册条目中可以看到:

[cpp] view plaincopy
static void HOperatorSet.CloseFramegrabber (HTupleacqHandle)

也就是说你没有必要调用这样一个算子,如果你想用别的参数从新进行连接,它会自动执行。

注意当用HFramegrabber一般的类时不能使用HOperatorSet来关闭或者清除算子。

但是对于像图像这种数据变量,它们包含的只是引用,对于他们指向的内存垃圾回收机制也许不会直接清除,这些就需要手动清除:

有一种方法是在处理完事件后直接调用GC清除:

[cpp] view plaincopy
private void Timer_Tick(object sender, System.EventArgs e)
{
Action();
GC.Collect();
GC.WaitForPendingFinalizers();
}

另一种方法是直接调用自带的销毁方法:

[cpp] view plaincopy
HImage Image = new HImage("fuse");
...
Image.Dispose();


鬼泣3的秘籍?
进入玄武岩通路,在礼典准备室解开迷题后(需要打开墙壁)取得ORIHALCON。图dmc031-图dmc032来到黑曜石通路,在拐角尽头取得BLUE ORB FRAGMENT后,进入最深部礼典室,BOSS战开始。BOSS还是但丁的哥哥,这次虽然他改变了攻击方式,但打法和上一次相同,还是用Gunslinger(枪神)高跳后交替连打□键和○键,如果你的按键速度够快...

鬼泣3第三关进入一个三层的楼内再怎么走?
回到沉默せし女神像の间,使用从三个房间取得的道具后,可得新武器并出现新通路。 MISSION 7 A CHANCE MEETING 在最下边的图书馆里取得ORITHALCON FRAGMENT。 来到最上边进入绿色的门,在回廊上方可取得BLUE ORB FRAGMENT。图dmc011 进入顶に道きし骷髅の回廊,在静寂なる灵安の间取得SIREN’S SHRIEK。 在升降机关の...

视觉传达设计专业的就业前景怎么样?
大学学视觉传达设计专业,其实是非常有前景的专业,我们知道未来的世界一定是智能机器人的世界,机器人离不开大脑、眼睛和四肢,而视觉识别其实就是智能机器人的眼睛,它不只是拍照的功能,还要有分析和学习、识别的能力,就像我们的人眼睛一样,要能够测出大概的距离,识别出颜色、形状、大小等信息,并能...

香港特别行政区17242313794: 如何在VC环境下使用Halcon库 -
蓟黎贝科: 在VC环境下进行图像处理比在MATLAB下开发运算速度要快,但工作量要大的多,用MATLAB做图像处理,直接调用里面的相关函数就可以完成,而且比较直观,但满足不了在速度上要求比较高的场合.所以在VC环境下直接开发往往是首选,...

香港特别行政区17242313794: 如何用halcon检测多个圆形,并计算每个圆的面积 -
蓟黎贝科: 方法很多,可以利用edge xld, fit circle 找到圆形,然后生成region 计算面积.

香港特别行政区17242313794: 怎样使用HALCON/.NET类 -
蓟黎贝科: 例如在C++中,可以使用以下两种方法:1. C++(算子模式) 通过代码导出,以C++为例,默认导出为算子型的语法结构,而非面向对象的;在此模式下,全部函数声明为全局类型,数据类型只需要用Hobject、HTuple两类类型进行声明;2. C++(面向对象) 可以以面向对象的方式重写代码,也即利用类及类的成员函数;在这种模式下,控制变量的类型仍未HTuple,而图形数据可以由多种类型,如HImage等;HALCON手册建议使用者使用第二种方法.

香港特别行政区17242313794: 如何利用Halcon进行二维码QR码的识别 -
蓟黎贝科: 众所周知,二维码在网络上已经普及开来,由于他易于识别,信息量大,我们常常登陆微信网页版,支付的时候都需要进行二维码的扫描.而工业生产中,我们也常用二维码识别,如果自己...

香港特别行政区17242313794: vs中如何用c++语言调用halcon -
蓟黎贝科: 通过小猫拉屎对你的伟大支持来调用小猫吃饭来驱动小猫解手

香港特别行政区17242313794: 如何在vc++中调用halcon的hdev档案 -
蓟黎贝科: vc使用halcon 使用hdevelop导出halcon程序的c++代码之后,比如 [cpp] view plaincopyread_image (image, 'C:/Documents and Settings/Administrator/桌面/vision/IMG_20121015_091436.bmp') rgb1_to_gray (image, GrayImage) dev_set_color('...

香港特别行政区17242313794: c#使用halcon判断hobject有没有赋值 -
蓟黎贝科: HObject 型ho_Image转BYTE型的pImage,示意代码 GetImagePointer1(ho_Image, &hv_Pointer, &hv_Type, &hv_Width, &hv_Height); BYTE *p=(BYTE *)hv_Pointer[0].L(); int height= (Hlong)hv_Height; int width = (Hlong)hv_Width; memcpy(pImage,p,width*height*sizeof(BYTE));

香港特别行政区17242313794: 如何用VC++中的MFC调用halcon程序~详细步骤是什么~O(∩ - ∩)O谢谢 -
蓟黎贝科: LEDSel = 0x01; TRVE,&LEDSel,1,BitSize);

香港特别行政区17242313794: 通力电梯77U/N和61U/N在电梯的什么位置
蓟黎贝科: 77U/N为一组,61U/N为一组,分别装在电梯轿厢顶部两侧的油杯下面或侧面,低速电梯使用的是磁感应器(状似香烟,俗称烟杆),高速的使用的是光电传感器,设备上一般会有贴纸表明传感器的代号,如果没有的话可以手动模拟一下传感器动作,观察轿顶板上的LED灯,每个传感器都有一个专属与它得LED指示灯,看一下传感器动作时灯亮不亮、哪个灯亮就知道了.

香港特别行政区17242313794: 求幂级数 (x - 2)^n/n3^n的收敛半径与收敛区间 -
蓟黎贝科: lim[(n+1)^2&#47;((n+1)^2+1)]&#47;[n^2&#47;(n^2+1)]=1故收敛半径R=1当x=±1时,一般项n^2&#47;(n^2+1)不趋于0故收敛域为(-1,1)

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网