Halcon HDEVELOP 工程导出集成到 C++ 应用程序

2022-11-07 15:32:47 浏览数 (1)

Halcon 的 Hdevelop 可以快速编写算子开发图像处理算法,本文记录将 Hdevelop 代码导出到 C 应用程序的方法。

背景

  • 正确安装 Halcon 我的版本是 20.11
    • 下载链接:https://www.mvtec.com/cn/downloads/halcon
  • 本文内容自官方教学视频整理扩展而来
  • 正确安装、配置例程代码、系统变量

Halcon 导出到 C

  • 在 Halcon 中调试和开发图像处理算法更加便利快捷
  • 开发完成的项目可以以工程或代码形式导出,导出后可以直接供 C 调用
  • 通过工程导出的 Halcon 工程,修改 Halcon 代码重新导出后不需要重新编译 C 工程即可重新运行,并带入新的 Halcon 改动
  • 通过代码形式导出的 Halcon 工程更加灵活,但需要重新编译

Halcon 工程导出

导出 Halcon 工程
Halcon 代码
  • main 函数
代码语言:javascript复制
*
* Initialization
dev_update_off ()
dev_close_window ()
dev_open_window_fit_size (0, 0, 1600, 1200, -1, -1, WindowHandle)
*
* Input parameters
read_image (Image, 'printer_chip/printer_chip_01')
MinGray := 128
*
* Code for application
get_printer_chip_regions (Image, ConnectedRegions, MinGray)
*
* Visualization
dev_display (Image)
dev_display (ConnectedRegions)

  • 其中 get_printer_chip_regions 代码
代码语言:javascript复制
threshold (Image, Region, MinGray, 255)
connection (Region, ConnectedRegions)
return ()

  • 运行效果
导出工程
  • 文件 -> 导出库工程,选择输入文件,输出语言,输出工程位置
  • 导出工程后可以看到 cmakesource 和原始的 halcon 工程文件 *.hdev
Halcon 工程导入 VS C

首先需要 配置好 Halcon 环境变量 最好配置好 Halcon Variable Inspect 插件

导入配置
  • 添加现有项:
  • 添加导出的 srouce 文件夹中的文件:
  • 编写 VS C 调用 Halcon 代码
代码语言:javascript复制
#include "HalconCpp.h"
#include "test_pro/source/test_pro.h"

int main()
{
	HalconCpp::HImage Image("printer_chip/printer_chip_01");
	HalconCpp::HRegion Region;

	test_pro::SetResourcePath("test_pro/res_test_pro");
	test_pro::get_printer_chip_regions(Image, &Region, 128);
}

  • 其中 SetResourcePath("test_pro/res_test_pro") 指向导出的 halcon 工程 hdev 文件所在文件夹
运行效果
  • 此时编译、运行代码,可以在 Variable Inspect 插件中看到运行效果:
  • 表明我们已经成功在 VS 中导入 Halcon 工程
修改 Halcon 工程

通过 Halcon 导出工程 植入 VS 的代码有个好处是修改 Halcon 代码后不需要重新编译 VS C 工程即可达到修改的效果

  • 如果需要修改 Halcon 代码,我们可以直接去调整导出的 hdev 代码
  • 例如我们仅筛选出比较大的区域
  • 修改导出 hdev 的函数代码,添加筛选连通域的语句,保存工程
代码语言:javascript复制
threshold (Image, Region, MinGray, 255)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, ConnectedRegions, 'area', 'and', 22311.8, 50000)
return ()

  • 之后不需要重新编译,直接重新运行之前的工程即可看到新代码的效果
  • 本质上是因为在导出工程的 cpp 源码中直接导入了 hdev 的代码
代码语言:javascript复制
void get_printer_chip_regions(
  HalconCpp::HObject const& Image,
  HalconCpp::HObject* ConnectedRegions,
  HalconCpp::HTuple const& MinGray)
{     
  static HDevEngineCpp::HDevProcedure procedure(GetProgram(sgResourcePath "test.hdev"),"get_printer_chip_regions");
  HDevEngineCpp::HDevProcedureCall call=procedure;
  ParamHandler<HalconCpp::HObject>::SetParameter(call,"Image",Image);
  ParamHandler<HalconCpp::HTuple>::SetParameter(call,"MinGray",MinGray);
      
  call.Execute();

  if (ConnectedRegions != nullptr)
    * ConnectedRegions = ParamHandler<HalconCpp::HObject>::GetParameter(call,"ConnectedRegions");
}

  • 因此才可以不需要重新编译

Halcon 代码导出

  • Halcon 也支持直接导出代码
  • 同样的示例,我们在导出时选择导出语言
  • 语言选择 C
  • 导出后发现在原始 hdev 文件旁边多了个 cpp 文件,就是我们导出的代码
  • 在 Halcon 工程中我们核心的函数就是 get_printer_chip_regions
  • 我们在 cpp 文件中找到他
代码语言:javascript复制
// Local procedures 
void get_printer_chip_regions (HObject ho_Image, HObject *ho_ConnectedRegions, HTuple hv_MinGray)
{

  // Local iconic variables
  HObject  ho_Region;

  Threshold(ho_Image, &ho_Region, hv_MinGray, 255);
  Connection(ho_Region, &(*ho_ConnectedRegions));
  SelectShape((*ho_ConnectedRegions), &(*ho_ConnectedRegions), "area", "and", 22311.8, 
      50000);
  return;
}

  • 将其加入到 C 工程中,之前的 C 代码变为
代码语言:javascript复制
#include "HalconCpp.h"

using namespace HalconCpp;

void get_printer_chip_regions(HObject ho_Image, HObject *ho_ConnectedRegions, HTuple hv_MinGray)
{

	// Local iconic variables
	HObject  ho_Region;

	Threshold(ho_Image, &ho_Region, hv_MinGray, 255);
	Connection(ho_Region, &(*ho_ConnectedRegions));
	SelectShape((*ho_ConnectedRegions), &(*ho_ConnectedRegions), "area", "and", 22311.8,
		50000);
	return;
}

int main()
{
	HalconCpp::HImage Image("printer_chip/printer_chip_01");
	HalconCpp::HRegion Region;

	get_printer_chip_regions(Image, &Region, 128);
	//test_pro::SetResourcePath("test_pro/res_test_pro");
	//test_pro::get_printer_chip_regions(Image, &Region, 128);
}

  • 可以看到同样的代码运行结果
  • 表明 Halcon 导出的 C 代码植入成功
  • 这种使用形式如果修改代码需要重新编译

参考资料

  • https://www.mvtec.com/cn/downloads/halcon
  • https://www.mvtec.com/cn/company/news/article/hdevelop-library-project-export
  • https://blog.csdn.net/chaipp0607/article/details/69514982
  • https://blog.csdn.net/u012210613/article/details/88653443

0 人点赞