凸包的定义:

包含点集 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

最新文章

  1. 旧版本APP被开发人员下架,新版本重新上传依然显示被下架
  2. jQuery插件库代码分享 - 进阶者系列 - 学习者系列文章
  3. 移动apache访问日志后如何立即生效
  4. Sum All Primes
  5. NPOI2.0学习(一)
  6. CLR via C#(09)-扩展方法
  7. zookeeper源码分析(一) 工作原理
  8. Struts2请求参数校验
  9. 随机数生成器console
  10. Cheap CK100 1024 tokens NXP FIX Chip on Eobd2
  11. IOS Xmpp 创建固定房间
  12. 基于visual Studio2013解决算法导论之028散列表开放寻址
  13. EEPlat的元数据驱动的运行引擎
  14. Activemq 宕机解决方案
  15. [[NSBundle mainBundle] pathForResource:fileName ofType:]获取文件路径不成功
  16. 洛谷P3268 [JLOI2016]圆的异或并(扫描线)
  17. OpenMP并行程序设计——for循环并行化详解
  18. Facebook 50%用户是虚假账号?我觉得可以更高!
  19. 瀑布流之ajax
  20. CentOS 7.0 Firewall防火墙配置

热门文章

  1. 创建一个区域(Creating an Area) |使用区域 | 高级路由特性 | 精通ASP-NET-MVC-5-弗瑞曼
  2. Docker(二) 镜像
  3. Maven: 每次更新Maven Project ,JAVA 版本都变为1.5
  4. springmvc html与jsp解析器
  5. 暑假第四周总结(HDFS编程实践,安装HBASE)
  6. Django自动化测试平台项目案例
  7. C++ STL IO流 与 Unicode (UTF-16 UTF-8) 的协同工作
  8. Serverless 的资源评估与成本探索
  9. 快速理解YOLO目标检测
  10. avtivity与view