ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

点到轮廓的距离

2022-02-07 20:01:05  阅读:192  来源: 互联网

标签:距离 contours 返回值 canny 点到 轮廓 像素点


点到轮廓的距离

简介

  • 点到轮廓的距离,对于计算轮廓在图像中的位置、两个轮廓之间的距离以及确定图像上某一点是否在轮廓内部具有重要的作用。

实现

OpenCV 4 提供了计算像素点距离轮廓最小距离的pointPolygonTest()函数

double cv::pointPolygonTest(InputArray contour, Point2f pt, bool measureDist)
  • contour:输入的轮廓,类型为 vector<Point>Mat
  • pt:需要计算与轮廓距离的像素点
  • measureDist:计算的距离是否具有方向性的标志。false 表示输出结果不具有方向性,只判断像素点与轮廓之间的位置关系,如果像素点在轮廓的内部,返回值为 -1,如果像素点在轮廓的边缘上,返回值为0,如果像素点在轮廓的外部,返回值为 -1;true 表示输出结果具有方向性,如果像素点在轮廓内部,返回值为正数,如果像素点在轮廓外部,返回值为负数

示例代码:

#include <opencv2/opencv.hpp>
#include <vector>
using namespace cv;
using namespace std;

int main()
{
    Mat img = imread("/home/kslas/OpenCV/regular.jpg");

    // 边缘检测
    Mat canny;
    Canny(img, canny, 80, 160, 3, false);
    // 膨胀运算
    Mat kernel = getStructuringElement(0, Size(3, 3));
    dilate(canny, canny, kernel);
    // 轮廓发现
    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;
    findContours(canny, contours, hierarchy, 0, 2);

    // 创建图像中的一个像素点并绘制图形
    Point point = Point(50, 300);
    circle(img, point, 2, Scalar(0, 0, 255), 2);

    // 多边形
    for (int i = 0; i < contours.size(); i++)
    {
        // 用最小外接矩形求取轮廓中心
        RotatedRect rrect = minAreaRect(contours[i]);
        Point2f center = rrect.center;
        circle(img, center, 2, Scalar(0, 255, 0), 2);  // 绘制圆心点

        // 轮廓外部点距离轮廓的距离
        double dis = pointPolygonTest(contours[i], point, true);
        // 轮廓内部点距离轮廓的距离
        double dis2 = pointPolygonTest(contours[i], center, true);
        // 输出点结果
        cout << "外部点距离轮廓距离: " << dis << endl;
        cout << "内部点距离轮廓距离: " << dis2 << endl;
    }
    imshow("img", img);
    waitKey(0);
    destroyAllWindows();
    return 0;
}

运行结果:

标签:距离,contours,返回值,canny,点到,轮廓,像素点
来源: https://www.cnblogs.com/TNTksals/p/15868978.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有