MFC/HALCON混合编程系列一_相机打开图像_简单处理_
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 ,如下图所示:
在链接器-》常规-》附加库目录添加$(HALCONROOT)/lib/$(HALCONARCH) 并且 在(项目属性)--(配置属性)--(C/C++)--(常规)--“附加包含目录”中添加包含路径$(HALCONROOT)/include和$(HALCONROOT)/include/halconcpp;
4.添加文件包含
在用到图像处理算子的文件中添加此句:#include"halconcpp.h"。本例子中halcon的算子只在halconMFCDlg中用到,因此只需要在halconMFCDlg.h和halconMFCDlg.cpp中添加此句。在halconMFCDlg.h,#include"halconcpp.h"后添加using namespace Halcon;
5.修改对话框,添加两个按钮。并增加响应函数。设计的界面如下:
去掉原来的两个按钮,并且添加另外连个按钮:读取图像(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.编译运行。完成以上步骤以后,点击编译,运行。会出现只有两个按钮的对话框应用程序,点击读取图像,结果出现这样的错误:
这是因为无法读取图像。将要处理的图像复制到工程目录下。再次运行。可以正确的读取图像,但是,此时的窗口不在对话框中。如下图所示:
这是因为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);
最终运行结果如下:
与halcon中运行结果一样。