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

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

转载于:https://www.cnblogs.com/ly570/p/11026686.html

Learning opencv续不足(七)线图像的设计D相关推荐

  1. AI学习笔记(七)图像滤波器、OpenCV算法解析

    AI学习笔记之图像滤波器.OpenCV算法解析 图像滤波器 图像噪声 噪声的产生 信噪比 高斯噪声 椒盐噪声 其他噪声 图像滤波 滤波的目的 滤波的要求 各种滤波器 均值滤波 中值滤波 最大最小值滤波 ...

  2. OpenCV与图像处理学习二——图像直方图与色彩空间

    OpenCV与图像处理学习二--图像直方图与色彩空间 2.4 图像直方图(Image Histogram) 2.4.1 直方图的绘制 2.4.2 三通道直方图绘制 2.5 颜色空间 2.5.1 RGB ...

  3. OpenCV实例(七)汽车检测

    OpenCV实例(七)汽车检测 1.概述 2.代码实例 3.代码功能 作者:Xiou 1.概述 对于图像和视频检测中的目标类型并没有具体限制,但是,为了使结果的准确度在可接受范围内,需要一个足够大的数 ...

  4. c++ opencv编程实现暗通道图像去雾算法_OpenCV图像处理专栏十五 |一种基于亮度均衡的图像阈值分割技术...

    前言 对于光照不均匀的图像,用通常的图像分割方法不能取得满意的效果.为了解决这个问题,论文<一种基于亮度均衡的图像阈值分割技术>提出了一种实用而简便的图像分割方法.该方法针对图像中不同亮度 ...

  5. c++ opencv编程实现暗通道图像去雾算法_OpenCV图像处理专栏十三 | 利用多尺度融合提升图像细节...

    前言 今天为大家介绍一个利用多尺度来提升图像细节的算法.这个算法来自于论文<DARK IMAGE ENHANCEMENT BASED ON PAIRWISE TARGET CONTRAST AN ...

  6. OpenCV入门(七)快速学会OpenCV6色彩空间

    OpenCV入门(七)快速学会OpenCV6色彩空间 作者:Xiou 1.色彩空间概述 色彩空间 (Color Space) 即以同的空间维度来表示某一色彩 (通常使用 3 个或者 4 个 值). R ...

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

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

  8. 【OpenCV图像处理】五、图像的几何变换(下)

    5.1 图像的缩放变换 图像的缩放指的是将图像的尺寸变小或变大的过程,也就是减少或增加原图像数据的像素个数.简单来说,就是通过增加或删除像素点来改变图像的尺寸.当图像缩小时,图像会变得更加清晰,当图像 ...

  9. 基于OpenCV的实时车道线分割&车道保持系统(源码&教程)

    1.研究背景 汽车主动安全系统能够实现风险的主动预防和规避,其能有力缓解当前我国汽车交通事故频发的困境,故对其的相关研究得到了国家的大力支持. 车道保持辅助系统(LKAS,Lane Keeping A ...

最新文章

  1. Go 学习笔记(71)— Go 接口 interface (接口定义、接口实现、接口调用、值接收者、指针接收者)
  2. 剑指offer:第一个只出现一次的字符
  3. HTML5中video标签与canvas绘图的使用
  4. 详解HTTP与HTTPS
  5. 介绍Dynamics 365的OrgDBOrgSettings工具
  6. 更新pcb封装导入_PCB设计│网表导入的雷区,你还在踩?
  7. [iPhone开发]UIWebview 嵌入 UITableview
  8. Ubuntu出现没有正确安装GNOME电源管理器的默认配置
  9. apicloud入门学习笔记1:简单介绍
  10. python fabric上传文件夹_通过python的fabric包完成代码上传部署(简单版)
  11. 基于VisualC++2010开发Windows7杀毒应用程序范例(2)---检测并遍历所有进程的线程信息...
  12. sublime text的插件emmet的功能介绍页
  13. 阿里云推出香港高防IP服务 为中国企业出海安全护航
  14. sql2005镜像实现
  15. android 知识点大全 面试
  16. 一行代码让图形秒变「手绘风」
  17. linux学习-执行cp命令时略过目录
  18. PR2018模板|手机竖屏图文视频制作剪辑素材/抖音,快手等短视频创作模板
  19. 《JavaSE-第七章》之抽象的类-实例的对象-合理的封装
  20. CCD摄像头相关知识

热门文章

  1. 在python中使用什么函数进行输出_Python中使用pprint函数进行格式化输出的教程
  2. springboot+vue+element+mybatisplus项目(前端)
  3. mysql下拉框回显_下拉框的回显 (修改时候)
  4. cad批量偏移_永远都不会卸载的几款CAD插件,月入过万不要太轻松。
  5. 微信小程序获取上一页路由 获取从哪个页面跳转进来的
  6. c语言time.h时区不对,用C语言修改系统时区,发现一堆问题,请各位大侠不吝赐教。...
  7. java sqlite 多线程并发_Android中Sqlite数据库多线程并发问题
  8. Web容器默认的servlet
  9. hdfs是nas_HDFS 协议是怎么回事
  10. 计算机算法对程序设计的作用,算法计算机论文,关于数学算法对计算机编程优化相关参考文献资料-免费论文范文...