1. 如何在VB,VC和.NET中使用halcon
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的开发者可自行尝试。
2. 如何在vc++中调用halcon的hdev档案
vc使用halcon
使用hdevelop导出halcon程序的c++代码之后,比如
[cpp] view plainread_image (image, 'C:/Documents and Settings/Administrator/桌面/vision/IMG_20121015_091436.bmp')
rgb1_to_gray (image, GrayImage)
dev_set_color('blue')
*bin_threshold (GrayImage, Region)
threshold(GrayImage,Region,100,255)
area_center (Region, Area, Row, Column)
生成c++代码
[cpp] view plain///////////////////////////////////////////////////////////////////////////////
// File generated by HDevelop for HALCON/C++ Version 10.0
///////////////////////////////////////////////////////////////////////////////
#include "HalconCpp.h"
using namespace Halcon;
#ifndef NO_EXPORT_MAIN
// Main procere
void action()
{
using namespace Halcon;
// Local iconic variables
Hobject image, GrayImage, Region;
// Local control variables
HTuple Area, Row, Column;
read_image(&image, "C:/Documents and Settings/Administrator/桌面/vision/IMG_20121015_091436.bmp");
rgb1_to_gray(image, &GrayImage);
if (HDevWindowStack::IsOpen())
set_color(HDevWindowStack::GetActive(),"blue");
bin_threshold(GrayImage, &Region);
area_center(Region, &Area, &Row, &Column);
}
#ifndef NO_EXPORT_APP_MAIN
int main(int argc, char *argv[])
{
using namespace Halcon;
// Default settings used in HDevelop (can be omitted)
set_system("do_low_error","false");
action();
return 0;
}
#endif
#endif
新建一个对话框mfc程序(vc2008),添加一个按钮button1,加入如下代码(我将action函数稍微改了一下)
当然先要#include "HalconCpp.h"
[cpp] view plain// Main procere
double action( char * p)
{
using namespace Halcon;
// Local iconic variables
Hobject image, GrayImage, Region;
// Local control variables
HTuple Area, Row, Column;
read_image(&image, p);
rgb1_to_gray(image, &GrayImage);
if (HDevWindowStack::IsOpen())
set_color(HDevWindowStack::GetActive(),"blue");
//bin_threshold(GrayImage, &Region);
threshold(GrayImage, &Region,50,255);
area_center(Region, &Area, &Row, &Column);
double d=Area[0];
return d;
}
void CabcDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
double d=action("C:/Documents and Settings/Administrator/桌面/vision/IMG_20121015_091436.bmp");
CString str;
str.Format("%f",d);
AfxMessageBox(str);
}
编译程序之前需要先设置一下include和链接环境,对于vc2008
工具/选项/项目解决方案/vc++目录/包含文件/ 添加
C:\Program Files\MVTec\HALCON-10.0\include
C:\Program Files\MVTec\HALCON-10.0\include\cpp
工具/选项/项目解决方案/vc++目录/库文件/ 添加
C:\Program Files\MVTec\HALCON-10.0\lib\x86sse2-win32
然后执行即可。
3. vc halcon 定义冲突怎么办
用VC创建工程 1.首先在project->settings.....中的Link属性页中添加halconcpp.lib; 2. 其次在project->settings.....中的C/C++属性页中的Preprocessor中添加目(HALCONROOT)\include,(HALCONROOT)\include\cpp; 然后加入头文件#include "HalconCpp.h" 最后加入语句#pragma comment(lib,"halconcpp.lib") 就可以使用halcon的库了
4. halcon程序可运行于安卓吗
halcon程序可运行于安卓。halcon是德国MVtec公司开发的一套完善的机器视觉算法包,拥有灵活的机器视觉集成开发环境,用户可快速完成图像处理与分析的开发工作。在欧洲以及日本工业界公认halcon软件是最佳机器视觉软件。halcon软件有一千多个独立的函数,其中包含了各类滤波、几何转换、形态学计算分析等。
halcon程序功能
halcon软件支持Windows、Linux和MacOSX操作环境,整个函数库可以用C、C+C#等,Visualbasic和Delphi等多种编程语言调用。halcon软件为百余种工业相机和图像采集卡提供了接口。HALCON软件提供了一套交互式程序开发工具HDevelop,可在其中以halcon程序代码直接编写、修改、执行程序,并且可以查看计算过程中的所有变量。
5. 机器视觉怎样开始学halcon与c++还是c#搭配好
java和C的运行效率对比:C的运行效率明显要比JAVA高,因为C是编译型的,直接将源码编译成机器代码;而JAVA是解释型,源码被编译成二进制伪代码,由JAVA虚拟机解释执行。但是,由于C是编译型的,它的可移植性差;而JAVA是解释执行,因此具有很好的移植性,可跨平台运行。编一个普通的本地应用程序,一般c 要快于java, 编web应用,由于c实现的cgi程序基本是进程型,而java application server 的管理servlet采用线程方式,所以,在访问量大的情况下,java有优势。
6. HALCON机器视觉软件的HALCON简介
它节约了产品成本,缩短了软件开发周期——HALCON灵活的架构便于机器视觉,医学图像和图像分析应用的快速开发。在欧洲以及日本的工业界已经是公认具有最佳效能的Machine Vision软件。
HALCON源自学术界,它有别于市面一般的商用软件包。事实上,这是一套image processing library,由一千多个各自独立的函数,以及底层的数据管理核心构成。其中包含了各类滤波,色彩以及几何,数学转换,形态学计算分析,校正,分类辨识,形状搜寻等等基本的几何以及影像计算功能,由于这些功能大多并非针对特定工作设计的,因此只要用得到图像处理的地方,就可以用HALCON强大的计算 分析能力来完成工作。应用范围几乎没有限制,涵盖医学,遥感探测,监控,到工业上的各类自动化检测。
HALCON支持Windows,Linux和Mac OS X操作环境,它保证了投资的有效性。整个函数库可以用C,C++,C#,Visual basic和Delphi等多种普通编程语言访问。HALCON为大量的图像获取设备提供接口,保证了硬件的独立性。它为百余种工业相机和图像采集卡提供接口,包括GenlCam,GigE和IIDC 1394。
7. halcon配置mfc报错函数找不到标识符
任务:将参数保存到配置文件和从配置文件读取参数项。
一开始,我想通过halcon中的open_file,等算子来文件的保存和读取,虽然没有报错,但是保存的文件不知在哪,估计没有保存成功。查资料过程中,了解到可以用配置文件实现这功能。
第一步,编辑资源中的菜单项,添加两个菜单,本例子中使用“设置”和“读取”两菜单项。
第二步,添加菜单事件响应。
第三步,修改设置菜单项响应函数如下:
void CHalconMFCDlg::OnSetParameter()
{
// TODO: Add your command handler code here
CString Filename,pathname;
CString strSection,strSectionKey,strValue;
CFileDialog dlg(FALSE, ".ini",NULL, OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT,_T("配置文件|*.ini|All files|*.*||"));//OFN_ALLOWMULTISELECT打开多文档选项。
if (dlg.DoModal()==IDOK) //如果返回为确定,获得选择的文件名
{
//获取完整文件名
pathname = dlg.GetPathName( ); //
char PathBuff[256];
//GetCurrentDirectory(256,PathBuff); // 获取当前路径。
//pathname.Format("%s\%s",PathBuff,Filename);
strSection = "显示区域";
strSectionKey = "左上角行坐标 ";
//strValue = "";
strValue.Format("%d",m_Row1);
WritePrivateProfileString(strSection,strSectionKey,strValue,pathname);
strSectionKey = "左上角列坐标 ";
//strValue = "";
strValue.Format("%d",m_Col1);
WritePrivateProfileString(strSection,strSectionKey,strValue,pathname);
strSectionKey = "右下角行坐标 ";
//strValue = "";
strValue.Format("%d",m_Row2);
WritePrivateProfileString(strSection,strSectionKey,strValue,pathname);
strSectionKey = "右下角列坐标 ";
//strValue = "";
strValue.Format("%d",m_Col2);
WritePrivateProfileString(strSection,strSectionKey,strValue,pathname);
strSection = "分割方法";
strSectionKey = "分割方法 ";
//strValue = "";
m_ComboSelectMethod.GetWindowTextA(PathBuff,256);
strValue.Format("%s",PathBuff);
WritePrivateProfileString(strSection,strSectionKey,strValue,pathname);
MessageBox("设置已保存");
}
}
第四步,修改读取菜单项响应函数如下:
void CHalconMFCDlg::OnGetParameter()
{
// TODO: Add your command handler code here
CString Filename,pathname;
CString strSection,strSectionKey,strValue;
char strBuff[256];
CFileDialog dlg(TRUE,".ini",NULL, OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT,_T("配置文件|*.ini||"));//OFN_ALLOWMULTISELECT打开多文档选项。
if (dlg.DoModal()==IDOK) //如果返回为确定,获得选择的文件名
{
//读取完整文件名,包括路径和后缀
Filename = dlg.GetPathName( );
//读取ini文件中的字符串
strSection = "分割方法";
strSectionKey = "分割方法 ";
GetPrivateProfileString( strSection, strSectionKey,NULL, strBuff,80, Filename);
strValue.Format("%s",strBuff);
//读取ini文件中的数字
strSection = "显示区域";
strSectionKey = "左上角行坐标 ";
m_Row1 = GetPrivateProfileInt(strSection,strSectionKey,10,Filename);
strSectionKey = "左上角列坐标 ";
m_Col1 = GetPrivateProfileInt(strSection,strSectionKey,10,Filename);
strSectionKey = "右下角行坐标 ";
m_Row2 = GetPrivateProfileInt(strSection,strSectionKey,10,Filename);
strSectionKey = "右下角列坐标 ";
m_Col2 = GetPrivateProfileInt(strSection,strSectionKey,10,Filename);
//更新相应数据
m_ComboSelectMethod.SetWindowTextA(strValue);
UpdateData(FALSE);
}
}
在前面的基础上,添加这些代码就可以实现配置文件的读写。这里简单的介绍配置文件读写涉及到的几个函数。
//一、向ini文件中写入信息的函数
//1. 把信息写入系统的win.ini文件
BOOL WriteProfileString(
LPCTSTR lpAppName, // 节的名字,是一个以0结束的字符串
LPCTSTR lpKeyName, // 键的名字,是一个以0结束的字符串。若为NULL,则删除整个节
LPCTSTR lpString // 键的值,是一个以0结束的字符串。若为NULL,则删除对应的键
)
//2. 把信息写入自己定义的.ini文件
BOOL WritePrivateProfileString(
LPCTSTR lpAppName, // 同上
LPCTSTR lpKeyName, // 同上
LPCTSTR lpString, // 同上
LPCTSTR lpFileName // 要写入的文件的文件名。若该ini文件与程序在同一个目录下,
// 也可使用相对路径,否则需要给出绝度路径。
)
//若在win.ini中创建一个Test节,并在该节中创建一个键id,其值为xym,则可以这样写:
WriteProfileString("Test", "id", "xym");
//若在Ex1目录下的ex1.ini中创建一个Test节,并在该节中创建一个键id,其值为xym
WritePrivateProfileString("Test", "id", "xym", "d:\vc\Ex1\ex1.ini");
//若Ex1.ini文件与读写该文件的程序在同一个目录下,则上面语句也可写为:
WritePrivateProfileString("Test", "id", "xym", ".\ex1.ini");
需要注意的是,C系列的语言中,转义字符“\”表示反斜线“”。另外,当使用相对路径时,“\”前的“.”号不能丢掉了。
//二、从ini文件中读取数据的函数
//1、从系统的win.ini文件中读取信息
//(1) 读取字符串
DWORD GetProfileString(
LPCTSTR lpAppName, // 节名
LPCTSTR lpKeyName, // 键名,读取该键的值
LPCTSTR lpDefault, // 若指定的键不存在,该值作为读取的默认值
LPTSTR lpReturnedString,// 一个指向缓冲区的指针,接收读取的字符串
DWORD nSize // 指定lpReturnedString指向的缓冲区的大小
)
//如:
CString str;
GetProfileString("Test", "id", "Error", str.GetBuffer(20),20);
//(2) 读取整数
UINT GetProfileInt(
LPCTSTR lpAppName, // 同上
LPCTSTR lpKeyName, // 同上
INT nDefault // 若指定的键名不存在,该值作为读取的默认值
)
//如使用以下语句写入了年龄信息:
WriteProfileString("Test", "age", "25");
// 在win.ini中创建一个Test节,并在该节中创建一个键age,其值为25。
//则可用以下语句读取age键的值:
int age;
age = GetProfileInt("Test", "age", 0);
//2、从自己的ini文件中读取信息
//(1) 读取字符串
DWORD GetPrivateProfileString(
LPCTSTR lpAppName, // 同1(1)
LPCTSTR lpKeyName, // 同1(1)
LPCTSTR lpDefault, // 同1(1)
LPTSTR lpReturnedString,// 同1(1)
DWORD nSize, // 同1(1)
LPCTSTR lpFileName // 读取信息的文件名。若该ini文件与程序在同一个目录下,
// 也可使用相对路径,否则需要给出绝度路径。
)
//如:
CString str;
GetPrivateProfileString( "Test", "id","Error", str.GetBuffer(20), 20,".\ex1.ini");
//或:
GetPrivateProfileString( "Test", "id","Error", str.GetBuffer(20), 20,"d:\vc\Ex1\ex1.ini");
//(2) 读取整数
UINT GetPrivateProfileInt(
LPCTSTR lpAppName, // 同上
LPCTSTR lpKeyName, // 同上
INT nDefault, // 若指定的键名不存在,该值作为读取的默认值
LPCTSTR lpFileName // 同上
)
//如使用以下语句写入了年龄信息:
WritePrivateProfileString("Test","age","25",".\ex1.ini");
//在ex1.ini中创建一个Test节,并在该节中创建一个键age,其值为25。
//则可用以下语句读取age键的值:
int age;
age = GetPrivateProfileInt("Test","age",0,".\ex1.ini");
8. 专家们,小弟刚接触机器视觉系统,请问,HALCON输出的C代码能用于DSP芯片吗
应该不行,用OPENCV应该可以
9. 如何用C++调用halcon函数
下面是一个用C++调用halcon函数的实例,说明://后面的部分为程序的说明,在程序运行中是不起作用的。
a) gen_image1_extern函数中的变量width,height必须为HTuple类型,Pointer指针为unsigned char类型,输入时转换为long型。
b) width, height必须与Pointer指向的图像数据的长宽一致。
c) Pointer指针在gen_image1_extern函数调用之前分配了内存,之后不要马上释放,否则会出错。应该在确保不再使用Image变量之后再释放。halcon内部会自动释放Image,感觉没有释放Pointer(还需要进一步验证)。
d) 显示图像时,可能存在着图像的上下翻转,可以按照1中的方法,将图像数据翻转后再调用gen_image1_extern,或者使用halcon中的函数mirror_image()进行翻转。
BITMAPINFO * RotateBmpInfo;
BYTE * bitBuffer;
bitBuffer = NULL;
bitBuffer = new BYTE[sizeof(BITMAPINFO)];
RotateBmpInfo = (BITMAPINFO *)bitBuffer;
RotateBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
RotateBmpInfo->bmiHeader.biHeight = Height;
RotateBmpInfo->bmiHeader.biWidth = Width;
RotateBmpInfo->bmiHeader.biPlanes = 1;
RotateBmpInfo->bmiHeader.biBitCount = 24;
RotateBmpInfo->bmiHeader.biCompression = BI_RGB;
RotateBmpInfo->bmiHeader.biSizeImage = Height * bytewidth;
RotateBmpInfo->bmiHeader.biXPelsPerMeter= 0;
RotateBmpInfo->bmiHeader.biYPelsPerMeter= 0;
RotateBmpInfo->bmiHeader.biClrUsed = 0;
RotateBmpInfo->bmiHeader.biClrImportant = 0;
CWnd * m_pWnd ;
m_pWnd = AfxGetApp()->GetMainWnd();
CDC *pDC = m_pWnd->GetDC();
::StretchDIBits(
pDC->GetSafeHdc(),
Width + 10,
Height + 10,
从VC++到Halcon
unsigned char *Pointer;
int width, height;
Pointer = new unsigned char[width * height];
int i, j;
for (i=0; i<height; i++)
{
for (j=0; j<width; j++)
{
Pointer[i*width+j] = j % 255;
}
}
Hobject Image;
gen_image1_extern(&Image, "byte", (HTuple)width, (HTuple)height, (long)Pointer, NULL);
10. 哪里有c#与halcon联合编程实例
你如果安装了Halcon的话,里面会附有程序员文档,说明了在各种编程语言如何操作Halocn提供的函数或者使用导出的类,并且在Example中提供有关具体应用的例子。常用的方法是先在Halocn提供的集成开发环境中做实验,然后导出成某种编程语言,再应用...