7、MFC与Halcon混合编程

一、配置环境

  1. 把Halcon安装目录下的include文件夹以及所有子文件夹都添加到mfc项目属性-----C/C++常规----附加包含目录中。

  2. 把Halcon安装目录下的lib文件夹以及所有子文件夹都添加到mfc项目属性----连接器----常规-----附加库目录。

  1. mfc项目属性----连接器---输入-----附加依赖项,添加ahlconcpp.lib

  1. 把Halcon安装目录下的bin中的所有子文件夹添加到:菜单----选项---VC++目录----可执行文件下。

  2. 把Halcon安装目录下的include中的所有子文件夹添加到:菜单----选项---VC++目录----包含文件。

  1. 把Halcon安装目录下的lib中的所有子文件夹添加到:菜单----选项---VC++目录----引用文件。

  1. 把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 ()

  1. 导出c++:

  2. 分析导出代码。

    #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;

    }

  3. 新建mfc程序,并按上面方法配置好:
  4. 把导出的C++程序的头文件以及命名空间复制到stdafx.h中

#include "HalconCpp.h"

using namespace Halcon;

  1. 把导出的C++程序声明部分的变量复制到主对话框的(*****Dlg.h)的public下,

public:

    // 图形变量

Hobject Image, GrayImage;

// 控制变量

HTuple ImageFiles, Index, WindowHandle;

  1. action()函数体复制到主对话框的(*****Dlg.cpp)下
  2. 在按钮函数中调用该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();

}

  1. 效果:这时发现mfc主界面与显示窗口图片独立。

    因为在代码中可以看出显示图片的窗口是通过WindowHandle句柄实现的,与主界面没有关联。

  1. 实现图像在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

效果:

posted @ 2022-05-08 22:36  ihh2021  阅读(890)  评论(0编辑  收藏  举报