• opencv c++图像轮廓计算


    1、轮廓面积:

            基于格林公式计算:

    连续型:                                                               离散型

     2、轮廓周长:

            基于L2范数计算距离。

    3、最小外接轮廓:

            矩形,椭圆等外接形状。

    4、API

    查找轮廓:

    1. void cv::findContours ( InputArray image,
    2. OutputArrayOfArrays contours,
    3. OutputArray hierarchy,
    4. int mode,
    5. int method,
    6. Point offset = Point()
    7. )

     绘制轮廓:

    1. void cv::drawContours ( InputOutputArray image,
    2. InputArrayOfArrays contours,
    3. int contourIdx,
    4. const Scalar & color,
    5. int thickness = 1,
    6. int lineType = LINE_8,
    7. InputArray hierarchy = noArray(),
    8. int maxLevel = INT_MAX,
    9. Point offset = Point()
    10. )

    5、示例代码

            代码展示了对二值化图像的轮廓查找轮廓绘制轮廓面积及周长的计算和应用轮廓外接矩形椭圆带角度的矩形角度信息的提取

    1. void QuickDemo::contour(Mat& image)
    2. {
    3. //高斯模糊
    4. GaussianBlur(image, image, Size(3, 3), 0);
    5. Mat gray;
    6. cvtColor(image, gray, COLOR_BGR2GRAY);
    7. Mat binary;
    8. threshold(gray, binary, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
    9. namedWindow("THRESH_OTSU", WINDOW_FREERATIO);
    10. imshow("THRESH_OTSU", binary);
    11. //查找轮廓
    12. vector> contours;
    13. vector hierachy;
    14. findContours(binary, contours, hierachy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point());
    15. for (size_t t = 0; t < contours.size(); ++t) {
    16. double area = contourArea(contours[t]);
    17. double size = arcLength(contours[t], true);//只记录了闭合轮廓
    18. cout << "第" << t << "个轮廓的面积为" << area << endl;
    19. cout << "第" << t << "个轮廓的周长为" << size << endl << endl;
    20. //根据面积和周长过滤,然后绘制轮廓或绘制外接图形
    21. if (area > 100 || size > 100)continue;
    22. //轮廓
    23. //drawContours(image, contours, t, Scalar(0, 0, 255), 2, 8);
    24. //外接矩形
    25. /*Rect box = boundingRect(contours[t]);
    26. rectangle(image, box, Scalar(0, 0, 255), 2, 8);*/
    27. RotatedRect rt = minAreaRect(contours[t]);
    28. //椭圆
    29. ellipse(image, rt, Scalar(0, 0, 255), 2, 8);
    30. //有角度的矩形绘制
    31. Point2f pts[4];
    32. rt.points(pts);
    33. for (int i = 0; i < 4; ++i) {
    34. line(image, pts[i], pts[(i + 1) % 4], Scalar(0, 0, 255), 2, 8);
    35. }
    36. //角度获取
    37. cout << rt.angle << endl;
    38. }
    39. imshow("contours", image);
    40. }

  • 相关阅读:
    apk反编译修改教程系列-----修改apk中的图片 任意更换apk桌面图片【三】
    Java中关键字final的用法细节详解
    14、我们仓里的年轻人
    MySQL基础【学习至数据的导入导出】
    【Redis专题】RedisCluster集群运维与核心原理剖析
    黑豹程序员-架构师学习路线图-百科:Maven
    【LeetCode】No.48. Rotate Image -- Java Version
    Stable Diffusion 3震撼发布模型与Sora同架构
    计算机毕业设计ssm图书馆管理系统z3z90系统+程序+源码+lw+远程部署
    分享一下做一个电商小程序的步骤是什么呢
  • 原文地址:https://blog.csdn.net/lucust/article/details/128158595