MFC窗口中打开图像—edge_segments
引言
使用MFC联合Halcon,将HDevelop中的演示结果用MFC中对话框的形式显示
一、结果(MFC窗口中打开图像—edge_segments)
1.1 Halcon演示结果
在混合编程一中图像打开不在MFC对话框中,这里将打开的图像放到窗体中,一个显示原图,另一个显示边缘处理后的图像。
Halcon演示结果和混合编程一中一样
1.2 MFC演示结果
二、Halcon代码
与混合编程一中同
三、MFC源代码
1、使用图型控件Picture Control
2、添加上述两个图形控件,布局如上图所示
1.头文件主要代码
// HalconMFCDlg.h: 头文件
//
#pragma once
#include"OhterAssist.h"
#include <HalconCpp.h>
using namespace HalconCpp;
//.......省略自动生成的代码............
public:
MyAssist myassist;
// Local iconic variables
HObject ho_Image, ho_ImaAmp, ho_ImaDir, ho_Region;
HObject ho_ConnectedRegions, ho_XLDContours, ho_SingleEdgeObject;
HObject ho_Contour;
// Local control variables
HTuple hv_Width, hv_Height, hv_WindowID, hv_Number;
HTuple hv_i, hv_BeginRow, hv_BeginCol, hv_EndRow, hv_EndCol;
HTuple hv_k;
public:
HTuple HWindowID; //picture control控件
Hlong MainWndId;
CWnd *pWnd;
public:
afx_msg void OnBnClickedButtonReadimage();
afx_msg void OnBnClickedButtonProcessimage();
};
2.源文件主要代码
// HalconMFCDlg.cpp: 实现文件
//
#include "pch.h"
#include "framework.h"
#include "HalconMFC.h"
#include "HalconMFCDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
//..................省略无关代码..................
//..............................
BEGIN_MESSAGE_MAP(CHalconMFCDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_READIMAGE, &CHalconMFCDlg::OnBnClickedButtonReadimage)
ON_BN_CLICKED(IDC_BUTTON_PROCESSIMAGE, &CHalconMFCDlg::OnBnClickedButtonProcessimage)
END_MESSAGE_MAP()
// CHalconMFCDlg 消息处理程序
BOOL CHalconMFCDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// .............省略部分自动生成代码.................
// TODO: 在此添加额外的初始化代码
MainWndId = (Hlong)m_hWnd;
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CHalconMFCDlg::OnBnClickedButtonReadimage()
{
// TODO: 在此添加控件通知处理程序代码
CRect rect;
pWnd = GetDlgItem(IDC_STATIC_ORIIMAGE);
HWindowID = (Hlong)pWnd->m_hWnd;
pWnd->GetWindowRect(&rect);
//****
//step: acquire image
//****
ReadImage(&ho_Image, "mreut");
GetImageSize(ho_Image, &hv_Width, &hv_Height);
OpenWindow(0, 0, rect.Width(), rect.Height(), HWindowID, "visible", "", &hv_WindowID);
//myassist.dev_open_window_fit_image(ho_Image, 0, 0, hv_Width, hv_Height, &hv_WindowID);
myassist.set_display_font(hv_WindowID, 12, "mono", "true", "false");
HDevWindowStack::Push(hv_WindowID);
if (HDevWindowStack::IsOpen())
SetDraw(HDevWindowStack::GetActive(), "margin");
if (HDevWindowStack::IsOpen())
SetLineWidth(HDevWindowStack::GetActive(), 3);
if (HDevWindowStack::IsOpen())
DispObj(ho_Image, HDevWindowStack::GetActive());
//myassist.disp_continue_message(hv_WindowID, "black", "true");
}
void CHalconMFCDlg::OnBnClickedButtonProcessimage()
{
// TODO: 在此添加控件通知处理程序代码
CRect Rect;
pWnd = GetDlgItem(IDC_STATIC_PROCESSIMAGE);
HWindowID = (Hlong)pWnd->m_hWnd;
pWnd->GetWindowRect(&Rect);
OpenWindow(0, 0, Rect.Width(), Rect.Height(), HWindowID, "visible", "", &hv_WindowID);
//****
//step: filter image
//****
HDevWindowStack::Push(hv_WindowID);
EdgesImage(ho_Image, &ho_ImaAmp, &ho_ImaDir, "lanser2", 0.5, "nms", 20, 40);
if (HDevWindowStack::IsOpen())
DispObj(ho_ImaAmp, HDevWindowStack::GetActive());
//myassist.disp_continue_message(hv_WindowID, "black", "true");
// stop(); only in hdevelop
//****
//step: extract edges
//****
Threshold(ho_ImaAmp, &ho_Region, 1, 255);
Connection(ho_Region, &ho_ConnectedRegions);
if (HDevWindowStack::IsOpen())
ClearWindow(HDevWindowStack::GetActive());
if (HDevWindowStack::IsOpen())
SetColored(HDevWindowStack::GetActive(), 12);
if (HDevWindowStack::IsOpen())
DispObj(ho_ConnectedRegions, HDevWindowStack::GetActive());
//myassist.disp_continue_message(hv_WindowID, "black", "true");
// stop(); only in hdevelop
//****
//step: process edges
//****
if (HDevWindowStack::IsOpen())
ClearWindow(HDevWindowStack::GetActive());
CountObj(ho_ConnectedRegions, &hv_Number);
GenEmptyObj(&ho_XLDContours);
{
HTuple end_val39 = hv_Number;
HTuple step_val39 = 1;
for (hv_i = 1; hv_i.Continue(end_val39, step_val39); hv_i += step_val39)
{
SelectObj(ho_ConnectedRegions, &ho_SingleEdgeObject, hv_i);
SplitSkeletonLines(ho_SingleEdgeObject, 2, &hv_BeginRow, &hv_BeginCol, &hv_EndRow,
&hv_EndCol);
{
HTuple end_val42 = (hv_BeginRow.TupleLength()) - 1;
HTuple step_val42 = 1;
for (hv_k = 0; hv_k.Continue(end_val42, step_val42); hv_k += step_val42)
{
GenContourPolygonXld(&ho_Contour, HTuple(hv_BeginRow[hv_k]).TupleConcat(HTuple(hv_EndRow[hv_k])),
HTuple(hv_BeginCol[hv_k]).TupleConcat(HTuple(hv_EndCol[hv_k])));
ConcatObj(ho_XLDContours, ho_Contour, &ho_XLDContours);
}
}
}
}
if (HDevWindowStack::IsOpen())
DispObj(ho_XLDContours, HDevWindowStack::GetActive());
}
总结
将数据绑定到Picture control控件上读取图像
CRect rect;
pWnd = GetDlgItem(IDC_STATIC_ORIIMAGE);
HWindowID = (Hlong)pWnd->m_hWnd;
pWnd->GetWindowRect(&rect);
ReadImage(&ho_Image, "mreut");
GetImageSize(ho_Image, &hv_Width, &hv_Height);
OpenWindow(0, 0, rect.Width(), rect.Height(), HWindowID, "visible", "", &hv_WindowID);
HDevWindowStack::Push(hv_WindowID);
处理后
CRect Rect;
pWnd = GetDlgItem(IDC_STATIC_PROCESSIMAGE);
HWindowID = (Hlong)pWnd->m_hWnd;
pWnd->GetWindowRect(&Rect);
OpenWindow(0, 0, Rect.Width(), Rect.Height(), HWindowID, "visible", "", &hv_WindowID);
//****
//step: filter image
//****
HDevWindowStack::Push(hv_WindowID);