9.1、点集的最小外包

点集是坐标点的集。

9.1.1、最小外包旋转矩形

//点集

Mat points = (Mat_(5, 2) << 1, 1, 5, 1, 1, 10, 5, 10, 2, 5);

//计算点集的最小外包旋转矩阵

RotatedRect rRect = minAreaRect(points);

//打印旋转矩形的信息

cout << "旋转矩形的角度" << rRect.angle << endl;

cout << "旋转矩形的中心" << rRect.center << endl;

cout << "旋转矩形的尺寸" << rRect.size << endl;

9.1.2、旋转矩形的四个顶点

OpenCV3新特性

void boxPoints(RotatedRect box,OutputArray points)

便于计算旋转矩形的四个顶点,这样就可以使用函数line画出四个顶点的连线,从而画出旋转矩形。

9.1.3、最小外包圆

void minEnclosingCircle( InputArray points,CV_OUT Point2f& center, CV_OUT float& radius );

9.1.4、最小外包直立矩形

Rect boundingRect( InputArray points );

9.1.5、最小凸包

凸包是将最外层的点连接起来构成的凸多边形,它能包含点集的所有点。

void convexHull( InputArray points, OutputArray hull,

bool clockwise = false, bool returnPoints = true );

利用该函数求出的凸包,坐标点的顺序不是随机排列的,而是按照某顺序排列的,也就是把这些点依次相连就可以得到连线。

9.1.6、最小外包三角形

OpenCV3新特性

double minEnclosingTriangle( InputArray points, CV_OUT OutputArray triangle );

//5行2列的单通道Mat

Mat point = (Mat_(5, 2) << 1, 1, 5, 1, 1, 10, 5, 10, 2, 5);

//转换为双通道矩阵

point = point.reshape(2, 5);

//存储三角形的三个顶点

vector triangle;

//点集的最小外包三角形

double area;

area = minEnclosingTriangle(point, triangle);

//打印结果

cout << "三角形的三个顶点";

for (int i = 0; i < 3; i++)

{

cout << triangle[i] << ",";

}

cout << "面积" << area << endl;

9.2、霍夫直线检测

如果知道原点到一条直线的代数距离ρ和与x轴的夹角θ,则直线方程可由以下方式表示:

image.png

当然, 反过来也可以, 如果知道平面内的一条直线, 那么可以计算出唯一的ρ和θ, 即xoy平面内的任意一条直线对应参数空间(或称霍夫空间) θoρ中的一点(ρ, θ) 。

image.png

image.png

Hough直线检测的基本原理在于利用点与线的对偶性。霍夫变换运用两个坐标空间之间的变换,将在一个空间中具有相同形状的曲线或直线映射到另一个坐标空间的一个点上形成峰值,从而把检测任意形状的问题转化为统计峰值问题。

结论:判断xoy平面内哪些点是共线的,首先求出每一个点对应到霍夫空间的曲线,然后判断哪几条曲线相交于一点,最后将相交于一点的曲线反过来对应到xoy平面内的点,这些点是共线的。

在理论上,一个点对应无数条直线或者说任意方向的直线(在参数空间中坐标轴表示的斜率k或者说θ有无数个),但在实际应用中,我们必须限定直线的数量(即有限数量的方向)才能够进行计算。

因此,我们将直线的方向θ离散化为有限个等间距的离散值,参数ρ也就对应离散化为有限个值,于是参数空间不再是连续的,而是被离散量化为一个个等大小网格单元。将图像空间(直角坐标系)中每个像素点坐标值变换到参数空间(极坐标系)后,所得值会落在某个网格内,使该网格单元的累加计数器加1。当图像空间中所有的像素都经过霍夫变换后,对网格单元进行检查,累加计数值最大的网格,其坐标值(ρ0, θ0)就对应图像空间中所求的直线。

如下图解

image.png

总结:使用霍夫变换检测直线具体步骤:

1.彩色图像->灰度图

2.去噪(高斯核)

3.边缘提取(梯度算子、拉普拉斯算子、canny、sobel)

4.二值化(判断此处是否为边缘点,就看灰度值==255)

5.映射到霍夫空间(准备两个容器,一个用来展示hough-space概况,一个数组hough-space用来储存voting的值,因为投票过程往往有某个极大值超过阈值,多达几千,不能直接用灰度图来记录投票信息)

