一、前言:

在C++调用opencv和Halcon封装的过程中踩过很多坑,然而网上却查不到清晰地教程。在此个人总结详细教程,以免后人踩坑。记录下,以后自己忘了也可以来看看。

二、教程细节

2.1 我使用的IDE是vs2017,下面所有的介绍也都是以此IDE为基础。

第一步:选择C++动态链接库DLL

opencv 中的hal opencv实现halcon_#include


第二步:根据自己需要更改解决方案平台,我的是X64。下图中位置2是系统自己生成的。

opencv 中的hal opencv实现halcon_opencv_02


第三步:把需要用到的核心库放在代码文件夹下,方便后续调用。也可以不放,不过这样就需要引用opencv或者halcon的安装目录。

opencv 中的hal opencv实现halcon_人工智能_03


第四步:配置Opencv和Halcon环境,主要配置两个地方。VC++的包含目录和库目录,链接器输入的附加依赖项。

opencv 中的hal opencv实现halcon_人工智能_04


opencv 中的hal opencv实现halcon_opencv_05


第五步:创建并编辑算法函数类和接口函数类。也可以只用一个类里面既包含算法函数又包含对应的接口。我个人习惯分开。下图1是接口类,下图2是算法函数类。

opencv 中的hal opencv实现halcon_c++_06


第六步:编辑函数和接口,接口函数格式如下:

6.1 extern “C” _declspec (dllexport) int myAddFunction_interface(int a, int b);
 6.2 DllEntry.h需要引用Function.h,才能调用Function.h里面的函数。
 6.3 Function.h 需要
 #include <Halcon.h>
 #include <HalconCpp.h>
 #include “opencv.hpp”
 #include <opencv2/opencv.hpp>
 #include <opencv2/core/core.hpp>
 #include <opencv2/imgcodecs.hpp>
 #include <opencv2/highgui/highgui.hpp>
 #include <opencv2/imgproc.hpp>
 using namespace std;
 using namespace HalconCpp;
 using namespace cv;
 才能调用Halcon和Opencv的算子。
 6.4 DllEntry.h需要引用
 #include <Halcon.h>
 #include <HalconCpp.h>
 using namespace std;
 using namespace HalconCpp;

才可以封装这种函数,参数类型是Hobject类型的函数。可以在QT调用的时候直接传Hobject,不用像传统的封装函数需要传递图像指针。这样,利用Halcon做图像处理时更方便。

opencv 中的hal opencv实现halcon_opencv 中的hal_07


opencv 中的hal opencv实现halcon_人工智能_08

第七步:到这里,算法封装步骤基本结束。下面开始创建QT程序。QT程序创建过程简单,不做介绍。直接讲如何调用刚才封装好的Dll。

7.1 把封装好的DllForQt.dll和DllForQt.lib还有接口类的头文件DllEntry.h放入QT程序的exe执行目录下。然后配置QT程序的项目属性,主要是配置两个地方,C/C++常规附加包含目录,链接器常规附加库目录,链接器输入附加依赖项。前面的两个目录都是DLL和Lib所在的目录,其实就是QT程序的exe执行目录。链接器输入附加依赖项里面输入DllForQt.lib。把dll封装的代码里面所有的头文件全部放入QT程序的exe执行目录下。如果想封装并且传递结构体参数,但是结构体是在Function.h 里面声明的,所以QT中需要引用Function.h 这个头文件。在QT中引用这两个头文件。步骤图片如下。

opencv 中的hal opencv实现halcon_opencv 中的hal_09


opencv 中的hal opencv实现halcon_c++_10


opencv 中的hal opencv实现halcon_人工智能_11


opencv 中的hal opencv实现halcon_c++_12

opencv 中的hal opencv实现halcon_opencv_13


opencv 中的hal opencv实现halcon_c++_14