一,背景:C++调用halcon最常见的方式便是转C++代码,然后封装成函数或者类库。另外一种方式是调用Halcon脚本,不需要转换成C++代码,Debug的时候,可以直接跳入halcon脚本,单步查看每一行算法执行情况,非常方便,缺点是效率没有C++的方式高。
二、实现步骤
2.1 先在halcon编辑界面封装一个.hdvp格式的脚本函数,然后利用halcon引擎,在C++中调用即可。
2.2 脚本编辑具体实施步骤如下
2.2 C++调用脚本步骤
#pragma once
#pragma execution_character_set("utf-8")
#include <iostream>
#include <vector>
#include <stdio.h>
#include <iomanip>
#include <sstream>
#include <fstream>
#include <thread>
#include <string>
#include <mutex>
#include <io.h>
#include <direct.h>
#include <Halcon.h>
#include <HalconCpp.h>
#include <HDevEngineCpp.h>
using namespace std;
using namespace HalconCpp;
using namespace HDevEngineCpp;
class HalconJiaoBen
{
public:
HalconJiaoBen();
~HalconJiaoBen();
int TestFunc(string Path, string name);
private:
HDevEngine *gMyEngine; //Halcon引擎
HDevProcedure gProgram; //创建程序
HDevProcedureCall gProcedureCall; //调用程序
};
#include "HalconJiaoBen.h"
HalconJiaoBen::HalconJiaoBen()
{
gMyEngine = new HDevEngine();
}
HalconJiaoBen::~HalconJiaoBen()
{
delete gMyEngine;
}
int HalconJiaoBen::TestFunc(string Path, string name)
{
//设置引擎(devp文件夹路径)
gMyEngine->SetProcedurePath(Path.c_str()); //devp文件夹路径
//设置程序和回调函数
gProgram.LoadProcedure(name.c_str());//devp文件名称
gProcedureCall = HDevProcedureCall(gProgram);
//启动调试服务
gMyEngine->StartDebugServer();
//★等待debug连接,程序会在Execute步骤等待,直至Halcon附加到进程
gProcedureCall.SetWaitForDebugConnection(true);
//设置输入参数
HObject img;
ReadImage(&img, "E:/test.bmp");
gProcedureCall.SetInputIconicParamObject("hImage", img);
gProcedureCall.SetInputCtrlParamTuple("low", 200); //设置输入参数
gProcedureCall.SetInputCtrlParamTuple("height", 255); //设置输入参数
//执行程序
gProcedureCall.Execute();
//获取结果
HTuple retX,retY, retData;
retX = gProcedureCall.GetOutputCtrlParamTuple("retX"); //获取输出参数
retY = gProcedureCall.GetOutputCtrlParamTuple("retY"); //获取输出参数
retData = gProcedureCall.GetOutputCtrlParamTuple("retData"); //获取输出参数
//停止调试服务
gMyEngine->StopDebugServer();
return 0;
}
//Halcon脚本引擎测试
halconJiaoBen = new HalconJiaoBen();
halconJiaoBen->TestFunc(QCoreApplication::applicationDirPath().toStdString() + "/JiaoBen", "HalconJiao");
2.3 需要注意gMyEngine->SetProcedurePath(Path.c_str());设置的是脚本所在文件夹路径,不是文件路径。
gProgram.LoadProcedure(name.c_str());设置的是脚本文件的名称,而不是路径加名称。
2.4配置include路径:
…\HalconSDK\include
…\HalconSDK\include\halconcpp
…\HalconSDK\include\hdevengine
链接器:
halconcpp.lib
hdevenginecpp.lib
依赖库:
hdevenginecpp.dll
三、测试
3.1 测试的时候可以直接运行C++代码。然后打开脚本文件,在运行工具栏下面,选择附加到进程,C++代码设置断点进行调试,就可以跳入到halcon脚本执行了。