引言
使用MFC联合Halcon,将HDevelop中的演示结果用MFC中对话框的形式显示
一、结果
1.1 Halcon演示结果
1.2 MFC演示结果
二、Halcon代码
* xing.hdev: Traffic monitoring (by Kalman filtering)
*
dev_update_off ()
dev_close_window ()
read_image (Image, 'xing/init')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowID)
set_display_font (WindowID, 14, 'mono', 'true', 'false')
read_region (XingRegion, 'xing/xing_region')
dev_set_draw ('margin')
dev_set_colored (12)
dev_set_line_width (3)
dev_display (Image)
disp_continue_message (WindowID, 'black', 'true')
stop ()
zoom_image_factor (Image, ImageZoomed, 0.5, 0.5, 'constant')
create_bg_esti (ImageZoomed, 0.7, 0.7, 'fixed', 0.001, 0.03, 'on', 8.0, 10, 3.25, 15, BgEstiHandle)
for I := 0 to 587 by 1
read_image (ActualImage, 'xing/xing' + (I$'03'))
zoom_image_factor (ActualImage, ImageZoomed, 0.5, 0.5, 'constant')
run_bg_esti (ImageZoomed, ForegroundRegion, BgEstiHandle)
zoom_region (ForegroundRegion, RegionZoom, 2, 2)
intersection (RegionZoom, XingRegion, RegionIntersection)
connection (RegionIntersection, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 20, 99999)
shape_trans (SelectedRegions, RegionTrans, 'convex')
union1 (RegionTrans, RegionUnion)
connection (RegionUnion, FinalConnected)
select_gray (FinalConnected, ActualImage, SelectedRegionsGray, 'deviation', 'and', 25, 1000)
union1 (SelectedRegionsGray, RegionUnionFinal)
dilation_rectangle1 (RegionUnionFinal, RegionDilation, 5, 5)
complement (RegionDilation, BackGround)
clip_region (BackGround, RegionClipped, 0, 0, Height - 1, Width - 1)
zoom_region (RegionClipped, BackGroundZoom, 0.5, 0.5)
update_bg_esti (ImageZoomed, BackGroundZoom, BgEstiHandle)
shape_trans (SelectedRegionsGray, Rects, 'rectangle1')
dev_display (ActualImage)
dev_display (Rects)
endfor
give_bg_esti (BackgroundImage, BgEstiHandle)
dev_display (BackgroundImage)
close_bg_esti (BgEstiHandle)
dev_set_draw ('fill')
dev_update_on ()
三、MFC源代码
1.头文件主要代码
public:
MyAssist myassist;
HTuple picture1_WindowID,picture2_WindowID;
CWnd *pWnd;
// Local iconic variables
HObject ho_Image, ho_XingRegion, ho_ImageZoomed;
HObject ho_ActualImage, ho_ForegroundRegion, ho_RegionZoom;
HObject ho_RegionIntersection, ho_ConnectedRegions, ho_SelectedRegions;
HObject ho_RegionTrans, ho_RegionUnion, ho_FinalConnected;
HObject ho_SelectedRegionsGray, ho_RegionUnionFinal, ho_RegionDilation;
HObject ho_BackGround, ho_RegionClipped, ho_BackGroundZoom;
HObject ho_Rects, ho_BackgroundImage;
// Local control variables
HTuple hv_Width, hv_Height, hv_WindowID, hv_BgEstiHandle;
HTuple hv_I;
public:
afx_msg void OnBnClickedButtonReadImg();
2.源文件主要代码
void CHalconMFCDlg::OnBnClickedButtonReadImg()
{
// TODO: 在此添加控件通知处理程序代码
CRect rect;
pWnd = GetDlgItem(IDC_STATIC_ORIGINAL_IMG);
picture1_WindowID = (Hlong)pWnd->m_hWnd;
pWnd->GetWindowRect(&rect);
//xing.hdev: Traffic monitoring (by Kalman filtering)
//
myassist.dev_update_off();
ReadImage(&ho_Image, "xing/init");
GetImageSize(ho_Image, &hv_Width, &hv_Height);
SetWindowAttr("background_color", "black");
OpenWindow(0, 0, rect.Width(), rect.Height(), picture1_WindowID, "visible", "", &hv_WindowID);
HDevWindowStack::Push(hv_WindowID);
myassist.set_display_font(hv_WindowID, 14, "mono", "true", "false");
ReadRegion(&ho_XingRegion, "xing/xing_region");
if (HDevWindowStack::IsOpen())
SetDraw(HDevWindowStack::GetActive(), "margin");
if (HDevWindowStack::IsOpen())
SetColored(HDevWindowStack::GetActive(), 12);
if (HDevWindowStack::IsOpen())
SetLineWidth(HDevWindowStack::GetActive(), 3);
if (HDevWindowStack::IsOpen())
DispObj(ho_Image, HDevWindowStack::GetActive());
myassist.disp_continue_message(hv_WindowID, "black", "true");
// stop(); only in hdevelop
ZoomImageFactor(ho_Image, &ho_ImageZoomed, 0.5, 0.5, "constant");
CreateBgEsti(ho_ImageZoomed, 0.7, 0.7, "fixed", 0.001, 0.03, "on", 8.0, 10, 3.25,
15, &hv_BgEstiHandle);
for (hv_I = 0; hv_I <= 587; hv_I += 1)
{
ReadImage(&ho_ActualImage, "xing/xing" + (hv_I.TupleString("03")));
ZoomImageFactor(ho_ActualImage, &ho_ImageZoomed, 0.5, 0.5, "constant");
RunBgEsti(ho_ImageZoomed, &ho_ForegroundRegion, hv_BgEstiHandle);
ZoomRegion(ho_ForegroundRegion, &ho_RegionZoom, 2, 2);
Intersection(ho_RegionZoom, ho_XingRegion, &ho_RegionIntersection);
Connection(ho_RegionIntersection, &ho_ConnectedRegions);
SelectShape(ho_ConnectedRegions, &ho_SelectedRegions, "area", "and", 20, 99999);
ShapeTrans(ho_SelectedRegions, &ho_RegionTrans, "convex");
Union1(ho_RegionTrans, &ho_RegionUnion);
Connection(ho_RegionUnion, &ho_FinalConnected);
SelectGray(ho_FinalConnected, ho_ActualImage, &ho_SelectedRegionsGray, "deviation",
"and", 25, 1000);
Union1(ho_SelectedRegionsGray, &ho_RegionUnionFinal);
DilationRectangle1(ho_RegionUnionFinal, &ho_RegionDilation, 5, 5);
Complement(ho_RegionDilation, &ho_BackGround);
ClipRegion(ho_BackGround, &ho_RegionClipped, 0, 0, hv_Height - 1, hv_Width - 1);
ZoomRegion(ho_RegionClipped, &ho_BackGroundZoom, 0.5, 0.5);
UpdateBgEsti(ho_ImageZoomed, ho_BackGroundZoom, hv_BgEstiHandle);
ShapeTrans(ho_SelectedRegionsGray, &ho_Rects, "rectangle1");
if (HDevWindowStack::IsOpen())
DispObj(ho_ActualImage, HDevWindowStack::GetActive());
if (HDevWindowStack::IsOpen())
DispObj(ho_Rects, HDevWindowStack::GetActive());
Sleep(90);
}
GiveBgEsti(&ho_BackgroundImage, hv_BgEstiHandle);
if (HDevWindowStack::IsOpen())
DispObj(ho_BackgroundImage, HDevWindowStack::GetActive());
CloseBgEsti(hv_BgEstiHandle);
if (HDevWindowStack::IsOpen())
SetDraw(HDevWindowStack::GetActive(), "fill");
myassist.dev_update_on();
}