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中运行结果一样。
posted @ 2017-10-13 14:54  HappyEDay  阅读(2696)  评论(0编辑  收藏  举报