前面帖子介绍了halcon与C#的联合编程,
这里继续介绍halcon与MFC也就是C++的联合编程。
同样,首先也是在halcon编写代码,好后进行导出,
我们以例程distance_lr为例,打开此例程后,
在halcon菜单栏:文件->导出,弹出的窗口选择导出类型与导出位置
halcon与MFC联合编程
我们当前导出保存在桌面,所以在桌面生成了一文件distance_lr.cpp
1.新建MFC与界面准备
首先新建一MFC工程,基于对话框的。
添加一图像控件,设为矩形类型,用于显示图片,也可以自己添加其他控件。
添加一按钮,用于执行HALCON代码,双击添加其点击函数
效果如图
halcon与MFC联合编程
2.在MFC中配制halcon
当前系统为WIN10 ,64位,安装了halcon17.12,64位,
安装于D:\Program Files\MVTec\HALCON-17.12-Progress
在MFC中必须包含HALCON两处头文件目录:
D:\Program Files\MVTec\HALCON-17.12-Progress\include,
D:\Program Files\MVTec\HALCON-17.12-Progress\include\halconcpp
和一处库目录:
D:\Program Files\MVTec\HALCON-17.12-Progress\lib\x64-win64
所以进行MFC工程属性的设置
halcon与MFC联合编程
3.使用导出的HALCON代码
打开前面导出的文件,复制文件中的下面代码,用于包含halcon的头文件及作用域的引用
#ifndef __APPLE__
# include "HalconCpp.h"
# include "HDevThread.h"
# if defined(__linux__) && !defined(__arm__) && !defined(NO_EXPORT_APP_MAIN)
# include <X11/Xlib.h>
# endif
#else
# ifndef HC_LARGE_IMAGES
# include <HALCONCpp/HalconCpp.h>
# include <HALCONCpp/HDevThread.h>
# else
# include <HALCONCppxl/HalconCpp.h>
# include <HALCONCppxl/HDevThread.h>
# endif
# include <stdio.h>
# include <HALCON/HpThread.h>
# include <CoreFoundation/CFRunLoop.h>
#endif
using namespace HalconCpp;
然后就是文件中action的与视觉相关的代码,
复制到按钮的点击函数体内进行编译,
一般不会直接编译成功。
提示错误
- 错误 1 error C2660: “CWnd::CloseWindow”: 函数不接受 1 个参数 c:\users\baikhgmv\desktop\123\123\123dlg.cpp 191 1 123
- CloseWindow函数作用不匹配,
- 更改::CloseWindow(HDevWindowStack::Pop()); 为 HalconCpp::CloseWindow(HDevWindowStack::Pop());
- 再次编译,又是一堆的链接错误
- 错误 27 error LNK1120: 26 个无法解析的外部命令 C:\Users\baikhgmv\Desktop\123\x64\Debug\123.exe 123
- 错误 5 error LNK2019: 无法解析的外部符号 "__declspec(dllimport) bool __cdecl HalconCpp::operator<=(class HalconCpp::HTuple const &,int)" (__imp_??NHalconCpp@@YA_NAEBVHTuple@0@H@Z),该符号在函数 "public: void __cdecl CMy123Dlg::OnBnClickedButton1(void)" (?OnBnClickedButton1@CMy123Dlg@@QEAAXXZ) 中被引用 C:\Users\baikhgmv\Desktop\123\123\123Dlg.obj 123
复制代码 等等。。。。。
只要在前面代码追加一句代码,将halconcpp.lib库载入就好,
using namespace HalconCpp;
#pragma comment(lib,"halconcpp.lib")
4.接着就是按钮执行HALCON代码的错误处理
复制导出文件中action函数内的全部代码到按钮点击函数体内后,
运行如有提示HDevWindowStack::IsOpen() 异常,
可将读取图片函数放在其前面ReadImage(&ho_Image, "fabrik");执行变OK.
运行程序,点击按钮,会发现图片并不显示在图片控件内,而是独自创建了新的窗口。
我们可以修改halcon打开窗口的函数参数OpenWindow(0,0,512,512,0,"visible","",&hv_WindowID);
将我们控件的句柄作为参数传入便可,因为此函数的第五参数为父窗口句柄类型。
我们修改图片控件ID为IDC_PIC。可以将其句柄传入,最终修改为
OpenWindow(0,0,512,512,(Hlong)GetDlgItem(IDC_PIC)->m_hWnd,"visible","",&hv_WindowID);
执行,结果如下图
halcon与MFC联合编程
程序源工程
|