6.取局部极大值,设定阈值,过滤干扰直线

7.绘制直线、标定角点

优点:Hough直线检测的优点是抗干扰能力强,对图像中直线的殘缺部分、噪声以及其它共存的非直线结构不敏感,能容忍特征边界描述中的间隙,并且相对不受图像噪声的影响

缺点:Hough变换算法的特点导致其时间复杂度和空间复杂度都很高,并且在检测过程中只能确定直线方向,丢失了线段的长度信息。由于霍夫检测过程中进行了离散化,因此检测精度受参数离散间隔制约

OpenCV支持三种霍夫直线检测算法:

1)Standard Hough Transform(SHT,标准霍夫变换)

2)Multiscale Hough Transform(MSHT,多尺度霍夫变换)

3)Progressive Probability Houth Transform(PPHT,渐进概率式霍夫变换)

在OpenCV3.0及以上版本中,霍夫直线检测算法定义了两个函数:HoughLines(1、2)、HoughLinesP(3)

CV_EXPORTS_W void HoughLines( InputArray image, OutputArray lines,

double rho, double theta, int threshold,

double srn = 0, double stn = 0,

double min_theta = 0, double max_theta = CV_PI );

//InputArray image:输入图像,必须是8位单通道图像。

//OutputArray lines:检测到的线条参数集合。

//double rho:以像素为单位的距离步长。

//double theta:以弧度为单位的角度步长。

//int threshold:累加计数值的阈值参数,当参数空间某个交点的累加计数的值超过该阈值,则认为该交点对应了图像空间的一条直线。

//double srn:默认值为0,用于在多尺度霍夫变换中作为参数rho的除数,rho=rho/srn。

//double stn:默认值为0,用于在多尺度霍夫变换中作为参数theta的除数,theta=theta/stn。

//如果srn和stn同时为0,就表示HoughLines函数执行标准霍夫变换,否则就是执行多尺度霍夫变换。

CV_EXPORTS_W void HoughLinesP( InputArray image, OutputArray lines,

double rho, double theta, int threshold,

double minLineLength = 0, double maxLineGap = 0 );

//InputArray image:输入图像,必须是8位单通道图像。

//OutputArray lines:检测到的线条参数集合。

//double rho:直线搜索时的距离步长,以像素为单位。

//double theta:直线搜索时的角度步长,以弧度为单位。

//int threshold:累加计数值的阈值参数,当参数空间某个交点的累加计数的值超过该阈值,则认为该交点对应了图像空间的一条直线。

//double minLineLength:默认值为0,表示最小线段长度阈值(像素)。

//double maxLineGap:线段上最近两点之间的阈值.默认值为0,表示直线断裂的最大间隔距离阈值。即如果有两条线段是在一条直线上,但它们之间有间隙,那么如果这个间隔距离小于该值,则被认为是一条线段,否则认为是两条线段。

注意:霍夫直线变换是一种用来在图像空间寻找直线的方法,输入图像要求是二值图像,同时为了提高检测直线的效率和准确率,在使用霍夫线变换之前,最好对图像进行边缘检测生成边缘二值图像,这样的检测效果是最好的。

9.3、霍夫圆检测

9.3.2、标准霍夫圆检测

与霍夫直线检测类似, 图像的霍夫圆检测就是检测哪些前景或边缘像素点在同一个 圆上, 并给出对应圆的圆心坐标及圆的半径; 而且仍然需要计数器来完成该过程, 只是 这里的计数器从二维变成了三维。

9.3.2、基于梯度的霍夫圆检测

步骤:首先定位圆心(两个参数),然后计算半径 (一个参数)。在代码实现中,首先构造一个二维计数器,然后再构造一个一维计数器。

OpenCV提供的函数HoughCircles实现了基于梯度的霍夫圆检测, 在该函数的实现过 程中, 使用了Sobel算子且内部实现了边缘的二值图, 所以输入的图像不用像函数 HoughLinesP和HoughLines一样必须是二值图。

CV_EXPORTS_W void HoughCircles( InputArray image, OutputArray circles,

int method, double dp, double minDist,

double param1 = 100, double param2 = 100,

int minRadius = 0, int maxRadius = 0 );

