使用halcon引擎的优点:
1、C++代码与HALCON图像处理分离,不需要将HALCON图像处理部分导出成C++代码,否则每一次修改HALCON 时,C++相应部分就需要跟着更改,便捷性不足。
2、脚本方式执行算法可降低内存泄漏。
下面介绍使用HALCON引擎执行脚本基础部分:使用的是VS2017和HALCON20.11学习版。
在项目中添加下面两个库文件:
主要用得到的类:
HDevEngine类是管理全局设置。如设置或获取全局变量的值、设置脚本路径、启动停止调试模式等。
HDevProgram类加载.hdev格式文件以及获取文件内部参数一般信息。
HDevProgramCall类执行.hdev文件格式脚本,并获取变量的值。
HDevProcedure类加载.hdvp格式外部函数以及内部函数。
HDevProcedureCall类执行.hdvp外部函数和内部函数。并且可以设置或获取外部函数、内部函数参数。
HDevOpMultiWindowImpl类主要是与显示结果相关,在脚本中执行的结果可以显示在C#中。
HDevEngineException类是引擎相关的异常类。
基本使用方式:
方式一:执行.hdev格式。无任何封装函数,该种方式重用性差,无法设置参数。
方式二:路径+.hdvp格式。该方式比较推荐使用,可设置输入参数,获取输出参数,重用性好。
方式三:调用.hdev中的封装函数(外部函数、内部函数)。该方式优点在于方便在HALCON中读图调试。
本系列所有关于C++和halcon的例子都采用 方式三 调用。
QT调用halcon封装函数的流程代码:
QString appPath = QApplication::applicationDirPath();
QString algPath = appPath + "/HalconAlg";
HEngine.SetProcedurePath(algPath.toStdString().c_str()); //设置算法程序所在的文件夹路径
QDir dir(algPath);
QStringList filters;
filters << "*.hdvp";
QFileInfoList fileList = dir.entryInfoList(filters, QDir::Files | QDir::Readable, QDir::Name);
try
{
for each (auto var in fileList) // fileList存储的是所有,.hdvp函数的文件命
{
QString algName = var.baseName();
HDevProcedure procedure;
procedure.LoadProcedure(algName.toStdString().data()); // 加载算法
HDevProcedureCall procedureCall = HDevProcedureCall(procedure);
m_algProcedureMap.insert(algName, procedureCall);
}
}
catch (HException &HDevExpDefaultException)
{
QString strError;
HTuple hv_Exception;
HDevExpDefaultException.ToHTuple(&hv_Exception);
strError = hv_Exception.ToString();
QMessageBox::warning(NULL, "warning", "算法加载失败!");
LOG(ERROR) << strError;
}
开发 halcon 的 .hdev中的封装函数(此处只展示外部函数)步骤:
点击函数创建函数,进入如下窗口,先择.hdvp文件,参数可设置输入和输出参数