• 《opencv学习笔记》-- 寻找物体凸包


    给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型,它是能包含点集中所有点的。理解物体形状或轮廓的一种比较有用的方法便是计算一个物体的凸包,然后计算其凸缺陷(convexity defects)。很多复杂物体的特性能很好地被这种缺陷表现出来。
    寻找凸包:convexHull()函数

    1. void convexHull(InputArray points, OutputArray hull,
    2. bool clockwise = false, bool returnPoints = true )

    参数1,InputArray类型的points,输入的二维点集,填Mat类型或者std::vector。

    参数2,OutputArray类型的hull,输出找到的凸包。一般为std::vector类型。

    参数3,bool类型的clockwise,操作方向标识符。当标识符为真时,输出的凸包为顺时针

                 方向。否则,就为逆时针方向。并且是假定坐标系的x轴指向右,y轴指向上方。

    参数4,bool类型的returnPoints,操作标志符,默认值 true。当标志符为真时,

                 函数返回各凸包的各个点。否则,它返回凸包各点的指数。

                 当输出数组是std::vector时,此标志被忽略。

    1. //初始化变量和随机值
    2. Mat image(600, 600, CV_8UC3);
    3. RNG& rng = theRNG();
    4. //参数初始化
    5. int count = (unsigned)rng % 100 + 3; // 随机生成点的数量
    6. vector points; // 点值
    7. //随机生成点坐标
    8. for (int i = 0; i < count; i++) {
    9. Point point;
    10. point.x = rng.uniform(image.cols / 4, image.cols * 3 / 4);
    11. point.y = rng.uniform(image.rows / 4, image.rows * 3 / 4);
    12. points.push_back(point);
    13. }
    14. //检测凸包
    15. vector<int> hull;
    16. convexHull(Mat(points), hull, true);
    17. //绘制出随机颜色的点
    18. image = Scalar::all(0);
    19. for (int i = 0; i < count; i++) {
    20. circle(image, points[i], 3, Scalar(rng.uniform(0, 255),
    21. rng.uniform(0, 255), rng.uniform(0, 255)), FILLED, LINE_AA);
    22. }
    23. imshow("image0", image);
    24. //准备参数
    25. int hullcount = (int)hull.size(); // 凸包的边数
    26. Point point0 = points[hull[hullcount - 1]]; // 连接凸包边的坐标点
    27. //绘制凸包的边
    28. for (int i = 0; i < hullcount; i++)
    29. {
    30. Point point = points[hull[i]];
    31. line(image, point0, point, Scalar(255, 255, 255), 2, LINE_AA);
    32. point0 = point;
    33. }
    34. imshow("image", image);

    返回外部矩形边界:   boundingRect()函数

            此函数计算并返回指定点集最外面( up-right)的矩形边界。

     Rect boundingRect(InputArray  points)

    参数1,输入的二维点集,可以是 std:vector 或 Mat类型。

    寻找最小包围矩形:  minAreaRect()函数

            此函数用于对给定的2D点集,寻找可旋转的最小面积的包围矩形。

    RotatedRect  minAreaRect (InputArray points)

    参数1,输入的二维点集,可以为std:vector>或Mat类型。

    寻找最小包围圆形:  minEnclosingCircle()函数

            利用一种迭代算法,对给定的2D点集,去寻找面积最小的可包围它们的圆形。

    void minEnclosingCircle(InputArray points, Point2f& center, float& radius)

    参数1,InputArray类型的points,输入的二维点集,可以为std::vector<>或Mat类型。

    参数2,Point2f&类型的center,圆的输出圆心。

    参数3,float&类型的radius,圆的输出半径。

    用椭圆拟合二维点集:  fitEllipse()函数

    RotatedRect fitEllipse(InputArray points)

    参数:输入的二维点集,可以为 std::vector>或 Mat类型。

    逼近多边形曲线: approxPolyDP()函数

    1. void approxPolyDP(InputArray curve, outputArray approxcurve,
    2. double epsilon, bool closed)

    参数1,InputArray类型的curve,输入的二维点集,可以为std::vecto或Mat类型。

    参数2,OutputArray类型的approxCurve,多边形逼近的结果,类型和输入的二维点集的

                 类型一致。

    参数3,double类型的epsilon,逼近的精度,为原始曲线和即近似曲线间的最大值。

    参数4,bool类型的closed,如果为真,则近似的曲线为封闭曲线(第一个顶点和最后一个

                 顶点相连),否则,近似的曲线曲线不封闭。

  • 相关阅读:
    信创环境下密码强度规则:设置密码长度为6至20位,包含大、小写字母、数字、特殊字符组合
    【Database System Concept 7th】Chapter 24 Advanced Indexing Techniques 读书笔记
    Linux jenkins忘记密码处理
    JavaScript之数据类型、类型判断、类型转换
    云管理平台的安全措施
    哈希表6——四数相加
    线程(中):线程安全
    elasticsearch中设置查询的请求超时时间
    使用Docker+Jenkins+Gitee自动化部署SpringBoot项目
    Debian11之稳定版本Jenkins安装
  • 原文地址:https://blog.csdn.net/qq_41653875/article/details/126337848