QQ登录

只需一步,快速开始

8.2 halcon与MFC联合编程

[ 复制链接 ]
前面帖子介绍了halcon与C#的联合编程,
这里继续介绍halcon与MFC也就是C++的联合编程。
同样,首先也是在halcon编写代码,好后进行导出,
我们以例程distance_lr为例,打开此例程后,
在halcon菜单栏:文件->导出,弹出的窗口选择导出类型与导出位置

halcon与MFC联合编程

halcon与MFC联合编程

我们当前导出保存在桌面,所以在桌面生成了一文件distance_lr.cpp

1.新建MFC与界面准备
首先新建一MFC工程,基于对话框的。
添加一图像控件,设为矩形类型,用于显示图片,也可以自己添加其他控件。
添加一按钮,用于执行HALCON代码,双击添加其点击函数
效果如图

halcon与MFC联合编程

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联合编程

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. 错误        1        error C2660: “CWnd::CloseWindow”: 函数不接受 1 个参数        c:\users\baikhgmv\desktop\123\123\123dlg.cpp        191        1        123

  2. CloseWindow函数作用不匹配,
  3. 更改::CloseWindow(HDevWindowStack::Pop()); 为 HalconCpp::CloseWindow(HDevWindowStack::Pop());

  4. 再次编译,又是一堆的链接错误
  5. 错误        27        error LNK1120: 26 个无法解析的外部命令        C:\Users\baikhgmv\Desktop\123\x64\Debug\123.exe        123

  6. 错误        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联合编程

halcon与MFC联合编程


程序源工程
请点击此处下载

查看状态:已购买或有权限

您的用户组是:游客

文件名称:123.rar 
文件大小:69.31 KB 
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我


回复

使用道具 举报

大神点评(1)

qq263946146 楼主 2019-4-3 14:00:30 显示全部楼层
自己写的,真牛逼漂亮~
回复

使用道具 举报

快速回复 返回列表 客服中心 搜索