首先,还是谈谈图像像素时数据获取方面吧,.net中的图像相关类基本上都是基于GDI+的,因此,图像数据的获取其实也是调用GDI+的一些函数。这个函数就是LockBits,在vb.net中彩色图像数据的快速获取 一文中,我们是调用了Marshal.Copy把LockBits锁定的内存数据拷贝到数据中,然后对数组中的值进行处理。这样做主要的原因是VB.NET不好直接访问内存(Marshal.ReadByte之类的函数不适合用于大型的循环中)。那么,这就造成了2个不好的事情,第一:在同一时间需要2倍于图像数据量的内存,第二:内存数据拷贝到数据,以及处理后再把数组的数据拷贝会内存中都是会减低速度的。作为一种改进,我们应该充分利用LockBits的功能。LockBits中的LockMode中有一种模式为ImageLockMode.UserInputBuffer,该模式下需要用户先申请内存,然后在把图像数据按照相关格式填充如这个内存中。这样,就可以先定义个数组,然后把图像数据填充到这个数组中,就避免了来回拷贝的耗时了,简单示例代码如下:
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、网络空间、营销软件、网站建设、敦煌网站维护、网站推广。
Dim BmpData As New BitmapData
Stride = ((Bmp.Width * 3 + 3) And HFFFFFFFC)
Dim PixleValue(Stride * Bmp.Height) As Byte
Dim Hanlde As GCHandle = GCHandle.Alloc(PixleValue, GCHandleType.Pinned)
BmpData.Scan0 = Hanlde.AddrOfPinnedObject()
运动控制卡与PLC都是控制器,主要负责工业自动化系统中运动轴控制、输入输出信号控制;
运动控制卡:基于PC界面,由于PC机的强大功能,因此与其一起组成的运动控制器功能最强,但其工作稳定性、可靠性较差。运动控制卡通过PCI插槽将控制卡插在PC的主机上;利用高级编程语言C++、C#、VB、VB.NET、labview等编程语言进行开发;编程中使用运动控制卡厂商提供的控制卡API接口函数,来实现对控制卡资源的使用;运动控制卡通过发送脉冲的方式控制伺服或步进驱动器来控制伺服电机或步进电机、通过读取输入信号、控制输出信号来实现对继电器、传感器、气缸等IO的控制;运动控制卡主要的优势在于利用PC强大的功能,比如CAD功能、机器视觉功能、软件高级编程等;利用FPGA+DSP / ARM + DSP芯片的功能实现高精度的运动控制(多轴直线、圆弧插补等,运动跟随,PWM控制等)。
PLC可编程逻辑控制器:主要功能是对开关量进行逻辑控制,并有简单的运动控制(直线轨迹控制)、运算、数据处理等功能,通常采用触摸屏作人机界面。具有工作可靠,编程简单等优点,但其运动控制功能相对简单。PLC的应用过程中主要通过PLC+HMI,这就导致可视化界面受到极大地限制,实际应用过程中最大的问题就是不能实现导图功能;现在由于机器视觉大力的发展与应用,PLC与机器视觉的结合难度很大;目前有部分厂商给PLC提供一种机器视觉方案,独立的PC机处理视觉部分,将处理的结果发送给PLC,PLC来应用所接收数据进行操作。这种方式提高了开发成本,一套控制系统需要两套软件来执行。
这问题有点笼统,软糖来说说把:
图像处理由System.Drawing命名空间负责。
主要是Bitmap类和Graphics类。
Bitmap表示一个位图,可以是BMP,JPG,PNG等文件。
装载位图
Dim 位图 As Bitmap = Bitmap.FromFile("C:\Image1.PNG")
Graphics表示一张画纸,能够进行绘制操作。
它可以被窗体、控件、位图调用CreateGraphics()方法来创建。
然后调用Graphics.Draw开头的一系列函数来绘制图像和图形,Fill开头的填充图形。
创建画纸并绘制位图
Dim 画纸 As Graphics = Me.CreateGraphics()
画纸.DrawImage(位图, 100, 100, 256, 256)
可以将上面三行放到Form1_Load中测试,把路径改一下,
还可以把Me改为能在上面绘图的控件的名称。
更多内容请看MSDN的System.Drawing命名空间。
如满意,请采纳,谢谢。
HALCON对于机器视觉的学习者、开发者而言并不陌生,称其为机器视觉领域第一软件,亦无可厚非。
HALCON对于视觉系统的控制、图像的处理和分析都能够较好的实现,尤其是各种图像处理算法。但就其本身而言,开发用户界面并不理想。用户界面以及对于其他底层的控制,比如和底层电路板、PLC等的控制和通信,可通过VC++、VB等进行开发。方便的是,HALCON恰恰能够被这些开发工具所调用,它支持C、C++、VB、JAVA等等。
刚开始结合VC++结合HALCON进行学习和开发时,因为软件方面的薄弱,对如何在VC++中如何调用HALCON感到不知所措,也在网上找了一些资料,资料较少,基本内容相同,或许能用,但始终对于笔者个人而言不太灵光。后来在一位软件同事的指导下,对其有了较为深刻的了解,其实说到底对软件工程师而言这是一件很简单的事,也就是将HALCON的库导入VC++。
以下,针对初学者一步步介绍,以MFC作为开发工具。
在Visual Studio中新建项目选择Visual C++下的MFC,其中的MFC应用程序,建立过程不赘述。本文以Visual Studio 2005为例。
打开HALCON安装目录(以HALCON7.0为例,后面的版本也相同),如下图1所示:
将其中的include文件夹整个拷贝至所建MFC项目工作目录下,如下图2所示:
同样,将HALCON的LIB文件拷贝到所建MFC项目工作目录下,因使用C++进行开发,所以选择X:Program FilesMVTecHALCONlibi586-nt4下的halconcpp.lib,这里X:为安装盘符
打开stdafx.h,在文件中空白位置处,加入
#include "include/cpp/HalconCpp.h"
#prama comment(lib,"halconcpp.lib")
下一步,点击项目下的属性,如下图6所示:
点开配置属性中的C/C++,如下图7所示:
当点在附加包含目录右侧空白框时,会出现的图标,点开,如下图8所示:
点击新建行,将所建MFC项目工程目录下的include文件夹的地址输入,也就是刚才我们拷贝过去的那个文件夹
最后一步,在需要使用HALCON库的地方,将其头文件导入,以****Dlg.cpp为例
这样我们就算成功在VC++/MFC中导入了HALCON库文件,就可以调用HALCON的函数,使用其强大的算法。另外,单纯执行上述步骤后,按F5启动调试,应该是不会有任何的ERROR和WARNING的。此方法同样适用于VB,在此不赘述,VB的开发者可自行尝试。
开始做Halcon的上位机,选用Visual Studio 10.0平台。
C#
第一步:
Visual Studio 10.0设置引用HalconDotNet.dll
01.新建项目
02.选择Visual C#
03.修改文件名
04.确认
第二步
Visual Studio 10.0设置引用HalconDotNet.dll
01.选择“解决方案资源管理器”
02.选择“引用”,右键
03.选择“添加引用”
第三步
Visual Studio 10.0设置引用HalconDotNet.dll
01.在添加引用选项卡选择浏览
02.选择路径:X:\Program Files\MVTec\HALCON-10.0\bin\dotnet20
03.选择“HalconDotNet.dll”
04.确认
第四步
Visual Studio 10.0设置引用HalconDotNet.dll
01.选择“工具箱”
02.选择“所有工具”或任意工具控件,右键
03.选择“选择项”
第五步
Visual Studio 10.0设置引用HalconDotNet.dll
选择Halcon图像控件
Visual Studio 10.0设置引用HalconDotNet.dll
还有VB的设置,如下图:
Visual Studio 10.0设置引用HalconDotNet.dll
01.选择项目名称
02.点击显示全部文件,取消隐藏,就可以看到引用
03.引用,邮件
04.添加,之后的步骤和C#一样
Visual Studio 10.0设置引用HalconDotNet.dll
选择工具控件,步骤和C#基本一样。
VB的第二张图,步骤如下
01.选择“工具箱”
02.选择“所有工具”或任意工具控件,右键
03.选择“选择项”
04.在“.net framwork组件”的选项卡中,选择浏览
05.出来的对话框中,选择X:\Program Files\MVTec\HALCON-10.0\bin\dotnet20
06.选择“HalconDotNet.dll”
07.确认
08.这时候的工具栏的控件是HWinwow 控件。
kamuixiao :
X:\Program Files\MVTec\HALCON-10.0\bin\dotnet20
路径下的无法使用,在.net framework组件无法找到
X:\Program Files\MVTec\HALCON-10.0\bin\dotnet35
路径下的可用,在.net framework组件下可以找到,并且在工具箱上能够找到并使用,但是功能无法实现,如下图
我不作其他动作,程序代码内容仅是运行时候读取一张图片,
在调试的时候能够运行,但读不到图片……楼主在VB.NET环境下正常运行了吗?求解~
Visual Studio 10.0设置引用HalconDotNet.dll
x8515618 :
定义错了
dim m_hWindow As Htuple '这是一个句柄,不是窗体控件
x8515618 :
Dim m_hWindow As Htuple = Nothing
kamuixiao :
谢谢楼上的建议,但是我试了下发现仍然不行,我觉得问题不是出在这里,不知道使用VB.NET的各位有没有遇到过,反正我是没能正常实现过一次的,输出显示的错误情况如图:
Visual Studio 10.0设置引用HalconDotNet.dll
x8515618 :
你只是读取了图片,都没有显示图片呢
灵峤 lencue :
你最开始新建项目的时候选择的“.net框架”版本是多少的?.net 2.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 :
请问在VS 2005 C# 处理视频,程序老是死掉,怎么办?视频无法实时显示。 是不是视频太大了,VS2005处理不够来?该怎么办?
灵峤 lencue :
采用C#的多线程,具体怎么使用,我还在学习中,要是有进展,再一起讨论。
好吧,我写漏了,但事实上我把显示补上,然后按照兄台所说修改定义后仍然没能成功!~附图:
Visual Studio 10.0设置引用HalconDotNet.dll
irun999 :
今天下午发现视频无法显示是因为hdevelop导出程序的死循环函数里没有 HOperatorSet.DispObj 显示函数。但是关闭程序就会出现vshost.exe无响应。这个问题可能得多线程解决了。
一般二次开发用vb.net或者c#即可,如果想要自己写算法做开发,或者定制现有的算法,建议使用C++