因为线图像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);

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

}

#endregion xiaoyu1

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

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)
            {

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));              
                    }

到此,线图像设计完成。下一节讲一组线图像组成找线工具。(待续..............)以下是运行后线图像工具效果:
---------------------

Learning opencv续不足(七)线图像的设计D的更多相关文章

  1. 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整

    今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...

  2. 【图像处理】OpenCV+Python图像处理入门教程(七)图像形态学操作

    图像形态学主要从图像内提取分量信息,该分量信息通常对表达图像的特征具有重要意义.例如,在车牌号码识别中,能够使用形态学计算其重要特征信息,在进行识别时,只需对这些特征信息运算即可.图像形态学在目标视觉 ...

  3. Python 图像处理 OpenCV (15):图像轮廓

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  4. 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析(转)

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20537737 作者:毛星云(浅墨)  ...

  5. (原)使用opencv的warpAffine函数对图像进行旋转

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5070576.html 参考网址: http://stackoverflow.com/questions ...

  6. OpenCV成长之路:图像直方图的应用

    OpenCV成长之路:图像直方图的应用 2014-04-11 13:57:03 标签:opencv 图像 直方图 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否 ...

  7. OpenCV成长之路:图像滤波

    http://ronny.blog.51cto.com/8801997/1394138 OpenCV成长之路:图像滤波 2014-04-11 14:28:44 标签:opencv 边缘检测 sobel ...

  8. OpenCV 鼠标手动绘制掩码图像

    OpenCV 鼠标手动绘制掩码图像 完整的代码: #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui ...

  9. 【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

随机推荐

  1. raywenderlich.com的Swift编程风格指南

    翻译自:https://github.com/raywenderlich/swift-style-guide 这个风格指南可能和你从其它地方看到的不同,我们的焦点主要集中在互联网和文章上的可读性.创建 ...

  2. BZOJ 3439 Kpm的MCpassword Trie树+可持久化线段树

    题目大意:给定n个字符串,对于每一个字符串求以这个字符串为后缀的字符串中第k小的编号 首先将字符串反转 那么就变成了对于每一个字符串求以这个字符串为前缀的字符串中第k小的编号 然后考虑对字符串排序 那 ...

  3. Ubuntu14 中安装 VMware10 Tools工具&lt;2&gt;

    网上说已经针对上一篇提到的无法显示共享文件夹的问题做了补丁.补丁地址是https://github.com/rasa/vmware-tools-patches,我没有成功,还是出现"hgfs ...

  4. Linuxserver沦陷为肉鸡的全过程实录

    Linuxserver沦陷为肉鸡的全过程实录 Linuxserver沦陷为肉鸡的全过程实录 从防火墙瘫痪说起 查找黑客行踪的方法 沦陷过程分析 1 oracle用户password被破解 2 黑客动作 ...

  5. 嵌入式C语言经常使用keyword

    1.statickeyword 这个keyword前面也有提到.它的作用是强大的. 要对statickeyword深入了解.首先须要掌握标准C程序的组成. 标准C程序一直由下列部分组成:       ...

  6. 产品架构model

  7. go语言笔记——还是大爱的我的python,开发效果高,tornado的性能也很不错

    Go 自带的工具集主要使用脚本和 Go 语言自身编写的,目前版本的 Go 实现了以下三个工具: go install 是安装 Go 包的工具,类似 Ruby 中的 rubygems.主要用于安装非标准 ...

  8. eclipse和jdk版本对应问题

    日常开发中,32位eclipse要用32位jdk,64位则必须要用64位jdk,否则启动时就会报错,load jvm.dll失败,昨天又遇到了这个问题.更换对应的版本之后就好了.tomcat等应用也有 ...

  9. Gift

    [问题描述] 人生赢家老王在网上认识了一个妹纸,然后妹纸的生日到了,为了表示自己的心 意,他决定送她礼物.可是她喜爱的东西特别多,然而他的钱数有限,因此他想 知道当他花一定钱数后剩余钱数无法再购买任何 ...

  10. JSP-Runoob:JSP 状态码

    ylbtech-JSP-Runoob:JSP 状态码 1.返回顶部 1. SP HTTP 状态码 HTTP请求与HTTP响应的格式相近,都有着如下结构: 以状态行+CRLF(回车换行)开始 零行或多行 ...