MFC与HALCON混合编程八之目标跟踪- Kalman filtering

121 阅读1分钟

引言

使用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();

}
	

总结