zoukankan      html  css  js  c++  java
  • MFC/HALCON混合编程系列一_相机打开图像_简单处理_

    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 ,如下图所示:
    在链接器-》常规-》附加库目录添加$(HALCONROOT)/lib/$(HALCONARCH)   并且 在(项目属性)--(配置属性)--(C/C++)--(常规)--“附加包含目录”中添加包含路径$(HALCONROOT)/include和$(HALCONROOT)/include/halconcpp;
    MFC/HALCON混合编程系列一_打开图像_简单处理_
     
    4.添加文件包含
        在用到图像处理算子的文件中添加此句:#include"halconcpp.h"。本例子中halcon的算子只在halconMFCDlg中用到,因此只需要在halconMFCDlg.h和halconMFCDlg.cpp中添加此句。在halconMFCDlg.h,#include"halconcpp.h"后添加using namespace Halcon;
     
    5.修改对话框,添加两个按钮。并增加响应函数。设计的界面如下:
    MFC/HALCON混合编程系列一_打开图像_简单处理_
     
    去掉原来的两个按钮,并且添加另外连个按钮:读取图像(IDC_ReadImage)和图像处理(IDC_ImageProcess)
    双击两个按钮,应用程序框架自动添加消息响应函数,当然我们需要修改此消息响应函数。
     
     
    6.根据导出的C++代码修改响应函数及其他设置。打开生成的C++代码,
     
    6.1 将action()中的变量部分复制到class CHalconMFCDlg: publicCDialog中作为该类的公有成员变量即加入到HalconMFCDlg.h的public:后。即如下所示的代码段:
     
    // HalconMFCDlg.h : 头文件
    //
    #include "halconcpp.h"
    using namespace Halcon;
    #pragma once
    
    
    // CHalconMFCDlg 对话框
    class CHalconMFCDlg : public CDialogEx
    {
    // 构造
    public:
        CHalconMFCDlg(CWnd* pParent = NULL);    // 标准构造函数
    
    // 对话框数据
        enum { IDD = IDD_HALCONMFC_DIALOG };
    
        protected:
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
    
    
    // 实现
    protected:
        HICON m_hIcon;
    
        // 生成的消息映射函数
        virtual BOOL OnInitDialog();
        afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
        afx_msg void OnPaint();
        afx_msg HCURSOR OnQueryDragIcon();
        DECLARE_MESSAGE_MAP()
    public:
        afx_msg void OnBnClickedReadimage();
        afx_msg void OnBnClickedImageprocess();
    
        // 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.
     
    即改成

    set_window_attr("background_color","black");
    Hlong MainWndID =(Hlong) m_hWnd;
    //open_window(0,140,Width/2,Height/2,0,"","",&WindowHandle);
    open_window(0,140,Width/2,Height/2,MainWndID,"","",&WindowHandle);
    disp_obj(Image, WindowHandle);

     
    最终运行结果如下:
    MFC/HALCON混合编程系列一_打开图像_简单处理_
    与halcon中运行结果一样。
  • 相关阅读:
    【树论】新二叉树
    【贪心】umi的函数
    【模拟】高精度练习之加法
    【模拟】高精度练习之减法
    【贪心】线段覆盖
    【树论】二叉树的序遍历
    【贪心】超级书架
    【动态规划】爱与愁的心痛
    【图论】牛大赛
    【图论】产生数
  • 原文地址:https://www.cnblogs.com/HappyEDay/p/7661189.html
Copyright © 2011-2022 走看看