7、MFC与Halcon混合编程
一、配置环境
- 把Halcon安装目录下的include文件夹以及所有子文件夹都添加到mfc项目属性-----C/C++常规----附加包含目录中。
- 把Halcon安装目录下的lib文件夹以及所有子文件夹都添加到mfc项目属性----连接器----常规-----附加库目录。
- mfc项目属性----连接器---输入-----附加依赖项,添加ahlconcpp.lib
- 把Halcon安装目录下的bin中的所有子文件夹添加到:菜单----选项---VC++目录----可执行文件下。
- 把Halcon安装目录下的include中的所有子文件夹添加到:菜单----选项---VC++目录----包含文件。
- 把Halcon安装目录下的lib中的所有子文件夹添加到:菜单----选项---VC++目录----引用文件。
- 把Halcon安装目录下的lib中的所有子文件夹添加到:菜单----选项---VC++目录----库文件
注:通过以上配置后,有时在运行程序时仍然有一些dll无法加载,解决办法:
提示缺少那个dll就到Halcon安装目录中查找,找到后把它复制到工程所在目录(和可执行文件同一个路径下),或复制到C:\Windows\System32目录下即可。
例子测试:
Halcon代码:
list_files ('C:/picture', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.jpg','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
*halcon程序中一定要用代码打开窗口,否则导出的c++程序没有用于显示图片的窗口接口
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*读入图片并处理
read_image (Image, ImageFiles[Index])
*变灰度图片
rgb1_to_gray (Image, GrayImage)
*显示图片也要用代码实现。否则导出的c++程序中找不到用于显示图片的代码
dev_display (GrayImage)
endfor
*关闭窗口,否则第二次重新执行时无法正常显示
dev_close_window ()
- 导出c++:
- 分析导出代码。
#include "HalconCpp.h"
using namespace Halcon;
void action()
{
using namespace Halcon;
// 图形变量
Hobject Image, GrayImage;
// 控制变量
HTuple ImageFiles, Index, WindowHandle;
// 下面是文件的路径,值得注意的是这个路径跟window的路径不一样,用的是 / 而不是 \
list_files("C:/picture", (HTuple("files").Append("follow_links")), &ImageFiles);
tuple_regexp_select(ImageFiles, (HTuple("\\.jpg").Append("ignore_case")), &ImageFiles);
for (Index=0; Index<=(ImageFiles.Num())-1; Index+=1)
{
//halcon程序中一定要用代码打开窗口,否则导出的c++程序没有用于显示图片的窗口接口
set_window_attr("background_color","black");
open_window(0,0,512,512,0,"","",&WindowHandle);
HDevWindowStack::Push(WindowHandle);
//读入图片并处理
read_image(&Image, HTuple(ImageFiles[Index]));
//变灰度图片
rgb1_to_gray(Image, &GrayImage);
//显示图片也要用代码实现。否则导出的c++程序中找不到用于显示图片的代码
if (HDevWindowStack::IsOpen())
disp_obj(GrayImage, HDevWindowStack::GetActive());
}
//关闭窗口,否则第二次执行时无法正常显示
if (HDevWindowStack::IsOpen())
close_window(HDevWindowStack::Pop());
}
int main(int argc, char *argv[])
{
using namespace Halcon;
// Default settings used in HDevelop (can be omitted)
set_system("do_low_error","false");
action();
return 0;
}
- 新建mfc程序,并按上面方法配置好:
- 把导出的C++程序的头文件以及命名空间复制到stdafx.h中
#include "HalconCpp.h"
using namespace Halcon;
- 把导出的C++程序声明部分的变量复制到主对话框的(*****Dlg.h)的public下,
public:
// 图形变量
Hobject Image, GrayImage;
// 控制变量
HTuple ImageFiles, Index, WindowHandle;
- 把action()函数体复制到主对话框的(*****Dlg.cpp)下
- 在按钮函数中调用该action()函数。
void action()
{
using namespace Halcon;
// 图形变量
Hobject Image, GrayImage;
// 控制变量
HTuple ImageFiles, Index, WindowHandle;
list_files("C:/picture", (HTuple("files").Append("follow_links")), &ImageFiles);
tuple_regexp_select(ImageFiles, (HTuple("\\.jpg").Append("ignore_case")), &ImageFiles);
//**********************************************************************
//打开用于显示图像的窗口
set_window_attr("background_color","black");
open_window(0,0,512,512,0,"","",&WindowHandle);
HDevWindowStack::Push(WindowHandle);
//**********************************************************************
for (Index=0; Index<=(ImageFiles.Num())-1; Index+=1)
{
//读入图片并处理
read_image(&Image, HTuple(ImageFiles[Index]));
//变灰度图片
rgb1_to_gray(Image, &GrayImage);
//显示图片也要用代码实现。否则导出的c++程序中找不到用于显示图片的代码
if (HDevWindowStack::IsOpen())
{
disp_obj(GrayImage, HDevWindowStack::GetActive());
}
}
//关闭窗口
close_window(HDevWindowStack::Pop());
}
void ChalocnmfcDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
action();
}
- 效果:这时发现mfc主界面与显示窗口图片独立。
因为在代码中可以看出显示图片的窗口是通过WindowHandle句柄实现的,与主界面没有关联。
- 实现图像在mfc主对话框中显示。将打开用于显示图像窗口的代码(//*****包围部分)换成
//打开用于显示图像的窗口
CWnd* pWnd=AfxGetMainWnd();//获取主窗口的指针
Hlong MainWndID = (Hlong) pWnd->m_hWnd;//获取句柄
set_window_attr("background_color","black");
open_window(10,10,512,512,MainWndID,"","",&WindowHandle);
HDevWindowStack::Push(WindowHandle);
注:
open_window()第一二个参数表示图片的左上角坐标(主对话框左上角为原点),三四个参数表示宽度和高度,第四个参数表示主对话框的ID
效果: