halcon + vs2017联合使用简单的图像处理


一、结果(halcon + vs2017联合使用简单的图像处理)

1、软件运行初始结果

在这里插入图片描述

2、读取图像显示

在这里插入图片描述

3、图像处理显示

在这里插入图片描述

二、Halcon + VS2017配置?

见之前的文章《halcon + vs2017联合使用显示图片》有详细配置

三、Halcon代码

1、halcon代码

* clip.hdev: Orientation of clips
* 
dev_update_window ('off')
read_image (Clip, 'clip')
get_image_size (Clip, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width / 2, Height / 2, 'black', WindowID)
dev_display (Clip)
set_display_font (WindowID, 14, 'mono', 'true', 'false')
disp_continue_message (WindowID, 'black', 'true')
stop ()
binary_threshold (Clip, Dark, 'max_separability', 'dark', UsedThreshold)
connection (Dark, Single)
select_shape (Single, Selected, 'area', 'and', 5000, 10000)
dev_set_draw ('fill')
dev_set_colored (12)
dev_display (Selected)
disp_continue_message (WindowID, 'black', 'true')
stop ()
dev_display (Clip)
dev_set_color ('green')
dev_display (Selected)
orientation_region (Selected, Phi)
area_center (Selected, Area, Row, Column)
dev_set_line_width (3)
dev_set_draw ('margin')
Length := 80
for i := 0 to |Phi| - 1 by 1
    dev_set_color ('blue')
    disp_arrow (WindowID, Row[i], Column[i], Row[i] - Length * sin(Phi[i]), Column[i] + Length * cos(Phi[i]), 4)
    disp_message (WindowID, deg(Phi[i])$'3.1f' + ' deg', 'image', Row[i], Column[i] - 100, 'black', 'false')
endfor
dev_update_window ('on')

2、halcon运行结果显示

在这里插入图片描述
在这里插入图片描述

四、MFC源代码

1、头文件

HalconMFCDlg.h: 头文件中主要实现代码


// HalconMFCDlg.h: 头文件
//

#pragma once
#include<HalconCpp.h>
using namespace HalconCpp;


// CHalconMFCDlg 对话框
class CHalconMFCDlg : public CDialogEx
{
// 构造
public:
	// Local iconic variables
	HObject  ho_Clip, ho_ImageZoomed, ho_Rectangle;
	HObject  ho_ImageReduced, ho_Region, ho_ConnectedRegions;
	HObject  ho_Holes, ho_ROI, ho_Domain, ho_Difference;

	// Local control variables
	HTuple  hv_Width, hv_Height, hv_WindowID, hv_Rot;
	HTuple  hv_Row, hv_Column, hv_pi, hv_TemplateID, hv_Error;
	HTuple  hv_Angle;

	HTuple HWindowID;   //picture control控件


	Hlong MainWndId ;
	CWnd *pWnd;

public:
	afx_msg void OnBtnReadImage();
	afx_msg void OnBtnImageProcess();
};

MFC源文件

HalconMFCDlg.cpp: 主要的实现代码

void CHalconMFCDlg::OnBtnReadImage()
{
	// TODO: 在此添加控件通知处理程序代码
	
	CRect Rect;
	pWnd = GetDlgItem(IDC_DISPIMAGE);
	HWindowID = (Hlong)pWnd->m_hWnd;
	pWnd->GetWindowRect(&Rect);
	

	ReadImage(&ho_Clip, "clip");
	ZoomImageFactor(ho_Clip, &ho_ImageZoomed, 0.5, 0.5, "constant");
	GetImageSize(ho_ImageZoomed, &hv_Width, &hv_Height);
	SetWindowAttr("background_color", "black");
	OpenWindow(0, 0, Rect.Width(), Rect.Height(), HWindowID, "visible", "", &hv_WindowID);
	
	HDevWindowStack::Push(hv_WindowID);
	hv_Rot = 1.91;
	hv_Row = 134;
	hv_Column = 118;
	if (HDevWindowStack::IsOpen())
		SetDraw(HDevWindowStack::GetActive(), "margin");
	GenRectangle2(&ho_Rectangle, hv_Row, hv_Column, hv_Rot, 19, 55);
	DispArrow(hv_WindowID, hv_Row, hv_Column, hv_Row + ((hv_Rot.TupleCos()) * 50), hv_Column + ((hv_Rot.TupleSin()) * 50),
		1);
	DispObj(ho_Clip, HDevWindowStack::GetActive());
}


