精华内容
下载资源
问答
  • opencv 凸包

    千次阅读 2018-04-03 10:09:48
    一、话说凸包凸包(Convex Hull)是一个计算几何(图形学)中常见的概念。简单来说,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它是能包含点集中所有点的。理解物体形状或轮廓的一种比较...

    一、话说凸包

    凸包(Convex Hull)是一个计算几何(图形学)中常见的概念。简单来说,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它是能包含点集中所有点的。理解物体形状或轮廓的一种比较有用的方法便是计算一个物体的凸包,然后计算其凸缺陷(convexity defects)。
    二、处理凸包的一般步骤
    • 预处理
    • 获取轮廓
    • 调用函数获得凸包
    • 画出凸包(可选),计算凸缺陷(可选)

    关于凸包,在OpenCV中有两个常用的函数:convexHull和convexityDefects,下面我们分别讲解。

    convexHull:根据轮廓计算凸包,当需要绘制凸包时可配合函数polylines使用。函数原型:

    hull=cv2.convexHull(points[, hull[, clockwise[, returnPoints]]])
    
    • hull:凸包
    • points:点的集合,若要处理轮廓则该参数为对应的轮廓变量
    • clockwise:操作方向标识符,为True时,输出的凸包为顺时针方向,否则为逆时针方向
    • returnPoints:hull参数的返回形式,若为True则hull返回点坐标的形式,若为False则返回对应点的索引值
    实验代码:
    	Mat srcImage = imread("D:\\cv_study\\随机练\\duola.jpg");
    	Mat gray,hull;
    	cvtColor(srcImage, gray, CV_BGR2GRAY);
    	threshold(gray, gray, 100, 255, THRESH_BINARY);
    	vector<vector<Point>>contours;
    	vector<Vec4i>h;
    	findContours(gray, contours, h, RETR_TREE, CHAIN_APPROX_SIMPLE);
    	Rect rect = boundingRect(contours[1]);
    	rectangle(srcImage, rect, Scalar(255, 0, 0), 3, 8);
    	convexHull(contours[1], hull);
    	polylines(srcImage, hull,1,Scalar(0,255,0),3);
    三、凸包的其他操作

    3.1函数pointPolygonTest:计算某点与轮廓的相对位置关系,又叫多边形测试。函数原型:

    retval=cv2.pointPolygonTest(contour, pt, measureDist)
    
    • contour:轮廓信息
    • pt:某点的坐标
    • measureDist:当设为True时,返回值返回某点到轮廓的距离,设为False时返回0,1或-1
    • retval:当某点位于轮廓内时返回一个正值,在轮廓外返回一个负值,在轮廓上返回0。例如当measureDist设为False时返回0(在轮廓上)、1(在轮廓里)或-1(在轮廓外)

    3.2函数matchShapes:计算形状或轮廓的匹配程度,返回值越小,说明相似度越高。函数原型:

    retval=cv2.matchShapes(contour1, contour2, method, parameter)
    
    • contour1和contour2:需要对比的两个轮廓
    • method:匹配方法,可查阅API
    • parameter:默认值为0

    3.3函数contourArea:计算轮廓面积

    retval=cv2.contourArea(contour[, oriented])
    
    • retval:返回的面积值
    • contour:轮廓变量
    • oriented:若为True,返回一个带符号的面积值,正负取决于轮廓的方向,若为False,则返回一个无符号的面积值










    展开全文
  • OpenCV 凸包Convex Hull

    2021-04-20 19:35:02
    OpenCV 凸包Convex Hull凸包Convex Hull目标代码结果 凸包Convex Hull 目标 在本教程中,您将学习如何: 使用OpenCV函数cv :: convexHull 代码 #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.hpp" #...

    OpenCV 凸包Convex Hull

    凸包Convex Hull

    目标

    在本教程中,您将学习如何:
    使用OpenCV函数cv :: convexHull

    代码

    #include "opencv2/imgcodecs.hpp"
    #include "opencv2/highgui.hpp"
    #include "opencv2/imgproc.hpp"
    #include <iostream>
    using namespace cv;
    using namespace std;
    Mat src_gray;
    int thresh = 100;
    RNG rng(12345);
    void thresh_callback(int, void* );
    int main( int argc, char** argv )
    {
        CommandLineParser parser( argc, argv, "{@input | stuff.jpg | input image}" );
        Mat src = imread( samples::findFile( parser.get<String>( "@input" ) ) );
        if( src.empty() )
        {
            cout << "Could not open or find the image!\n" << endl;
            cout << "Usage: " << argv[0] << " <Input image>" << endl;
            return -1;
        }
        cvtColor( src, src_gray, COLOR_BGR2GRAY );
        blur( src_gray, src_gray, Size(3,3) );
        const char* source_window = "Source";
        namedWindow( source_window );
        imshow( source_window, src );
        const int max_thresh = 255;
        createTrackbar( "Canny thresh:", source_window, &thresh, max_thresh, thresh_callback );
        thresh_callback( 0, 0 );
        waitKey();
        return 0;
    }
    void thresh_callback(int, void* )
    {
        Mat canny_output;
        Canny( src_gray, canny_output, thresh, thresh*2 );
        vector<vector<Point> > contours;
        findContours( canny_output, contours, RETR_TREE, CHAIN_APPROX_SIMPLE );
        vector<vector<Point> >hull( contours.size() );
        for( size_t i = 0; i < contours.size(); i++ )
        {
            convexHull( contours[i], hull[i] );
        }
        Mat drawing = Mat::zeros( canny_output.size(), CV_8UC3 );
        for( size_t i = 0; i< contours.size(); i++ )
        {
            Scalar color = Scalar( rng.uniform(0, 256), rng.uniform(0,256), rng.uniform(0,256) );
            drawContours( drawing, contours, (int)i, color );
            drawContours( drawing, hull, (int)i, color );
        }
        imshow( "Hull demo", drawing );
    }
    

    结果

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • OpenCV 凸包检测

    2019-02-21 11:05:11
    凸包是一个计算几何图形学中的概念,在二维欧几里得空间中,凸包可以想象成一条刚好包住所有点的橡皮圈。...OpenCV中提供了函数convexHull 用于对物体轮廓凸包进行检测 C++: void convexHull(InputArray poi...

    凸包是一个计算几何图形学中的概念,在二维欧几里得空间中,凸包可以想象成一条刚好包住所有点的橡皮圈。对于给定二维平面上的点集,凸包常常就是将最外层的点连接起来构成的凸多边形,它能包含点击中所有的点。物体的凸包检测常应用在物体识别、手势识别及边界检测等领域。
    OpenCV中提供了函数convexHull 用于对物体轮廓凸包进行检测

    C++: void convexHull(InputArray points, OutputArray hull, bool clockwise=false, bool returnPoints=true )
    

    point : 输入的二维点集,可储存在向量或矩阵Mat中

    hull : 输出凸包,这是一个整数索引的载体或点的矢量,可以是vector<vector<Point>>vector<vector<int>>

    clockwise : 方向标志位

    return Point :操作标准位

    使用convexityDefects()函数分析形状凸包缺陷

    void convexityDefects(InputArray contours,InputArray convexhull,OutputArray convexityDefects)
    

    contours : 输入参数检测到的轮廓,可以通过调用获取轮廓函数findContours()获得

    convexhull : 输入参数检测到的凸包,为vector<vector<int>>类型

    convexityDefects : 输出参数,为vector<vector<Vec4i>>类型,Vec4i存储了起始点、结束点、距离和最远点到凸包的距离

    凸包及缺陷检测代码

    #include<iostream>
    #include"opencv2/opencv.hpp"
    
    using namespace std;
    using namespace cv;
    void convex(Mat& src);
    //随机数产生器
    RNG rng(12345);
    
    int main()
    {
    	Mat src = imread("F:\\C++\\圆.jpg");
    	if (!src.data)
    		return -1;
    	Mat dst;
    	convex(src);
    	imshow("src", src);
    	waitKey(0);
    	return 0;
    }
    
    
    void convex(Mat& src)
    {
    	Mat threMat,srcgray;
    	//轮廓检测参数
    	vector<vector<Point>>contours;
    	vector<Vec4i>hierarchy;
    	cvtColor(src, srcgray, CV_BGR2GRAY);
    	//二值化
    	threshold(srcgray, threMat, 100, 255, THRESH_BINARY);
    	//轮廓检测
    	findContours(threMat, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
    	//凸包及缺陷检测参数
    	vector<vector<Point>>PointHull(contours.size());
    	vector<vector<int>>IntHull(contours.size());
    	vector<vector<Vec4i>>HullDefect(contours.size());
    	for (size_t i = 0; i < contours.size(); i++)
    	{
    		//Point类型凸包检测
    		convexHull(Mat(contours[i]), PointHull[i], false);
    		//int类型凸包检测
    		convexHull(Mat(contours[i]), IntHull[i], false);
    		//凸包缺陷检测
    		convexityDefects(Mat(contours[i]),IntHull[i], HullDefect[i]);
    	}
    	//绘制凸包检测及缺陷检测
    	Mat drawing = Mat::zeros(threMat.size(), CV_8UC3);
    	for (size_t i = 0; i < contours.size(); i++)
    	{
    		Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));//产生0~255之间的随机数
    		drawContours(drawing, contours, i, color, 1, 8, vector<Vec4i>(), 0);
    		drawContours(drawing, PointHull, i, color, 1, 8, vector<Vec4i>(), 0);
    		//绘制缺陷
    		size_t count = contours[i].size();
    		if (count < 300)
    			continue;
    		//设置凸包缺陷迭代器
    		vector<Vec4i>::iterator iterDefects = HullDefect[i].begin();
    		//遍历得到四个特征量
    		while (iterDefects != HullDefect[i].end())
    		{
    			Vec4i& v = (*iterDefects);
    			//起始位置
    			int startidx = v[0];
    			Point ptStart(contours[i][startidx]);
    			//终止位置
    			int endidx = v[1];
    			Point ptEnd(contours[i][endidx]);
    			//内凸壳的最远的点缺陷
    			int faridx = v[2];
    			Point ptFar(contours[i][faridx]);
    			//凸包之间的最远点
    			int depth = v[3] / 256;
    			//绘制相应的线与圆检测的结果
    			if (depth > 20 && depth < 80)
    			{
    				line(drawing, ptStart, ptFar, CV_RGB(0, 255, 0), 2);
    				line(drawing, ptEnd, ptFar, CV_RGB(0, 255, 0), 2);
    				circle(drawing, ptStart, 4, Scalar(255, 0, 100), 2);
    				circle(drawing, ptEnd, 4, Scalar(255, 0, 100), 2);
    				circle(drawing, ptFar, 4, Scalar(100, 0, 255), 2);
    			}
    			iterDefects++;
    		}
    	}
    	imshow("result", drawing);
    }
    
    展开全文
  • OpenCV凸包与凸缺陷

    2021-04-25 15:17:38
    随着人工智能的不断发展,OpenCV这门技术也越来越重要,很多人都开启了学习OpenCV,本文就介绍了OpenCV中的凸包的应用。 一、凸包是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而...


    前言

    前面我们学习了轮廓与逼近多边形现在我们学习凸包。


    一、凸包是什么?

    凸包和逼近多边形高度相似。凸包指的是完全包含原有轮廓并且由轮廓上的点构成多边形。凸包的每一处都是凸的。凸包内任意连续三个点内角小于180°。

    二、使用步骤

    1.导包导入图片(基本操作)

    原图:
    在这里插入图片描述

    代码如下(示例):

    import cv2
    import numpy as np
    
    img =cv2.imread("shape.jpg")  #imread(图片名.格式)
    

    2.绘制图片轮廓

    代码如下(示例):

    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)   #转化为灰度图
    ret,binary= cv2.threshold(gray,127,255,0)     #转化为二值图
    contours,h= cv2.findContours(binary,cv2.RETR_LIST,\
                                 cv2.CHAIN_APPROX_SIMPLE)
    

    3.获取凸包

    代码如下(示例):

    hull= cv2.convexHull(contours[0])     #寻找凸包并绘制
    cv2.polylines(img,[hull],True,(255,255,0),3)
    cv2.imshow("img",img)                 #显示图片
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    在这里插入图片描述


    三、凸缺陷

    凸缺陷就是指凸包与轮廓之间的部分。
    函数为: convexityDefects= cv2.convexityDefects(contour, convexHull)

    • contour 指轮廓
    • convexHull指凸包

    四、使用步骤

    原图

    在这里插入图片描述

    1.获取凸包

    代码如下(示例):

    img = cv2.imread("图片名")
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    ret,binary= cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
    contours,h= cv2.findContours(binary,cv2.RETR_LIST,\
                                 cv2.CHAIN_APPROX_SIMPLE)
    #获取凸包
    hull= cv2.convexHull(contours[0],returnPoints= False)
    df= cv2.convexityDefects(contours[0],hull)
    
    

    2.得到索引绘制凸缺陷

    代码如下(示例):

    for i in range(df.shape[0]):
        s,e,f,d= df[i,0]
        start= tuple(contours[0][s][0])
        end= tuple(contours[0][e][0])     
                                  #由于多次出现contours[0]可以定义一下
        far= tuple(contours[0][f][0])
        cv2.line(img,start,end,[0,0,255],2)
        cv2.circle(img,far,5,[255,0,0],-1)
        
    
    cv2.imshow("img",img)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    

    在这里插入图片描述

    总结

    以上就是今天要讲的凸包内容,本文仅仅简单介绍了凸包的使用,我们还可以根据其他条件对绘制凸包的区域进行筛选,从而更灵活的使用。

    展开全文
  • opencv 凸包讲解和绘制

    2020-04-01 10:25:02
    凸包讲解 凸包跟多边形逼近很像,只不过它是物体最外层的”凸”多边形:集合A内连接任意两个点的直线都...opencv凸包函数 # cnt:轮廓;hull:返回的凸包的角点坐标;reuturnPoints=True:代表返回角点的x/y坐标 hull...
  • opencv凸包的简单运用

    2021-04-24 14:59:32
    这次我们来学习关于opencv的图像轮廓中很重要的一个内容,凸包凸包指的是完全包含原有轮廓, #仅由轮廓上的点所构成的多边形。凸包的,每一处都是凸的,即凸包内任意两点的直线都在凸包的内部。在凸包内,任意的...
  • opencv凸包注意事项

    2019-10-29 11:35:17
    另外,凸包缺陷检测要求检测的轮廓内包含像素点个数不小于4,否则会报错,这是很多网上的其他博客中没有注意到的,其中他们的代码也是千篇一律,这里会使其代码报莫名其妙的错。 ...
  • C++ OpenCV凸包检测

    2018-05-21 08:50:30
    凸包凸包指如果在集合A内连接任意两个点的直线段都在A的内部,则称集合A是凸形的。简单点理解,就是一个多边型,没有凹的地方。凸包(凸壳)能包含点集中所有的点,凸包检测常应用在物体识别、手势...
  • 凸包(Convex Hull)是一个计算几何(图形学)中的概念,在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。 X的凸包可以用X内所有点(x1, x2….xn)的线性组合来构造。在二维欧几里得空间中...
  • OpenCV凸包凸缺陷检测

    千次阅读 2017-09-30 23:53:59
    右图中,蓝色线为凸包,凸缺陷的起始点为黑色点,凸缺陷的起始点为绿色点,凸缺陷的最深点为红色点(即边缘点到凸包距离最大点)。 void convexityDefects(InputArray contour, InputArray convexhull, OutputArray ...
  • opencv 凸包检测

    千次阅读 2013-06-24 16:03:02
    //对应凸出来的那些点,链接这些点形成一个多变形,凸包就是 cvCircle(dst,*df.end,2,CV_RGB(255,0,255),-1); cvCircle(dst,*df.depth_point,2,CV_RGB(0,255,255),-1);//对应凹进去的那些点 cvLine(dst,*df...
  • CV_IMPL CvSeq* cvConvexityDefects( const CvArr* array, const CvArr* hullarray, CvMemStorage* storage ) { CvSeq* defects = 0; ...
  • vector<Point>是point数据类型的集合,简单讲就是很多point。vector<vector<Point>>就是包含很多vector<Point>的集合。 http://blog.csdn.net/sunny2038/article/details/12889059 ...
  • python opencv 凸包

    2020-11-13 21:53:15
    # 轮廓发现 contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for c in range(len(contours)): # 是否为凸包 ret = cv2.isContourConvex(contours[c]) if not ret: # ...
  • 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数 道格拉斯-普克算法(Douglas–Peucker algorithm),亦称为拉默-道格拉斯-普克算法(Ramer–Douglas–Peucker algorithm),这个...
  • OpenCV-凸包

    千次阅读 2019-04-14 15:28:16
    凸包(convex hull) 概念: Graham扫描算法: API: #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> #include <opencv2/highgui/highgui.hpp> using ...
  • OpenCV:凸包

    千次阅读 2017-03-08 09:14:57
    计算凸包OpenCV提供了函数:convexHull(Mat(points), hull, true);下面的OpenCV示例程序,随机产生了一个点集,然后计算了它的凸包。并将点集和凸包画了出来。#include "opencv2/imgproc/imgproc.hpp" #include ...
  • OpenCV3凸包

    2020-08-05 13:36:25
    凸包 凸包概念:在一个多边形边缘或者内部任意两个点的连线都包含在多边形边界或者内部 定义:包含点集合s中所有点的最小凸多边形称为凸包 相关API: convexHull( InputArray point,//输入候选点,来自findcontours ...
  • OpenCV——凸包

    2018-09-23 12:50:00
    1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 #include <math.h> 4 5 using namespace cv; 6 using namespace std; 7 8 9 int main(int argc, char...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 530
精华内容 212
关键字:

opencv凸包