美文网首页
C#:边界跟踪法

C#:边界跟踪法

作者: 大龙10 | 来源:发表于2023-09-08 12:50 被阅读0次
  • EmguCV是将opencv封装的一个.net库,可以被VC++,VC#,VB.net调用。
    EmguCV可以很好地连接C#与opencv,能够弥补opencv在gui这方面的不足。

一、Mat对象的像素操作

  • 生成一个m8相同大小的全白图像
            Scalar scalar = new Scalar(255, 255,255);
            Mat coutour_img = new Mat(m8.Size(),MatType.CV_8UC1,scalar);
  • Mat中不管是以At访问还是ptr访问,都是行优先 ,先Y轴后X轴(即先行后列)

二、边界跟踪法

  • 边界跟踪法的函数
       #region 轮廓追踪
        protected void TraceContour(Mat imagedata,Mat contour_img)
        {
            int hei = imagedata.Rows;
            int wid = imagedata.Cols;
            int cn = imagedata.Channels(); //获取通道数
            int start_i = 0;
            int start_j = 0;

            List<OpenCvSharp.Point> ContourPoints = new List<OpenCvSharp.Point>();
            //寻找种子点
            bool bfindstartpoint = false;
            for (int row = 0; row < hei; row++)
                for (int col = 0; col < wid; col++)
                {
                    if (cn == 1) //如果是单通道
                    {
                        byte p = imagedata.At<byte>(row, col); //获取像素                                                             
                        if (p == 0)
                        {
                            bfindstartpoint = true;
                            start_i = row;
                            start_j = col;
                            break;
                        }
                    }
                }
            uiTextBox1.AppendText("i=" + start_i.ToString());
            uiTextBox1.AppendText(",\t\n j=" + start_j.ToString());

            //搜索方向
            /*
             * 0 1 2
             * 7 + 3
             * 6 5 4
             */
            OpenCvSharp.Point pt = new OpenCvSharp.Point();
            if (bfindstartpoint)
            {
                pt.X = start_i;
                pt.Y = start_j;
                contour_img.Set(pt.X, pt.Y, 0);
            }
            int[,] direction = new int[8, 2] { { -1, +1 }, { 0, +1 }, { +1, +1 }, { +1, 0 }, { +1, -1 }, { 0, -1 }, { -1, -1 }, { -1, 0 } };
            int begindirect = 0;//从0开始顺时针搜索
            int findstart = 0;
            int cur_i = start_i;
            int cur_j = start_j;
            int findpoint = 0;
            int i, j;

            while (findstart == 0)
            {
                findpoint = 0;
                while (findpoint == 0)
                {
                    i = cur_i + direction[begindirect, 1];
                    j = cur_j + direction[begindirect, 0];
                    System.IO.File.AppendAllText("d:/my_trace.txt", "\t\n i=" + i.ToString() + ",j=" + j.ToString(), Encoding.Default);
                    if (j> wid) { return; }
                    byte p = imagedata.At<byte>(i, j); //获取像素   
                    if (p == 0)
                    {
                        findpoint = 1;
                        cur_i = i;
                        cur_j = j;
                        if ((cur_i == start_i) && (cur_j == start_j))  findstart = 1;                   
                        contour_img.Set(cur_i, cur_j, 0);
                        begindirect -= 1;
                        if (begindirect == -1) begindirect = 7;
                        begindirect -= 1;
                        if (begindirect == -1) begindirect = 7;

                    }
                    else
                    {
                        begindirect += 1;
                        if (begindirect == 8) begindirect = 0;
                    }
                }
            }
        }
    }
    #endregion

三、调用

       private void uiButton8_Click(object sender, EventArgs e)
        {
            // 1) 读入彩色图像
            // 2) 彩色图像灰度化
            // 3) 图像二值化 uiButton6_Click 结果在dst
            // 4)边界跟踪 结果在coutour_img
            Mat m8 = new Mat();
            dst.CopyTo(m8);
            Scalar scalar = new Scalar(255, 255,255);
            Mat coutour_img = new Mat(m8.Size(),MatType.CV_8UC1,scalar);
            TraceContour(m8,coutour_img);
            picBoxShowDel.Image = m8.ToBitmap();
            pictureBox1.Image = coutour_img.ToBitmap();
        }

运行结果

相关文章

  • 分割

    1.阈值化2.基于边缘的分割 边缘图像阈值化 边缘松弛法 .边界跟踪 . 作为图搜索的边缘跟踪 .作为动态规划的边...

  • VOT2018结果总结

    分类 单目标跟踪 短期跟踪:假定在跟踪失败后不能重新检测成功,而是要reset。 短期实时跟踪,要求预测边界框的速...

  • VRTK_PlayAreaCursor

    提供跟踪指针光标位置的播放区域边界的可视化表示;

  • 测试用例设计方法篇-因果图法

    大家好,我是十一。 前情回顾 上面一篇我们讲了边界值分析法,我们先来回顾下: 边界值分析法边界值分析法是对输入的边...

  • 07测试用例设计方法【黑盒-边界值分析法】

    黑盒测试用例设计方法-边界值分析法 边界值分析法一般是对等价类划分法的补充【边界值分析法】对被测程序的输入域或输出...

  • 软件测试理论总结

    1、等价类划分等价类划分2、边界值分析法边界值分析法3、错误推测法错误推测法4、因果图文法因果图文法5、路径覆盖路...

  • 九、动态存储管理

    九、动态存储管理 1. 边界标识法 边界标识法是在动态存储块的上下边界各设一个双向链表结点,分别称其为头部域和底部...

  • 重温知识——测试用例边界值分析方法

    定义:边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充,...

  • 边界值三点分析法

    一、 定义 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的...

  • 边界值三点分析法

    一、定义 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补...

网友评论

      本文标题:C#:边界跟踪法

      本文链接:https://www.haomeiwen.com/subject/tkzrvdtx.html