opencv —— convexHull 寻找并绘制凸包
凸包的定义:
包含点集 S 所有点的最小凸多边形称为凸包。
凸包绘制原理:Graham 扫描法
- 首先选择 y 方向上最低的点作为起始点 p0。
- 然后以 p0 为原点,建立极坐标系,做逆时针极坐标扫描,依次添加凸包点 p1,p2 ...pn(排序顺序根据极坐标角度大小)
- 若当前扫描点与下一个点构成的直线为逆时针转向,且转角 > 180°,则将该点添加到凸包点集合,否则忽略。

寻找凸包:convexHull 函数
void convexHull(InputArray points, OutputArray hull, bool clockwise = false, bool returnPoints = true);
- points,输入的二维点集,可以填 Mat 类型或者 vector。
- hull,输出参数,函数调用后找到的凸包。
- clockwise,操作方向标识符。当此标识符为 true 时,输出凸包为顺时针方向,否则为逆时针方向,默认为 false。并且假设坐标系的 x 轴指右,y 轴指上。
- returnPoints,当标志为真时,函数返回各凸包的各个点。否则返回凸包各点的指数。
代码示例:
#include<opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main(){
Mat src = imread("C:/Users/齐明洋/Desktop/1.jpg");
imshow("src", src);
Mat gray, bin_img;
cvtColor(src, gray, COLOR_BGR2GRAY);
medianBlur(gray, gray, );//中值滤波,去除椒盐噪声
imshow("gray", gray); //获得二值图像,canny 和 threshold 两种方法都可以
//Canny(gray, bin_img, 20, 40, 3);
threshold(gray, bin_img, , , THRESH_BINARY);
imshow("bin_img", bin_img); //获取轮廓
vector<vector<Point> >contours;
findContours(bin_img, contours, RETR_TREE, CHAIN_APPROX_NONE); //获取凸包
vector<vector<Point> >hull(contours.size());
Mat dst = Mat(src.size(), src.type());
for (int i = ; i < contours.size(); i++) {
convexHull(contours[i], hull[i]);
drawContours(dst, hull, i, Scalar(, , ), );
} imshow("dst", dst);
waitKey();
}
效果演示:

借鉴博客:https://blog.csdn.net/just_tree/article/details/89296985
opencv —— convexHull 寻找并绘制凸包的更多相关文章
- OpenCV入门之寻找图像的凸包(convex hull)
介绍 凸包(Convex Hull)是一个计算几何(图形学)中的概念,它的严格的数学定义为:在一个向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包. 在图像处理过程中,我们 ...
- opencv 6 图像轮廓与图像分割修复 1 查找并绘制轮廓 寻找物体的凸包
查找并绘制轮廓 寻找轮廓(findContours)函数 绘制轮廓(drawContours()函数) 基础实例程序:轮廓查找 #include <opencv2/opencv.hpp> ...
- 寻找物体的凸包 opencv
凸包的含义: 在二维平面上给定点集,凸包就是将最外层的点连接起来构成的凸多边形.并且这个凸多边形能包含点集中所有的点.OPENCV中: convexHull函数用于寻找图像点集中的凸包.它有六个输入参 ...
- 在OpenCV中利用鼠标绘制矩形和截取图像的矩形区域
这是两个相关的程序,前者是后者的基础.实际上前一个程序也是在前面博文的基础上做的修改,请参考<在OpenCV中利用鼠标绘制直线> .下面贴出代码. 程序之一,在OpenCV中利用鼠标绘制矩 ...
- opencv —— findContours、drawContours 寻找并绘制轮廓
轮廓图像与 Canny 图像的区别 一个轮廓一般对应一系列的点,也就是图像中的一条曲线.轮廓图像和 Canny 图像乍看起来表现几乎是一致的,但其实组成两者的数据结构差别很大: Canny 边缘图像是 ...
- OpenCV 学习笔记03 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数
凸形状内部的任意两点的连线都应该在形状里面. 1 道格拉斯-普克算法 Douglas-Peucker algorithm 这个算法在其他文章中讲述的非常详细,此处就详细撰述. 下图是引用维基百科的.ε ...
- opencv学习之路(24)、轮廓查找与绘制(三)——凸包
一.简介 二.绘制点集的凸包 #include<opencv2/opencv.hpp> using namespace cv; void main() { //---绘制点集的凸包 Mat ...
- 机器学习进阶-人脸关键点检测 1.dlib.get_frontal_face_detector(构建人脸框位置检测器) 2.dlib.shape_predictor(绘制人脸关键点检测器) 3.cv2.convexHull(获得凸包位置信息)
1.dlib.get_frontal_face_detector() # 获得人脸框位置的检测器, detector(gray, 1) gray表示灰度图, 2.dlib.shape_predict ...
- OpenCV——凸包
#include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespac ...
随机推荐
- 创建dynamics CRM client-side (五) - 使用regular expression (正则表达式)来检查phone number
我们这次要使用account, 让我们首先重建一个JavaScript. 建议每个entity都创建专属的js // Converting functions to Namespace Notatio ...
- 数据库中事务的ACID特性
数据库中事务的ACID特性 前言前面我们介绍过数据库中 带你了解数据库中JOIN的用法 与 带你了解数据库中group by的用法 的相关用法.本章节主要来介绍下数据库中一个非常重要的知识点事务,也是 ...
- laravel 操作多数据库总结
laravel 操作多数据库总结 读写分离 env配置 DB_CONNECTION=mysql DB_HOST=xxxxxx DB_PORT=xxx DB_DATABASE=xx DB_USERNAM ...
- 使用xpath总是找不到
今天使用使用xpath,直接从网页上复制的 /html/body/div[3]/div[2]/div[2]/div[3]/table/tbody/tr[2]/td[3]/a 但是在代码中总是找不到文件 ...
- cesium纽约3dtiles数据下载
cesium示例有纽约的3dtiles数据,下载官方有下载链接,但是下载后为乱码. 因此研究了下,写了个爬虫解码下载,使用办法,安装Python直接运行即可,代码如下: #coding=utf-8 f ...
- UNIX 版本
一般UNIX系统都来源于AT&T公司的System V UNIX系统,BSD UNIX或其他类UNIX系统. System V UNIX:当今市场上大多数主要的商业UNIX系统都是基于AT&a ...
- springboot mybatis 多数据源配置支持切换以及一些坑
一 添加每个数据源的config配置,单个直接默认,多个需要显示写出来 @Configuration @MapperScan(basePackages ="com.zhuzher.*.map ...
- js实现表单的提交
<form action="" method="post" name="form"> <tr> ...
- java工具类方法
1.生成16位数字(当时日期时间加随机两位数) public static String getNo16() { String getNo = getNo(); return getNo.substr ...
- C语言学习笔记--void
void真正发挥的作用在于: (1) 对函数返回的限定: (2) 对函数参数的限定. 先给一个例子 定义函数返回值 函数名(参数1,参数2,参数3,.......){内容}int sum(int a ...