热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:OpenCV直线拟合检测

篇首语:本文由编程笔记#小编为大家整理,主要介绍了OpenCV直线拟合检测相关的知识,希望对你有一定的参考价值。OpenCV直线拟合检

篇首语:本文由编程笔记#小编为大家整理,主要介绍了OpenCV直线拟合检测相关的知识,希望对你有一定的参考价值。



OpenCV直线拟合检测


一:相关知识点

1. 距离变换

距离变换是二值图像处理与操作中常用手段,在骨架提取,图像窄化中常有应用。距离变换的结果是得到一张与输入图像类似的灰度图像,但是灰度值只出现在前景区域。并且越远离背景边缘的像素灰度值越大。OpenCV中距离变换的函数如下:









  1. distanceTransform(src, distanceType, maskSize, dst=None, dstType=None):





  2. - src 表示输入的二值图像





  3. - distanceType,常见的有DIST_L1、DIST_L2、DIST_C三种方式





  4. - maskSize,支持3x35x5、DIST_MASK_PRECISE





  5. - dst输出距离变换图像





  6. - dstType 数据类型、默认是CV_32F





DIST_L1、DIST_L2、DIST_C计算像素距离方式如下:


其中当选择DIST_L2与DIST_MASK_PRECISE时候,OpenCV会使用TBB并行计算加速,DIST_L1与DIST_C是比较精确的距离计算方式、DIST_L2是比较快而粗糙的距离计算方式。下图是基于DIST_L2计算得到结果:

OpenCV直线拟合检测

2. 水平与垂直投影

关于这个OpenCV中我没有发现直接可以使用的相关API,所以我自己写了点代码,二值图像的水平或者垂直投影可以用于粘连字符分割、对象分离,发现局部极大值像素等处理,是非常重要的二值图像分析与处理手段。假设有二值图像与其像素分布如下:

OpenCV直线拟合检测

其水平与垂直投影则分别如下:

OpenCV直线拟合检测


二:案例分析

OpenCV直线拟合检测

对上面这样一张图像,需要对其提取水平与垂直的两条直线,完整的代码实现分为如下几步: 1.对二值图像实现距离变换









  1. h, w, ch = frame.shape





  2. # 二值化图像





  3. print("start to detect lines...\n")





  4. gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)





  5. ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)





  6. cv.imshow("binary image", binary)





  7. cv.imwrite("D:/binary.png", binary)









  8. dist = cv.distanceTransform(binary, cv.DIST_L1, cv.DIST_MASK_PRECISE)





2.水平与垂直投影提取骨架









  1. result = np.zeros((h, w), dtype=np.uint8)





  2. ypts = []





  3. for row in range(h):





  4.    cx = 0





  5.    cy = 0





  6.    max_d = 0





  7.    for col in range(w):





  8.        d = dist[row][col]





  9.        if d > max_d:





  10.            max_d = d





  11.            cx = col





  12.            cy = row





  13.    result[cy][cx] = 255





  14.    ypts.append([cx, cy])









  15. xpts = []





  16. for col in range(w):





  17.    cx = 0





  18.    cy = 0





  19.    max_d = 0





  20.    for row in range(h):





  21.        d = dist[row][col]





  22.        if d > max_d:





  23.            max_d = d





  24.            cx = col





  25.            cy = row





  26.    result[cy][cx] = 255





  27.    xpts.append([cx, cy])









  28. cv.imshow("lines", result)





  29. cv.imwrite("D:/skeleton.png", result)





3.根据骨架像素点拟合直线









  1. frame = self.line_fitness(ypts, image=frame)





  2. frame = self.line_fitness(xpts, image=frame, color=(255, 0, 0))









  3. cv.imshow("fit-lines", frame)





  4. cv.imwrite("D:/fitlines.png", frame)





每步执行之后的输出分别如下:


距离变换结果


OpenCV直线拟合检测


骨架提取结果


OpenCV直线拟合检测


拟合直线结果








一勤天下无难事、

百思胸中有良谋!


关注【OpenCV学堂】

长按或者扫码下面二维码即可关注



推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 本文介绍了[从头学数学]中第101节关于比例的相关问题的研究和修炼过程。主要内容包括[机器小伟]和[工程师阿伟]一起研究比例的相关问题,并给出了一个求比例的函数scale的实现。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
author-avatar
jason---zhu
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有