• 《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,如果为真,则近似的曲线为封闭曲线(第一个顶点和最后一个

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

  • 相关阅读:
    蜂鸣器电路设计中选用注意事项--【电路设计】
    Python 编程基础 | 第四章-函数 | 4.1、函数定义
    力扣第40题 组合总和 || c++ 回溯经典
    QTimer::singleShot问题及用法
    ChatGPT绘图指南:DALL.E3玩法大全(一)
    Linux C应用编程-4-信号
    .NET 7 的 AOT 到底能不能扛反编译?
    Python Flask
    手动模拟 calico 网络
    vue3中使用 vue3-slide-verify 滑块验证登录
  • 原文地址:https://blog.csdn.net/qq_41653875/article/details/126337848