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

解决问题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的代码如下:
技术分享
 
从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,弹出如下对话框:
技术分享
 
在Visual C++下选择MFC,然后选择右边的MFC Application,输入工程的名字HalconMFC,点击确定将弹出应用程序向导。
 
技术分享
 
在Application Type中选中Dialog Based。Resource language根据你自己爱好选择,我这里选择中文(中国)。点击下一步。
技术分享
        到User Interface Features,勾选Minimize box 和 Maximize Box,那么生成的对话框就可以最小化和最大化。点击next,后面几个选择默认的就好,直到finish。这样一个新的对话框工程就OK了。
 
3.设置工程
        为了能够使用halcon提供的图像处理算子,1.需要设置工程的属性。点击project/properties/Configuration Properties/Linker/Input,在Additional Dependencies 中添加 halconcpp.lib ,如下图所示:
技术分享
 
4.添加文件包含
    在用到图像处理算子的文件中添加此句:#include"halconcpp.h"。本例子中halcon的算子只在halconMFCDlg中用到,因此只需要在halconMFCDlg.h和halconMFCDlg.cpp中添加此句。在halconMFCDlg.h,#include"halconcpp.h"后添加usingnamespaceHalcon;
 
5.修改对话框,添加两个按钮。并增加响应函数。设计的界面如下:
技术分享
 
去掉原来的两个按钮,并且添加另外连个按钮:读取图像(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.编译运行。完成以上步骤以后,点击编译,运行。会出现只有两个按钮的对话框应用程序,点击读取图像,结果出现这样的错误:
技术分享
    这是因为无法读取图像。将要处理的图像复制到工程目录下。再次运行。可以正确的读取图像,但是,此时的窗口不在对话框中。如下图所示:
技术分享
 
 
这是因为open_window(0,0,Width/2,Height/2,0,"","",&WindowHandle);中所指定的父窗口为0,意味着指定的父窗口为桌面,此时需要将其父窗口改为对话框。为此,在该句所在的响应的函数中添加此句:
    Hlong MainWndID =(Hlong) m_hWnd;
并修改open_window的参数,用MainWndID代替0.
 
最终运行结果如下:
技术分享
与halcon中运行结果一样。
 
 
</!DOCTYPE>

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