缺点是在不知道一些先验知识的情况下, 需要多次调整参数才有可能得到我们想要的结果。

对于霍夫变换不限于对直线、圆进行检测,也可以对椭圆等其他几何形状进行拟合。同时从原理中可以看出,霍夫变换的一个较大的优点就是可以检测出部分或者遮挡的直线和圆,当然其他几何形状也可以。

9.4、轮廓

9.4.1、查找、拟制轮廓

轮廓:有序点集

CV_EXPORTS_W void findContours( InputOutputArray image, OutputArrayOfArrays contours,

OutputArray hierarchy, int mode,

int method, Point offset = Point());

CV_EXPORTS_W void drawContours( InputOutputArray image, InputArrayOfArrays contours,

int contourIdx, const Scalar& color,

int thickness = 1, int lineType = LINE_8,

InputArray hierarchy = noArray(),

int maxLevel = INT_MAX, Point offset = Point() );

9.4.2、外包、拟合轮廓

介绍了寻找图像中轮廓的方法和点集的拟合, 那么这两部分合起来, 就可以处理图像目标的定位问题了 。

第一步: 对图像边缘检测或者阈值分割得到二值图,有时也需要对这些二值图进行形态学处理。

第二步: 利用函数findContours寻找二值图中的多个轮廓。

第三步: 对于通过第二步得到的多个轮廓,其中每一个轮廓都可以作为函数 convexHull、minAreaRect等的输入参数,然后就可以拟合出包含这个轮廓的最小凸包、最小旋转矩形等。

Mat img = imread("Koala.jpg", IMREAD_GRAYSCALE);

//step1:边缘检测,得到边缘二值图

GaussianBlur(img, img, Size(3, 3), 0.5);

Mat binaryImg;

Canny(img, binaryImg, 50, 200);

//step2:边缘的轮廓

vector> contours;

findContours(binaryImg, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);

//step3:对每一个轮廓进行拟合

for (int i = 0; i < contours.size(); i++)

{

Rect rect = boundingRect(contours[i]);

if (rect.area() > 500)

{

rectangle(img, rect, Scalar(255));

}

}

9.4.3、轮廓的周长和面积

用来计算点集所围区域的周长:

参数closed是指点集是否首尾相接。

CV_EXPORTS_W double arcLength( InputArray curve, bool closed );

用来计算点集所围区域的面积

CV_EXPORTS_W double contourArea( InputArray contour, bool oriented = false );

9.4.4、点和轮廓的位置关系

点集可以围成一个封闭的轮廓, 那么空间中任意一点和这个轮廓无非有三种关系: 点在轮廓外、 点在轮廓上、 点在轮廓内。

CV_EXPORTS_W double pointPolygonTest( InputArray contour, Point2f pt, bool measureDist );

注:measureDist是bool类型,当其值为false时,函数pointPolygonTest的返回值有三种, 即+1、0、-1, +1代表pt在点集围成的轮廓内,0代表pt在点集围成的轮廓上,-1代表pt在点集围成的轮廓外;当其值为true时,则返回值为pt到轮廓的实际距离。

9.4.5、轮廓的凸包缺陷

用来衡量凸包的缺陷:

void convexityDefects( InputArray contour, InputArray convexhull, OutputArray convexityDefects );

convexityDefects代表返回的凸包缺陷的信息,形式为vector< Vec4i>,每一个Vec4i代表一个缺陷,它的四个元素依次代表:缺陷的起点、终点、最远点的索引及最远点到凸包的距离。

对凸包的缺陷检测在判断物体形状等方面发挥着很重要的作用,与凸包缺陷类似的还有如矩形度、椭圆度、 圆度等,它们均是衡量目标物体形态的度量。

