定义

给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型。
理解物体形状或轮廓的一 种比较有用的方法便是计算一个物体的凸包,然后计算其凸缺陷(convexity defects)。

检测凸包

opencv自带函数:convexHull()

参数解释:

示例1:检测随机点群的凸包(只有一个凸包)

代码以及注释:

#include <opencv2/opencv.hpp>
#include <iostream>
#include "windows.h"
#include <stdio.h>
#include <time.h>using namespace cv;
using namespace std;//===========================凸包检测基础====================
//先随机生成3~103个坐标值随机的彩色点,然后利用convexHull,对链接起来的图形求凸包
int main()
{Mat image(600, 600, CV_8UC3);//RNG& rng = theRNG();       //返回一个当前线程的随机数生成器       RNG类可以产生多种类型的随机数,故使用时需要指定是哪种类型的RNG rng((unsigned)time(NULL));        //这样每次重新运行会产生不一样的随机数while (1){//参数初始化char key;int count = (unsigned)rng % 100 + 3;    //随机生成点的数量vector<Point> points;       //点值//随机生成点坐标for (int i = 0;i < count;i++){Point point;point.x = rng.uniform(image.cols / 4, image.cols * 3 / 4);point.y = rng.uniform(image.rows / 4, image.rows * 3 / 4);points.push_back(point);         //将此时生成的点数据送入   points数组的最后一个}//检测凸包(这里认为凸包只有一个)vector<int> hull;       //存储一个凸包的边的一维数组 convexHull(Mat(points),hull,true);//输入二维点集,输出找到的凸包//绘制出随机颜色的点image = Scalar::all(0);        //背景for (int i = 0;i < count;i++){circle(image,points[i],3,Scalar(rng.uniform(0,255), rng.uniform(0, 255), rng.uniform(0, 255)),FILLED,LINE_AA);}//准备参数int hullcount = (int)hull.size();     //凸包的边数(因为只有一个凸包,而凸包是由边构成的序列,所以返回序列长度,应该返回的是边的个数)Point point0 = points[hull[hullcount - 1]];      //连接凸包边的坐标点     最后一条边的坐标点//绘制凸包的边for (int i = 0;i < hullcount;i++){Point point = points[hull[i]];        //points[hull[i]]表示构成凸包边的某点(因为凸包是一个点集合最外面的点连接起来的区域)line(image, point0, point, Scalar(255, 255, 255), 2, LINE_AA);point0 = point;}//显示效果图imshow("凸包检测示例",image);//按下ESC程序退出//key = (char)waitKey();//if (key == 27) break;waitKey(1000);     //每秒显示一次}return 0;
}

演示效果:

示例2:动态检测并绘制轮廓和凸包(一个轮廓对应一个凸包)

//===========================动态检测绘制图形的轮廓和凸包====================//=================全局变量声明=================
Mat g_srcImage;
Mat g_grayImage;
int g_nThresh = 50;
int g_nThresh_max = 255;
RNG g_rng(12345);
Mat srcImage_copy = g_srcImage.clone();
Mat g_thresholdMat_output;
vector<vector<Point>> g_vContours;
vector<Vec4i> g_vHierarchy;//=============全局函数声明===============
void on_ThreshChange(int,void*);
int main()
{// Read image 读取图像SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);       //字体为绿色//载入原图g_srcImage = imread("D:\\opencv_picture_test\\lena.jpg",1);//Mat srcImage = imread("D:\\opencv_picture_test\\形态学操作\\孔洞.png", 0); //读取灰度图//转换成灰度并且模糊化降噪cvtColor(g_srcImage, g_grayImage, COLOR_BGR2GRAY);blur(g_grayImage, g_grayImage, Size(3, 3));//创建窗口namedWindow("原始图窗口", WINDOW_AUTOSIZE);imshow("原始图窗口", g_srcImage);//创建滑动条并初始化createTrackbar("阈值", "原始图窗口", &g_nThresh,g_nThresh_max, on_ThreshChange);on_ThreshChange(0,0);waitKey(0);return 0;
}
void on_ThreshChange(int, void*)
{//用Canny算子检测边缘Canny(g_grayImage, g_thresholdMat_output, g_nThresh, g_nThresh * 2, 3);//寻找轮廓.findContours(g_thresholdMat_output, g_vContours, g_vHierarchy,RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));//遍历每个轮廓,寻找其凸包vector<vector<Point> > hull( g_vContours.size());      //轮廓、凸包、点,构成三维数组 凸包的数组的大小等于轮廓的大小for (unsigned int i = 0;i<g_vContours.size();i++){convexHull(Mat (g_vContours[i]), hull[i],false);     //在轮廓数组中寻找凸包,存入对应的hull中}//绘出轮廓及其凸包Mat drawing = Mat::zeros(g_thresholdMat_output.size(), CV_8UC3);for (int i = 0; i < g_vContours.size(); i++){Scalar color = Scalar(g_rng.uniform(0, 255),g_rng.uniform(0, 255), g_rng.uniform(0, 255));//任意值//绘制轮廓drawContours(drawing, g_vContours, i, color, 1, 8, g_vHierarchy,0, Point());//绘制凸包drawContours(drawing, hull, i, color, 1, 8, g_vHierarchy,0, Point());}//显示效果图imshow("效果图",drawing);
}

