MFC与HALCON混合编程二之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);
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MFCMicrosoft Foundation Classes)是由微软公司开发的一套C++类库,用于开发Windows操作系统的图形用户界面应用程序。MFC提供了各种控件、消息处理机制和窗口管理等功能,使得开发人员能够更快、更方便地创建和管理图形界面应用程序。MFC也提供了一些简化图像处理操作的接口,但其功能相对较弱。 而Halcon是一款专业的图像处理软件,由MVTec公司开发。Halcon提供了丰富强大的图像处理算法和工具包,可以用于实现各种复杂的图像处理任务。Halcon支持多种编程语言接口,包括C++, C#, Python等,非常方便开发人员进行次开发和集成。 相比之下,MFC主要用于图形界面的设计和应用程序的开发,而Halcon则更加专注于图像处理算法和工具的开发。Halcon提供了一系列用于图像预处理、分割、特征提取和识别等的功能,能够应对各种图像处理任务。Halcon的强大之处在于其丰富的算法库,它可以通过调用这些算法库来解决复杂的图像处理问题,例如目标检测、匹配、3D视觉等。 总结来说,MFC是一套用于开发Windows图形界面应用程序的类库,提供了一些简单的图像处理功能。而Halcon是一款专业的图像处理软件,提供了丰富强大的图像处理算法和工具包,非常适用于解决各种复杂的图像处理问题。根据具体需求,开发人员可以选择使用MFC进行简单的图像处理,或者使用Halcon进行专业的图像处理任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值