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(处理后)