演示效果:
1、仅绘制凸包:

2、仅绘制轮廓:

3、既绘制轮廓也绘制凸包:

更加凸显出轮廓与凸包的关系。
总结:
学到的凸包知识点:检测并绘制凸包;轮廓、凸包、凸包连接点的结构关系。
学到的c++语法知识点:随机数生成器RNG的用法;vector的push_back()操作。

参考链接:
C++RNG类与毛星云寻找凸包例程的理解
C++ push方法与push_back方法

Opencv——查找并绘制凸包、凸包与轮廓的关系相关推荐

  1. opencv 查找并绘制轮廓

    一个轮廓一般对应一系列的点, 也就是图像中的一条曲线.其表示方法可能根据不同的情况而有所不同. 在opencv中可以用findContours()函数从二值图像查找轮廓 findContours()函 ...

  2. python使用opencv查找轮廓_(八)OpenCV-Python学习—轮廓查找,绘制和拟合

    针对物体轮廓,opencv还提供了一些相关的函数,来处理轮廓查找,绘制,拟合,以及计算轮廓周长和面积等,详细介绍如下: 1. 寻找和绘制轮廓 opencv的findContours()能寻找图片中的轮 ...

  3. 【OpenCV 】计算物体的凸包/创建包围轮廓的矩形和圆形边界框/createTrackbar添加滑动条/

    目录 topic 1:模板匹配 topic 2:图像中寻找轮廓 topic 3:计算物体的凸包 topic 4:轮廓创建可倾斜的边界框和椭圆¶ topic 5:轮廓矩¶ topic 6:为程序界面添加 ...

  4. OpenCV学习笔记(十七):查找并绘制轮廓:findContours(),drawContours(),approxPolyDP()

    OpenCV学习笔记(十七):查找并绘制轮廓:findContours() 1.findContours() 函数 该函数使用Suzuki85算法从二值图像中检索轮廓.轮廓线是一种用于形状分析.目标检 ...

  5. 毛星云opencv之8.4.4查找和绘制图像轮廓矩

    #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #i ...

  6. Python机器视觉--OpenCV进阶(核心)--图像轮廓查找识别,绘制图像轮廓与图像轮廓的面积周长计算

    1.图像轮廓查找识别与绘制图像轮廓 1.1 什么是图像轮廓 图像轮廓是具有相同颜色或灰度的连续点的曲线. 轮廓在形状分析和物体的检测和识别中很有用. 轮廓的作用: 用于图形分析 物体的识别和检测 注意 ...

  7. imutils基础(7)使用 OpenCV 查找轮廓中的极值点

    今天,我将使用 OpenCV 和 Python 根据轮廓查找极值点. 在本博客的其余部分,我将演示如何根据轮廓找到极北.极南.极东和极西 (x, y) 坐标,如本博文顶部的图像所示. 虽然这项技能本身 ...

  8. 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(一)查找并绘制轮廓

    第8章 图像轮廓与图像分割修复 8.1 查找并绘制轮廓 8.1.1 寻找轮廓:findContours()函数 1.作用:在二值图像中寻找轮廓 2.函数原型: void findcontours(In ...

  9. python使用opencv查找轮廓_Python+opencv学习记录20:轮廓发现,Pythonopencv

    1.轮廓发现 轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果. 1.1发现轮廓 在此步骤中我们会使用到findContours这个API,其原型为: ...

最新文章

  1. CentOS 7 中 Systemd详解
  2. 增强CNN学习能力的Backbone:CSPNet
  3. secureCrt开启oracle
  4. JVM:JVM内存划分、主内存、工作内存
  5. java占位符打印_java简单日志打印规范小记
  6. linux安装mysql5.7.18_Linux下安装mysql5.7.18版本步骤
  7. leetcode 40. 组合总和 II 思考分析
  8. 2019技术学习规划
  9. 对象数组与普通数组 java 0913
  10. 电话拨号器java_Android基础--电话拨号器
  11. 艰苦的编译boost python (失败)
  12. boost::filesystem使用手册
  13. C语言使用scanf_s函数输入的正确姿势
  14. ios零基础学习 准备什么,如何去学习
  15. Right-BICEP测试四则运算2
  16. python概率计算,python简单脚本之概率计算
  17. (2020版) 墙裂推荐这十款精选 IntelliJ Idea 插件
  18. 可跨页字符串:使用Spans设置文本样式
  19. i春秋公益赛WriteUp-MISC套娃
  20. com.android.gms是什么,com.google.android.gms.cast的用途是什么?

热门文章

  1. All your files have been encrypted
  2. oracle日志文件大小规则,修改oracle日志文件大小
  3. java sort 第二个参数_详解java Collections.sort的两种用法
  4. centos-7.2 node.js免编译安装
  5. Day47 Django基础部分、路由配置、空间名称
  6. Linux ifconfig 配置网络接口
  7. 【转】phpize学习
  8. Git push 时每次都需要密码的疑惑
  9. linux find prune排除某目录或文件
  10. 拉拢中小网站 淘宝百度暗战升级...