void CHalconMFCDlg::OnBtnImageProcess()
{
	// TODO: 在此添加控件通知处理程序代码

	CRect Rect;
	pWnd = GetDlgItem(IDC_DISPIMAGE_PROCESS);
	HWindowID = (Hlong)pWnd->m_hWnd;
	pWnd->GetWindowRect(&Rect);
	OpenWindow(0, 0, Rect.Width(), Rect.Height(), HWindowID, "visible", "", &hv_WindowID);
	 //Reduce the definition domain of image
	ReduceDomain(ho_ImageZoomed, ho_Rectangle, &ho_ImageReduced);
	hv_pi = (HTuple(0.0).TupleAcos()) * 2;
	//Preparing a pattern for template matching with rotation
	CreateTemplateRot(ho_ImageReduced, 4, -hv_pi, 2 * hv_pi, hv_pi / 45, "sort", "original",
		&hv_TemplateID);
	if (HDevWindowStack::IsOpen())
		SetColor(HDevWindowStack::GetActive(), "red");
	Threshold(ho_ImageZoomed, &ho_Region, 120, 255);
	Connection(ho_Region, &ho_ConnectedRegions);
	SelectShape(ho_ConnectedRegions, &ho_Holes, "area", "and", 500, 1000);
	Union1(ho_Holes, &ho_ROI);
	if (HDevWindowStack::IsOpen())
		DispObj(ho_ImageZoomed, HDevWindowStack::GetActive());
	ReduceDomain(ho_ImageZoomed, ho_ROI, &ho_ImageZoomed);
	if (HDevWindowStack::IsOpen())
		DispObj(ho_ROI, HDevWindowStack::GetActive());
	hv_Error = 0.0;
	// dev_update_window(...); only in hdevelop
	while (0 != (hv_Error < 255))
	{
		BestMatchRotMg(ho_ImageZoomed, hv_TemplateID, -hv_pi, 2 * hv_pi, 30, "true", 2,
			&hv_Row, &hv_Column, &hv_Angle, &hv_Error);
		if (0 != (hv_Error < 255))
		{
			if (0 != (hv_Error > 25))
			{
				if (HDevWindowStack::IsOpen())
					SetColor(HDevWindowStack::GetActive(), "red");
			}
			else
			{
				if (HDevWindowStack::IsOpen())
					SetColor(HDevWindowStack::GetActive(), "green");
			}
			DispArrow(hv_WindowID, hv_Row, hv_Column, hv_Row + (((hv_Angle + hv_Rot).TupleCos()) * 50),
				hv_Column + (((hv_Angle + hv_Rot).TupleSin()) * 50), 1);
			GenRectangle2(&ho_Rectangle, hv_Row, hv_Column, hv_Rot + hv_Angle, 19, 59);
			if (HDevWindowStack::IsOpen())
				DispObj(ho_Rectangle, HDevWindowStack::GetActive());
			GetDomain(ho_ImageZoomed, &ho_Domain);
			Difference(ho_Domain, ho_Rectangle, &ho_Difference);
			ReduceDomain(ho_ImageZoomed, ho_Difference, &ho_ImageZoomed);
		}
	}
	// dev_update_window(...); only in hdevelop
	// stop(); only in hdevelop
	//Continue in order to give free the memory of the template
	ClearTemplate(hv_TemplateID);
}

NOTE

注意HALCON与VS2017的配置,在之前的文档中有,主要添加了两个按钮,IDC_BTN_READ_IMAGE(读取图像),IDC_BTN_IMAGE_PROCESS(图像处理)
两个Picture Cotrol,
IDC_DISPIMAGE(原始图),IDC_DISPIMAGE_PROCESS(处理后)

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值