• 解决问题1:可以从桌面显示到FORM MFC/HALCON混合编程系列一_打开图像_简单处理_


    没法爱上新浪

      转载:http://blog.sina.com.cn/s/blog_812e326f010110og.html
     
    从图1到图2
     
    图1(在桌面显示了)
     
     
    open_window(0,0, Width/2, Height/2,0,"visible","",&WindowHandle);
    更改为:
     Hlong MainWndID =(Hlong) m_hWnd;
    open_window(0,0, Width/2, Height/2,MainWndID,"visible","",&WindowHandle);
     图2
     
     
     
     
     
     
    1.说明
            在对话框中打开一幅图像,然后处理此图像并显示最终结果。使用的Hdevelop的代码如下:
    MFC/HALCON混合编程系列一_打开图像_简单处理_
     
    从Hdevelop导出的C++代码如下:
    ///////////////////////////////////////////////////////////////////////////////
    // File generated by HDevelop for HALCON/C++ Version 8.0
    ///////////////////////////////////////////////////////////////////////////////
    #include"HalconCpp.h"
    #ifndefNO_EXPORT_MAIN
    // Main procedure
    voidaction()
    {
    usingnamespaceHalcon;
    // Local iconic variables
    Hobject Image, Region, ConnectedRegions, SelectedRegions;
    Hobject RegionClosing, RegionDifference, ConnectedRegions1;
    Hobject SelectedRegions1;
    // Local control variables
    HTuple AcqHandle, Pointer, Type, Width, Height;
    HTuple WindowHandle;
    //dev_close_window ()
    //dev_update_window ('off')
    //close_all_framegrabbers ()

    open_framegrabber("File", 1, 1, 0, 0, 0, 0, "default", -1, "default", -1, "default",
    "", "default", -1, -1, &AcqHandle);
    grab_image(&Image, AcqHandle);
    get_image_pointer1(Image, &Pointer, &Type, &Width, &Height);
    set_window_attr("background_color","black");
    open_window(0,140,Width/2,Height/2,0,"","",&WindowHandle);
    disp_obj(Image, WindowHandle);

    set_color(WindowHandle,"red");
    threshold(Image, &Region, 0, 50);
    connection(Region, &ConnectedRegions);
    select_shape(ConnectedRegions, &SelectedRegions, "rect2_len1", "and", 500, 550);
    closing_rectangle1(SelectedRegions, &RegionClosing, 80, 80);
    difference(RegionClosing, SelectedRegions, &RegionDifference);
    connection(RegionDifference, &ConnectedRegions1);
    select_shape(ConnectedRegions1, &SelectedRegions1, "area", "and", 500, 99999);
    clear_window(WindowHandle);
    disp_obj(Image, WindowHandle);
    disp_obj(SelectedRegions1, WindowHandle);
    //grab_image (Image, AcqHandle)
    }
    #ifndefNO_EXPORT_APP_MAIN
    intmain(intargc, char*argv[])
    {
    usingnamespaceHalcon;
    // Default settings used in HDevelop (can be omitted)
    set_system("do_low_error","false");
    action();
    return0;
    }
    #endif
    #endif
     
    我们当前要做的就是将这些导出的C++代码嵌入到MFC工程中。
     
    2.新建MFC对话框工程。点击VS2005 菜单file/new/project,弹出如下对话框:
    MFC/HALCON混合编程系列一_打开图像_简单处理_
     
    在Visual C++下选择MFC,然后选择右边的MFC Application,输入工程的名字HalconMFC,点击确定将弹出应用程序向导。
     
    MFC/HALCON混合编程系列一_打开图像_简单处理_
     
    在Application Type中选中Dialog Based。Resource language根据你自己爱好选择,我这里选择中文(中国)。点击下一步。
    MFC/HALCON混合编程系列一_打开图像_简单处理_
            到User Interface Features,勾选Minimize box 和 Maximize Box,那么生成的对话框就可以最小化和最大化。点击next,后面几个选择默认的就好,直到finish。这样一个新的对话框工程就OK了。
     
    3.设置工程
            为了能够使用halcon提供的图像处理算子,1.需要设置工程的属性。点击project/properties/Configuration Properties/Linker/Input,在Additional Dependencies 中添加 halconcpp.lib ,如下图所示:
    MFC/HALCON混合编程系列一_打开图像_简单处理_
     
    4.添加文件包含
        在用到图像处理算子的文件中添加此句:#include"halconcpp.h"。本例子中halcon的算子只在halconMFCDlg中用到,因此只需要在halconMFCDlg.h和halconMFCDlg.cpp中添加此句。在halconMFCDlg.h,#include"halconcpp.h"后添加usingnamespaceHalcon;
     
    5.修改对话框,添加两个按钮。并增加响应函数。设计的界面如下:
    MFC/HALCON混合编程系列一_打开图像_简单处理_
     
    去掉原来的两个按钮,并且添加另外连个按钮:读取图像(IDC_ReadImage)和图像处理(IDC_ImageProcess)
    双击两个按钮,应用程序框架自动添加消息响应函数,当然我们需要修改此消息响应函数。
     
     
    6.根据导出的C++代码修改响应函数及其他设置。打开生成的C++代码,
     
    6.1 将action()中的变量部分复制到class CHalconMFCDlg: publicCDialog中作为该类的公有成员变量。即如下所示的代码段:
     
    // Local iconic variables
    Hobject Image, Region, ConnectedRegions, SelectedRegions;
    Hobject RegionClosing, RegionDifference, ConnectedRegions1;
    Hobject SelectedRegions1;
    // Local control variables
    HTuple AcqHandle, Pointer, Type, Width, Height;
    HTuple WindowHandle;
     
     
     
    6.2 将action()中的打开图像部分复制到voidCHalconMFCDlg::OnBnClickedReadimage()中。代码如下所示:
     
         open_framegrabber("File", 1, 1, 0, 0, 0, 0, "default", -1, "default", -1, "default",
             "", "default", -1, -1, &AcqHandle);
         grab_image(&Image, AcqHandle);
         get_image_pointer1(Image, &Pointer, &Type, &Width, &Height);
         set_window_attr("background_color","black");
         open_window(0,140,Width/2,Height/2,0,"","",&WindowHandle);
         disp_obj(Image, WindowHandle);    
     
    6.3 将action()中的图像处理部分复制到void CHalconMFCDlg::OnBnClickedImageprocess()中。 代码如下所示:
     
        set_color(WindowHandle,"red");
        threshold(Image, &Region, 0, 50);
        connection(Region, &ConnectedRegions);
        select_shape(ConnectedRegions, &SelectedRegions, "rect2_len1", "and", 500, 550);
        closing_rectangle1(SelectedRegions, &RegionClosing, 80, 80);
        difference(RegionClosing, SelectedRegions, &RegionDifference);
        connection(RegionDifference, &ConnectedRegions1);
        select_shape(ConnectedRegions1, &SelectedRegions1, "area", "and", 500, 99999);
        clear_window(WindowHandle);
        disp_obj(Image, WindowHandle);
        disp_obj(SelectedRegions1, WindowHandle);
     
    7.编译运行。完成以上步骤以后,点击编译,运行。会出现只有两个按钮的对话框应用程序,点击读取图像,结果出现这样的错误:
    MFC/HALCON混合编程系列一_打开图像_简单处理_
        这是因为无法读取图像。将要处理的图像复制到工程目录下。再次运行。可以正确的读取图像,但是,此时的窗口不在对话框中。如下图所示:
    MFC/HALCON混合编程系列一_打开图像_简单处理_
     
     
    这是因为open_window(0,0,Width/2,Height/2,0,"","",&WindowHandle);中所指定的父窗口为0,意味着指定的父窗口为桌面,此时需要将其父窗口改为对话框。为此,在该句所在的响应的函数中添加此句:
        Hlong MainWndID =(Hlong) m_hWnd;
    并修改open_window的参数,用MainWndID代替0.
     
    最终运行结果如下:
    MFC/HALCON混合编程系列一_打开图像_简单处理_
    与halcon中运行结果一样。
     
     
    </!DOCTYPE>
  • 相关阅读:
    TreeView控件应用(包含递归调用)
    FTP操作(FTPClient)
    利用正则表达式 进行字符的判断
    复合查询
    NPOI操作
    导航特效
    拼音检索
    项目中的注意事项
    计算文件的MD5值上传到服务器 下载验证文件是否被篡改
    OLE Automation (C#读取EXCEL)
  • 原文地址:https://www.cnblogs.com/salmoner/p/6846420.html
Copyright © 2020-2023  润新知