线图像RoiBase类比起感兴趣区域RoiBase1类要复杂一些,关键是直线的旋转带来的。
我们要操作他,还要封装到
public class ROI//设计的线图像工具
{
public RoiBase m_RoiBase;
public E_HANDLES m_eHandle;
public Cursor m_cur;
public ROI()
{
m_RoiBase = new RoiBase();
m_cur = Cursors.Arrow;
}
public void DrawRectFrame(bool lbtn, PointF point)//感知两个鼠标操作
{
if (lbtn)
{
switch (m_eHandle)
{
case E_HANDLES.E_HANDLE_INSIDE:
m_RoiBase.Drag(point);//移动操作
break;
case E_HANDLES.E_HANDLE_EAST:
m_RoiBase.DragXYandRotate(point);//操作rccentreline.endPt(x,y),并旋转,
break;
default:
break;
}
}
else
{
m_eHandle = (E_HANDLES)m_RoiBase.IsPointInRect(point);
}
Insteadof((int)m_eHandle);
return;
}
private void Insteadof(int intcursor)
{
switch (intcursor)
{
.................... (与感兴趣区域相同)
}
return;
}
}
准备工作已经做完,在pictureBoxRoiImg控件显示出来。
1, 声明 private ROI m_线图像;并在form()中初始化 m_线图像 = new ROI ();
2,在pictureBoxRoiImg_mouseMove函数中
PointF point = new PointF(e.X, e.Y);
bool status = false;
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
status = true;
}
m_线图像.DrawRectFrame(status, point);
this.Cursor = m_线图像.m_cur;
pictureBoxRoiImg.Invalidate(false);
3,在pictureBoxRoiImg_Paint函数中
Graphics g = e.Graphics;
Pen p = new Pen(Color.Green, 1);
m_线图像.m_RoiBase.DrawLineAndRect(g, p, glob_Dir);//glob_Dir默认白到黑=0
完成上面三步,线图像就画好了,而且可以拖动,旋转,拉伸。既然m_线图像.m_RoiBase.startLine是我们的线图像,
我们应该求取线上的每一个(x,y),并且得到颜色灰度,甚至求梯度线图像,找到感知到的穿越点,使用梯度和的方法,画出叉叉。(待续................)