C++ 调用Halcon引擎,脚本调试代码

一,背景: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脚本执行了。
在这里插入图片描述
在这里插入图片描述

在使用C#进行编程时,如果你想检测连接到计算机上的相机设备,并将这些设备的信息显示在一个ComboBox控件中,你可以使用Windows的WIA(Windows Image Acquisition)库或者更现代的MediaCapture类,取决于你的应用场景。以下是一个简单的示例代码,演示如何使用WIA库来实现这个功能: 首先,你需要在项目中添加对WIA的引用。在Visual Studio中,可以通过项目 -> 添加引用 -> 框架 -> 找到并选择 'Microsoft.Office.Interop.Wia' 来添加引用。 ```csharp using System; using System.Collections.Generic; using System.Windows.Forms; using Microsoft.Office.Interop.Wia; namespace CameraDetectionExample { public partial class MainForm : Form { private WIA.ImageDevice wiaImageDevice; public MainForm() { InitializeComponent(); InitializeCameraDevices(); } private void InitializeCameraDevices() { ComboBox comboBoxCameras = new ComboBox(); comboBoxCameras.Location = new System.Drawing.Point(10, 10); comboBoxCameras.Width = 200; comboBoxCameras.Height = 20; this.Controls.Add(comboBoxCameras); // 获取并列出所有连接的相机设备 wiaImageDevice = new WIA.ImageDevice(); wiaImageDevice.Connect(); foreach (WIA.Device device in wiaImageDevice.Items) { if (device.Type == WIA.WIA_DEVICE_TYPE.WIA_DEVICE_TYPE相机) { comboBoxCameras.Items.Add(device.Properties["Description"].Value); } } } } } ``` 以上代码将会在窗体上创建一个ComboBox控件,并在应用程序初始化时填充连接到系统的相机设备名称。这里使用了WIA库来枚举和连接到相机设备。 需要注意的是,WIA库主要用于与旧的扫描仪和相机设备进行交互,对于现代的网络摄像头和高分辨率的相机,可能需要使用更高级的库,如Windows的MediaCapture类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值