opencv图片矩形网格边线_OpenCV C++(九)----几何形状的检测和拟合相关推荐

  1. opencv图片矩形网格边线_图像算法在数值计算中的应用(1):Canny边缘检测算法...

    引言 有限差分方法(FDM)是计算机数值模拟最早采用的方法,至今仍在广泛应用.该方法将求解域划分为差分网格,用有限个网格节点代替连续的求解域.在直角坐标系下,求解域差分网格通常为均匀的矩形,在表达非矩 ...

  2. opencv 图片边缘渐变_opencv滤镜-PS羽化特效

    羽化特效羽化是ps术语,羽化原理是令选区内外衔接部分虚化,起到渐变的作用从而达到自然衔接的效果,是ps及其其它版本中的处理图片的重要工具.羽化可使像素选区的边缘变得模糊,有助于所选区域与周围的像素混合 ...

  3. opencv 图片边缘渐变_OpenCV——颜色均匀渐变

    参考来源: // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #inclu ...

  4. JAVA几何图注水,如何使用java绘制几何形状到图片?

    在Java语言编程中,如何使用Java绘制几何形状到图片? 注意:需要访问网址: , 下载一个OpenCV软件包.这里下载最新版本:opencv-3.2.0-vc14.exe并解压此文件到D:soft ...

  5. OpenCV绘制线、矩形、圆等基本几何形状

    OpenCV绘制线.矩形.圆.椭圆等基本几何形状 画线 画矩形 画圆 通过javaOpenCV中的Imgproc函数进行简单几何图形的绘制 画线 代码 public class DemoMat {st ...

  6. OpenCV中BLOB特征提取与几何形状分类

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 一.方法 二值图像几何形状提取与分离,是机器视觉中重点之一,在CT ...

  7. opencv图片线性混合可调

    opencv图片线性混合叠加.addWeighted()函数 直接上效果图 通过滚动条选择不同的透明值,使得两张图片进行不同程度的线性混合. 主要的代码是这句:addWeighted()函数 //根据 ...

  8. 2020-12-03 Python OpenCV: 图片的裁剪

    Python OpenCV: 图片的裁剪 图片裁剪使用img[y0:y1, x0:x1],其中参数分别代表y轴和x轴的起始坐标,具体使用方法如下: import cv2img = cv2.imread ...

  9. opencv 检测几何图形_使用OpenCV + ConvNets检测几何形状

    opencv 检测几何图形 A simple yet powerful pipeline for detecting shapes in scanned documents 一个简单而强大的管道,用于 ...

最新文章

  1. 现在的编译器还需要手动展开循环吗_性能 - 如果有的话,循环展开仍然有用吗?...
  2. matlab plot3d_号称轻量级MATLAB的数学工具—Maple 2019.2
  3. GitHub趋势榜第一:超强PyTorch目标检测库Detectron2,训练更快,支持更多任务
  4. 防范SQL指令植入式***
  5. python中df head_10招!看骨灰级Pythoner如何玩转Python
  6. Jenkins 流水线 获取git 分支列表_使用Jenkins Git参数实现分支标签动态选择
  7. 数据结构讲义代码堆和栈、多线程、多进程、网络编程
  8. python示例_带有示例的Python功能指南
  9. 华为P7解锁码申请及解锁详细教程
  10. discuz template 模板文件说明
  11. linux tcp 113错误,linux系统报tcp_mark_head_lost错误的处理方法
  12. 深入理解WKWebView白屏
  13. ARPU与ARPPU 的概念
  14. 「项目进度管理」如何编制有效的进度计划?
  15. 超分辨论文阅读笔记:Non-local
  16. Classical Algorithm--Mobius反演
  17. 怎么设置服务器文件夹多权限管理,如何设置共享文件夹,小编告诉你如何设置共享文件夹权限...
  18. 安卓callkit_苹果Callkit国内被叫停:无需解锁即可接听网络电话 曾在微信短暂“现身”...
  19. 艺术家孙溟㠭艺术之路
  20. 解决外置声卡配套StudioOne机架卡顿杂音问题

热门文章

  1. 康乐忆享|志愿者心得精选——吕泖霖
  2. 网络营销VS传统营销有什么区别?
  3. Google Python Style Guide(谷歌python规范指南)
  4. 由猴子选王(约瑟夫环)展开来(数组与链表)
  5. java程序对学生成绩_Eclipse+Java+Swing实现学生成绩管理系统的实例代码
  6. MODELS,ORM
  7. python中字符串查找子串_Python字符串中查找子串的方法
  8. LED背光板应该更注重“性价比”吗?
  9. 单片机毕设 STM32 wifi照明控制系统 - 智能路灯(毕设分享)
  10. 初步学习C#网络编程