检测四边形(多边形)

2024-08-25 23:08
文章标签 多边形 检测 四边形

本文主要是介绍检测四边形(多边形),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 如何用检测由直线构成的四边形(多边形)?  这个问题自己困扰了十来天,  查了相关的算法书

(a modern approach, algorithms and applications, computer and machine vision,

Feature Extraction & Image Processing ),  并未找到直接的内容可以使用

    这阵子看了一些论文,  有用霍夫变换的,  有通过edge找vanishing point的,  有用ransac或最小二乘法拟合直线的,

印象里,  在我搜到有关quadrangle, quad, rectangle, rectilinear 之类关键词的高引用次数论文中, 

前面两个方法应用的比较多. 也不知道我关键词选的是否合适.检测多边形的原理和检测四边形类似.


下面进入正题 先说怎么直接调用opencv来检测四边形(多边形)

     目前我只能想到下面几个

1.approxPolyDP

2.findContours中的CV_CHAIN_APPROX_SIMPLE

3.hough变换

下面介绍opencv函数的使用

最简单的要属approxPolyDP,   算法解释: 看wiki的动图

https://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm    

    std::vector<std::vector<cv::Point>> roi_point;
    cv::findContours(roi_enlarged,roi_point,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
    std::vector<cv::Point> roi_point_approx;
    cv::Mat roi_approx(roi_enlarged.size(),CV_8UC3,cv::Scalar(0,0,0));
    auto i = roi_point.begin();
    approxPolyDP( *i, roi_point_approx, 7, 1 );
    for(auto a : roi_point_approx)
        cv::circle(roi_approx,a,2,cv::Scalar(0,0,255));
    
    cv::imshow("roi_approx",roi_approx);

原图

输出

不用findContours行不行?  我想说要是能自己提取最外层轮廓也好, 多花时间多写写函数呗

之前我想用adaptiveThreshold得到的轮廓直接来用,  但是后面发现从adaptiveThreshold中得到的是里外两层,

没有办法直接用

直接用成了这样

CV_CHAIN_APPROX_NONE改为CV_CHAIN_APPROX_SIMPLE也可以,

findContours中的几个参数解释在这里

判断是几边形去看roi_point_approx.size()就好了, 是几就是几边


    我对这样的结果并不是满意,  觉得通过这种方法忽略了很多点,   不那么精确, 

所以一直就想通过其他方法. 老实说我所需要的并不那么精确,  就当多学东西了, 结果这几天净瞎搞,  浪费不少时间, 心理还受挫


hough变换

    要使用hough变换,  首先得明确四边形的定义,  也就是说对四条边进行一定的限制. 

这个定义是由你自己决定的,  不是唯一的.下面是我的定义

1. 边的定义:  每条边最短为20

2. 相邻边的定义:  相邻两边不小于20度

3. 对边的定义:   对边倾斜角度不大于20度,  且距离最短的两点间距要大于20像素


要使用的函数就是houghLinesP,  通过上述定义(条件)将边数缩减到4. 难点在于如何理清这些线段的关系


    还有一种hough变换,  就是对点集求出最高的peak,  然后将peak对应直线在给定的距离内,  

将点进行删除、再hough,  循环四次,  便得到了需要的直线.  需要对hough函数进行修改, 且计算量较大.

 原图  

 输出

       代码传送门 :   我的github

之前总以为越是细分参数,  结果越精确,  然而后面发现,  得票最高的直线, 不一定是直观上最符合的直线, 

反而由于计算量大拖慢了程序,找错了直线.



再进一步的hough变换

    按照hough变换的原理,  检测一个四边形,  由于是四个角点,  所以应该是创建一个 八维的参数空间. 

这个花了我很长时间思考,  四边形的一般方程是什么?  很久都想不出来,  总是想往直线方程上面靠,  

结果还是不得不放弃.  想到它的计算量,  我就放心了,  光是 ρ的精度为0.2, theta 为1 度,程序就差不多运行了2秒, 搞不出来就搞不出来吧



    另外opencv还有个fitline函数, 我这里一直报错不能试验, 所以也不清楚是否能够使用

若能使用的话, 我觉得首先要对每个边进行标记(labeling),  因为最小二乘法本身没有对无关的点进行排除.

若是fitline有能够排除无关点的效果是最好,  没有的话,  要对每个边进行labeling不是那么容易,  

因为

1. edge基本上是破碎的, 是不相连的, 即便相连也有可能占到了两个边,  甚至可能整体被当作一个边.

即使用了某种方法得到完整四边形的edge,  边与边并不好区分

2. 四边形的四个顶点,  若是通过找极限位置,  有可能只能找到三个; 有些情况甚至极限位置可能也不是角点

3. 不知道有没有同学和我做过一样事情,  先想办法将edge连接成一个整体,  然后通过找角点进行打断. 然而,

对于某些极端的状况, 某条边上的"锯齿"被认为是个角点, 尽管可以调整参数让neighborhood大一些, 

但是消去了一些边,甚至可能消去整条边也不行,且没有普适的参数. 当然也可以把图像缩放至指定大小, 

然后用固定的参数检测角点, 但是总感觉不太稳妥.

我对labeling的理解不够, 但是没什么好办法这么直接告诉电脑说四条边分别是哪一条

关于line labeling 算法 

Huffman 1971; Clowes 1971; Waltz 1975; Rosenfeld, Hummel, and Zucker 1976; Kanade 1980

及一本教材 a guide tour of computer vision ,Nalwa 1993

 

http://www.cs.ubc.ca/~mack/Publications/AI73.pdf   这个是我随便找的  还没有看




RANSAC 

    本人写的 ransac函数, c++, 根据computer and machine vision写的

    仅供参考, 效率有待优化  ,    我的github : 传送门

    ransac比较符合人的视觉系统:  随机抽取两个点, 然后相对这两个点所确定的直线,  在给定距离之内的每个点

都算作一票,   票数最高的直线即为所求,  然后再将这些点删除.  如此循环四次,  便得到所求的四边形.

或者循环n次,  直至票数小于某阈值,即得到了所求的n边形.  或小于最大循环次数时,  得到随机取样最符合的直线.

  相较于霍夫变换,  这个计算量貌似小多了?  


寻找vanishing point

    vanishing point 在 Algorithms and applications这本书里的位置是255页4.3.3

很抱歉没有细看,   暂时不继续写了

这篇关于检测四边形(多边形)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1106908

相关文章

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注类别数:4 标注类别名称:["Platelets","RBC","WBC","sickle cell"] 每个类别标注的框数:

Temu官方宣导务必将所有的点位材料进行检测-RSL资质检测

关于饰品类产品合规问题宣导: 产品法规RSL要求 RSL测试是根据REACH法规及附录17的要求进行测试。REACH法规是欧洲一项重要的法规,其中包含许多对化学物质进行限制的规定和高度关注物质。 为了确保珠宝首饰的安全性,欧盟REACH法规规定,珠宝首饰上架各大电商平台前必须进行RSLReport(欧盟禁限用化学物质检测报告)资质认证,以确保产品不含对人体有害的化学物质。 RSL-铅,

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户

独立按键单击检测(延时消抖+定时器扫描)

目录 独立按键简介 按键抖动 模块接线 延时消抖 Key.h Key.c 定时器扫描按键代码 Key.h Key.c main.c 思考  MultiButton按键驱动 独立按键简介 ​ 轻触按键相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通与断开。  ​ 按键抖动 由于按键内部使用的是机