机器视觉入门之路(五五,找圆工具的设计A,c#)

第二个封装类:鼠标对圆的三个操作

   public class ROI_Cirle
    {
        public RoiBase2 m_RoiCircle;
        public E_HANDLES m_eHandle;
        public Cursor m_cur;
        public ROI_Cirle()
        {
            m_RoiCircle = new RoiBase2();

        }
        public void DrawRectFrame(bool lbtn, PointF point)
        {
            if (lbtn)
            {
                switch (m_eHandle)
                {
                    case E_HANDLES.E_HANDLE_INSIDE:
                        m_RoiCircle.Drag(point);//拖动圆心
                        break;

                    case E_HANDLES.E_HANDLE_SOUTH:
                        m_RoiCircle.DragRadius(point);//拖动半径,改变圆大小
                        break;
                    case E_HANDLES.E_HANDLE_SOUTH_EAST:
                        m_RoiCircle.DragTolerance(point);//拖动another点,改变内外圆大小(操作弹性)

                        break;
                    default:
                        break;
                }
            }
            else
            {
                m_eHandle = (E_HANDLES)m_RoiCircle.IsPointInRect(point);
            }
            Insteadof((int)m_eHandle);

            return;
        }
  ................     (参考前面,已有)

    }

内外圆(受弹性控制)有什么用呢?相应的内外圆上点相连,便是线图像,线图像延伸,会通过圆心。再联想一下纸扇的辐条。下面我们就要制造这些辐条线图像,要不如何去感知圆或者弧线,或者非圆曲线呢?花费功夫折弯找线工具(通格本)是也!好的,上面所有,我们把它封装在找圆工具mg_CircleCaliper类中:

  public class mg_CircleCaliper//使得线图像在圆工具上发挥作用
    {
        public int SPLITNUM = 8;//圆被分成四象限8个分区
        public ROI_Cirle m_cirRoi;

        public mg_CircleCaliper()
        {
            m_cirRoi = new ROI_Cirle();//初始化我们准备的杰作

        }

  public PointF[] SPlitPassThroughPointsimprove(ref byte[] buffer8,//0246分区寻找穿越点
                                           ref PointF[] BackResult, int thresDelta, int Dir, Size wh,
                                           ref List<Point> onradpoints, ref List<Point> onradpointsin, ref PointF[] inback){........}

   public PointF[] SPlitPassThroughPointsimprove1357(ref byte[] buffer8,//1357分区寻找穿越点
                                        ref PointF[] BackResult, int thresDelta, int Dir, Size wh,
                                        ref List<Point> onradpoints, ref List<Point> onradpointsin, ref PointF[] inback){........}

    public PointF DdaFindPtImprove(ref byte[] buffer8, PointF Start, PointF End, int thresDelta, int Dir, Size wh)

   {..............}//前面找线工具已经用到

  public PointF FindCrosspointimprove(ref List<float> lineTiDu, ref List<PointF> ijRecord, int Dir, int thresDelta)

  {..............}//前面找线工具已经用到

}

每个分区8条线图像,8个区,一共64条线图像。1357分区寻找穿越点函数或许可以和0246分区寻找穿越点函数进化而合并,有机会可以去试一试,当下我先用这个稳定的版本。两个函数基本相同(略有差别),示范1357分区寻找穿越点函数如下:

 {//buffer8感兴趣区域图像,BackResult找到的穿越点,onradpoints外圆上点,onradpointsin内圆上点

//inback,SPlitSegPoint是内外圆上取到的构成线图像的样本点,其他参数前面找线工具已经用到
            PointF[] SPlitSegPoint = new PointF[SPLITNUM];        
            if (onradpoints.Count == 0 || onradpointsin.Count == 0) return SPlitSegPoint;
            PointF startxy = onradpointsin[0];
            PointF endxy = onradpoints[0];
            if (startxy.X < 0 || startxy.X > wh.Width - 1 ||
                     startxy.Y < 0 || startxy.Y > wh.Height - 1 ||
                     endxy.X < 0 || endxy.X > wh.Width - 1 ||
                     endxy.Y < 0 || endxy.Y > wh.Height - 1)
            {
                return SPlitSegPoint;
            }
            else
            {
                BackResult[8] = DdaFindPtImprove(ref buffer8, onradpointsin[onradpointsin.Count - 1],
                   onradpoints[onradpoints.Count - 1], thresDelta, Dir, wh);
                for (int i = 0; i < SPLITNUM; i++)
                {
                    SPlitSegPoint[i].X = onradpoints[onradpoints.Count * (i) / (SPLITNUM)].X;
                    SPlitSegPoint[i].Y = onradpoints[onradpoints.Count * (i) / (SPLITNUM)].Y;
                    inback[i].X = onradpointsin[onradpointsin.Count * (i) / (SPLITNUM)].X;
                    inback[i].Y = onradpointsin[onradpointsin.Count * (i) / (SPLITNUM)].Y;
                    startxy = inback[i];
                    endxy = SPlitSegPoint[i];
                    if (startxy.X < 0 || startxy.X > wh.Width - 1 ||
                      startxy.Y < 0 || startxy.Y > wh.Height - 1 ||
                      endxy.X < 0 || endxy.X > wh.Width - 1 ||
                      endxy.Y < 0 || endxy.Y > wh.Height - 1) continue;
                    BackResult[i] = DdaFindPtImprove(ref buffer8, inback[i], SPlitSegPoint[i], thresDelta, Dir, wh);
                }
                return SPlitSegPoint;
            }
        }

下一步,在界面运行起来,show一把。

(未完待续..............)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值