Learning opencv續不足(七)線圖像的設計D

由於線圖像startline有了起點和終點,咱們就能夠用DDA法求出線上全部點,任意斜率直線經過四象限八區域查表法界定。咱們只示範一個區域:函數爲: public PointF DdaFindPtImprove(ref byte[] buffer8, PointF Start, PointF End, int thresDelta, int Dir,Size wh,ref int Pos)//thresDelta門檻值,Pos線圖像中穿越點index函數

 {         float x, y;
            float dx, dy, k;
            PointF backPoint = new PointF();工具

            dx = (float)(End.X - Start.X);
            dy = (float)(End.Y - Start.Y);
            k = dy / dx;
            if (Math.Abs(dx) < 0.001)
            {
                k = 65535;//隨意給定一個最大值,還需論證。20150727,夠用
            }
            x = Start.X;
            if (Start.Y < 0) Start.Y = 0;
            y = Start.Y;設計

            List<float> temparrclor = new List<float>(); // 線圖像上每個點灰度顏色   
            List<PointF> position = new List<PointF>();//線圖像上每個點座標
            #region xiaoyu1
            if (Math.Abs(k) < 1)
            {
                if (x > End.X)
                {
                    for (; x >= End.X; x--)//x是整型,y是浮點型
                    {
                        float j = y;
                        int i = (int)(x);
                        float tempf = Math.Abs(j - (int)j);
                        PointF tempPt = new PointF(i, j);
                        float grey = 0;
                        if (k > -1 && k <= 0)
                        {
                            float avgGrey = (float)buffer8[(int)j * wh.Width + i];
                            float avgGrey1 = (float)buffer8[((int)j + 1) * wh.Width + i];
                            grey = avgGrey * (1 - tempf) + avgGrey1 * tempf;//灰度插值方法
                        }
                        else
                        {
                            float avgGrey = (float)buffer8[(int)j * wh.Width + i];
                            float avgGrey1 = (float)buffer8[((int)j - 1) * wh.Width + i];
                            grey = avgGrey * (1 - tempf) + avgGrey1 * tempf;
                        }
                        temparrclor.Add(grey);//插值灰度
                        position.Add(tempPt);it

                        y = y - k;
                    }                                              
                    backPoint = FindCrosspointimprove(ref temparrclor, ref position, Dir, thresDelta,ref Pos);//找穿越點
                }
                else {.......}io

          }object

 #endregion xiaoyu1List

........  return backPoint;}float

  public PointF FindCrosspointimprove(ref List<float> lineTiDu, ref List<PointF> ijRecord, int Dir, int thresDelta,ref int POS)
        {//梯度和求穿越點,使用五個一組,與所講略有差異
            List<float> deltatemp = new List<float>();
            List<float> fenzuaverage = new List<float>();
            for (int i = 0; i < lineTiDu.Count - 1; i++)
            {
                float grey1 = lineTiDu[i + 1];               
                float delta = (lineTiDu[i] - grey1);
                if (Math.Abs(delta) < 5)
                    delta = 0;
                deltatemp.Add(delta);
            }方法

            int fenzuC = deltatemp.Count / 5;
            for (int i = 0; i < fenzuC * 5; i = i + 5)
            {
                float sum5 = deltatemp[i] + deltatemp[i + 1] + deltatemp[i + 2] + deltatemp[i + 3] + deltatemp[i + 4];
                float aver = sum5 / 5;
                if (Math.Abs(aver) < 5)
                    aver = 0;
                fenzuaverage.Add(aver);
            }
            if (fenzuaverage.Count == 0) return new PointF();
            int crosspoint = 0;
            int crosspoint1 = 0;
            if (Dir == 0)
            {im

                for (int iii = fenzuaverage.Count - 1; iii >= 0; iii--)//排除起點和終點
                {
                    if (fenzuaverage[iii] > 0)
                    {
                        crosspoint = 5 * (iii);
                        break;
                    }
                }
             float   maxVar = deltatemp[crosspoint];
                for (int m = -5; m < 5; m++)
                {
                    int tempint = crosspoint + m;
                    if (crosspoint == 0)
                        tempint = 0;
                    if (deltatemp[tempint] >= maxVar)//白到黑,加入方向判別
                    {
                        maxVar = deltatemp[tempint];
                        crosspoint1 = tempint;
                    }
                }
               
            }
            if (Dir == 1)
            {

                for (int iii =0 ; iii <= fenzuaverage.Count - 1; iii++)//排除起點和終點
                {
                    if (fenzuaverage[iii] < 0)
                    {
                        crosspoint = 5 * (iii);
                        break;
                    }
                }
               // minVar = deltatemp[crosspoint];
                float minVar = deltatemp[crosspoint];
                for (int m = -5; m < 5; m++)
                {
                    int tempint = crosspoint + m;
                    if (crosspoint == 0)
                        tempint = 0;
                    if (deltatemp[tempint] <= minVar)//白到黑,加入方向判別
                    {
                        minVar = deltatemp[tempint];
                        crosspoint1 = tempint;
                    }
                }

            }
            if (fenzuaverage[crosspoint / 5] * 5 >= thresDelta || fenzuaverage[crosspoint / 5] * 5 <= -thresDelta)
            {
                POS = crosspoint1;//穿越點的index在線圖像序列中
                return ijRecord[crosspoint1];//穿越點的index對應座標
            }//門檻判別
            else
            {
                return new PointF();//沒有穿越點,返回(0,0)
            }
        }

一切準備就緒,在private void pictureBoxRoiImg_Paint(object sender, PaintEventArgs e)調用

 if (m_btempImage3 == true)//截取的ROI圖像
                    {
                        PointF startxy = m_線圖像.m_RoiBase.startLine.pt_start;
                        PointF endxy = m_線圖像.m_RoiBase.startLine.pt_end;               
                   PointF     returnpoint = DdaFindPtImprove(ref tempImage3, startxy,
                                            endxy, 門檻值, glob_Dir, new Size(_RoiW, _RoiH), ref pos);
                        p = new Pen(Color.Red, 1);//畫出穿越點叉叉
                        g.DrawLine(p, new PointF(returnpoint.X, returnpoint.Y - 3), new PointF(returnpoint.X, returnpoint.Y + 3));
                        g.DrawLine(p, new PointF(returnpoint.X - 3, returnpoint.Y), new PointF(returnpoint.X + 3, returnpoint.Y));              
                    }

到此,線圖像設計完成。下一節講一組線圖像組成找線工具。(待續..............)如下是運行後線圖像工具效果:--------------------- 

相關文章
相關標籤/搜索