在上一节的基础之上,我多增加了一个通过滑动控件来修改阈值的操作。
接下来小石讲解如何实现,先看如下图所示的最终图片:
我只是简单的在下面增加一个滑动控件,通过控件来调整阈值。
第一步:添加必要的成员变量。在CHalconMFCDlg.h 中添加几个成员变量。
CSliderCtrl m_ctrlSlider;
int m_threshold;//设置阈值法的阈值
BOOL m_IsEmpty; //判断是否已加载图像
可以在滑动控件右键,然后添加变量,选择空间变量。添加以后,将会在下图出现这一行代码。
voidCHalconMFCDlg::DoDataExchange(CDataExchange* pDX)
{
//这个函数用于控件与类成员交换数据用
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_SLIDER1, m_ctrlSlider);//滑动条控件与成员变量的关联
}
在CHalconMFCDlg::OnInitDialog() 里面进行额外的初始化操作。
BOOL CHalconMFCDlg::OnInitDialog()
{
CDialog::OnInitDialog();
…………
//滑动块初始化
m_ctrlSlider.SetRange(0,255); //设置滑块位置的最大值和最小值
m_ctrlSlider.SetPos(125); //设置滑块的默认当前位置
//初始化图像加载标识
m_IsEmpty = FALSE;
returnTRUE; // 除非将焦点设置到控件,否则返回TRUE
}
void CHalconMFCDlg::OnNMCustomdrawSlider1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMCUSTOMDRAW pNMCD = reinterpret_cast(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
intnPos = m_ctrlSlider.GetPos(); //获得滑块的当前位置
CString str="";
str.Format("%d",nPos);
SetDlgItemText(IDC_EDITSlide,str);//将当前的值发送到编辑框
}
void CHalconMFCDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
CSliderCtrl *pSlidCtrl=(CSliderCtrl*)GetDlgItem(IDC_SLIDER1);
m_threshold=pSlidCtrl->GetPos();//取得当前位置值
if( m_IsEmpty == TRUE)//如果窗口中没有图像,则不作处理
{
set_color(WindowHandle2,"red");
threshold(Image, &Region, 0, m_threshold);
connection(Region, &ConnectedRegions);
select_shape(ConnectedRegions, &SelectedRegions, "rect2_len1", "and", 500, 550);
closing_rectangle1(SelectedRegions, &RegionClosing, 80, 80);
difference(RegionClosing, SelectedRegions, &RegionDifference);
connection(RegionDifference, &ConnectedRegions1);
select_shape(ConnectedRegions1, &SelectedRegions1, "area", "and", 500, 99999);
set_part(WindowHandle2,0,0,Height-1,Width-1);
clear_window(WindowHandle2);
disp_obj(Image, WindowHandle2);
disp_obj(SelectedRegions1, WindowHandle2);
}
else
{
MessageBox("请加载图像!");
}
}