opencv —— convexHull 寻找并绘制凸包

凸包的定义:

包含点集 S 所有点的最小凸多边形称为凸包。

凸包绘制原理:Graham 扫描法

  • 首先选择 y 方向上最低的点作为起始点 p0
  • 然后以 p0 为原点,建立极坐标系,做逆时针极坐标扫描,依次添加凸包点 p1,p2 ...pn(排序顺序根据极坐标角度大小)
  • 若当前扫描点与下一个点构成的直线为逆时针转向,则将该点添加到凸包点集合,否则忽略。

寻找凸包: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, 3);//中值滤波,去除椒盐噪声
    imshow("gray", gray);

    //获得二值图像,canny 和 threshold 两种方法都可以
    //Canny(gray, bin_img, 20, 40, 3);
    threshold(gray, bin_img, 80, 255, 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 = 0; i < contours.size(); i++) {
        convexHull(contours[i], hull[i]);
        drawContours(dst, hull, i, Scalar(0, 0, 255), 1);
    }

    imshow("dst", dst);
    waitKey(0);
}

效果演示:

借鉴博客:https://blog.csdn.net/just_tree/article/details/89296985

原文地址:https://www.cnblogs.com/bjxqmy/p/12344543.html

时间: 2024-10-14 20:11:09

opencv —— convexHull 寻找并绘制凸包的相关文章

OpenCV入门之寻找图像的凸包(convex hull)

介绍   凸包(Convex Hull)是一个计算几何(图形学)中的概念,它的严格的数学定义为:在一个向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包.  在图像处理过程中,我们常常需要寻找图像中包围某个物体的凸包.凸包跟多边形逼近很像,只不过它是包围物体最外层的一个凸集,这个凸集是所有能包围这个物体的凸集的交集.如下图所示: 在上图中,绿色线条所包围的凸集即为白色图形的凸包.  在opencv中,通过函数convexHulll能很容易的得到一系列点的凸包,比如由点组成的轮廓

opencv笔记(二十三)——寻找以及绘制一幅图像的轮廓

我们常常需要对一幅图像做轮廓的查找,尤其是在做物体的检测与识别的时候. 一般的步骤就是先使用canny方法来得到一幅图像的边缘情况.然后使用findContours方法来得到边缘图像的轮廓.最后使用drawContours方法来绘制轮廓. canny我们都很清楚它的使用方法了. 这里简单地说一下findContours和drawContours void findContours(InputOutputArray image, OutputArrayOfArrays contours, Outp

OpenCV基础(五)---图形绘制

图形绘制 OpenCV提供了直线,矩形,圆,椭圆的绘制函数,下面介绍用法 直线绘制:line() 函数原型: void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0); 参数声明: InputOutputArray img:输出图像 Point pt1:线段的第一个点 Point pt2:线段

opencv —— 基本图形的绘制

线段:line 函数 void line(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineT ype=8, int shift=0); img: 要绘制线段的图像. pt1: 线段的起点. pt2: 线段的终点. color: 线段的颜色,通过一个 Scalar 对象定义. thickness: 线条的宽度,默认值为 1. lineType: 线段的类型.可以取值 8,4,和CV_A

opencv —— minMaxLoc 寻找图像全局最大最小值

寻找最值:minMaxLoc 函数 minMaxLoc 函数的作用是在数组中找到全局最小和最大值. void minMaxLoc(InputArray src, double* minVal, double* maxVal = 0, Point* minLoc = 0, Point* maxLoc = 0, InputArray mask = noArray()); src,输入的数组,若是图像,需为单通道图像. minVal,返回最小值的指针.若无需返回,此值设为 NULL. maxVal,返

Opencv 如何寻找直线?

void findLine(const std::string file,std::double_t min_distance_value = 100.0) { //https://github.com/opencv/opencv/blob/master/modules/imgproc/src/lsd.cpp auto lsd = cv::createLineSegmentDetector( cv::LSD_REFINE_NONE ); auto img = cv::imread(file,cv

OpenCV——直方图计算、绘制和对比匹配

原文地址:https://www.cnblogs.com/long5683/p/9692885.html

25、【opencv入门】轮廓查找与绘制(3)——凸包

一简介 1.凸包 凸包(Convex Hull)是一个计算机几何图形学中的概念, 简单来说, 给定二维平面点集, 凸包就是能够将最外层的点连接起来构成的凸多边形, 它能够包含点集中所有的点.物体的凸包检测场应用在物体识别.手势识别及边界检测等领域. A-H是被标出的凸包缺陷 2.寻找凸包---convexHull() 1 CV_EXPORTS_W void convexHull(InputArray points, OutputArray hull, bool clockwise=false,

opencv学习之路(24)、轮廓查找与绘制(三)——凸包

一.简介 二.绘制点集的凸包 1 #include<opencv2/opencv.hpp> 2 using namespace cv; 3 4 void main() 5 { 6 //---绘制点集的凸包 7 Mat img(400, 400, CV_8UC3, Scalar::all(0)); //定义绘制图像 8 RNG rng; //定义随机数对象 9 while(1) 10 { 11 char key; 12 int count = (unsigned int)rng % 100; /