上一节完成了roibase3下层基础画类,接下来是中层操作类ROI_coord:
public class ROI_coord
{
public RoiBase3 m_RoiBase;
public E_HANDLES m_eHandle;
public Cursor m_cur;
public ROI_coord()
{
m_RoiBase = new RoiBase3();
m_cur = Cursors.Arrow;
}
public void DrawRectFrame(bool lbtn, PointF point)
{
// COOR ret=new COOR();
if (lbtn)
{
switch (m_eHandle)
{
case E_HANDLES.E_HANDLE_INSIDE://操作一,拖动
m_RoiBase.Drag(point);//RcCentreLine和startLine两条线相交处是原点,此处拖动原点
break;//以前工具拖动为RcCentreLine中心点
case E_HANDLES.E_HANDLE_SOUTH:
m_RoiBase.DragTolerancey(point);//操作二,弹性(此处是y轴长短变化)
break;
case E_HANDLES.E_HANDLE_EAST:
m_RoiBase.DragXYandRotate(point);//操作三,旋转
break;
default:
break;
}
}
else
{
m_eHandle = (E_HANDLES)m_RoiBase.IsPointInRect(point);
}
Insteadof((int)m_eHandle);
// return ret;
}
private void Insteadof(int intcursor){.......}
}
好了,下面我们在form中实现它,无非三步:
第一,声明 private ROI_coord m_roiCoord显示;并在form()中初始化: m_roiCoord显示 = new ROI_coord();
第二,控件pictureBox响应mousemove:
private void pictureBoxcorrectimg_MouseMove(object sender, MouseEventArgs e)
{
PointF point = new PointF(e.X, e.Y);
bool status = false;
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
status = true;
}
this.Cursor = m_roiCoord显示.m_cur;
m_roiCoord显示.DrawRectFrame(status, point);
pictureBoxcorrectimg.Invalidate(false);
}
第三,控件pictureBox响应paint事件: private void pictureBoxcorrectimg_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
m_roiCoord显示.m_RoiBase.DrawLineAndRect(g, new Pen(Color.Red, 1));
}
ok!完成。这个东西用处很大,有它,心才能放下,所有的努力,终于可以长长的出一口气了,以后的标定,fixture都会用到它。况且我们的计算机视觉偏重测量,测量是在坐标系中进行的,测量是在相对坐标系(局部)中进行更准确。
下一节的主题是,我们来看一看线工具的第五变化,看它是怎么学习(learning)和匹配(模式识别)的,正是我发现线工具有识别匹配功能,实践此想法后,才唤起我写下以上博客的初心。
(待续,慢慢来...............)下面是效果图: