• 30 OpenCV 点多边形测试


    点多边形测试

    在这里插入图片描述

    pointPolygonTest

    pointPolygonTest(
    InputArray  contour,// 输入的轮廓
    Point2f  pt, // 测试点
    bool  measureDist // 是否返回距离值,如果是false,1表示在内面,0表示在边界上,-1表示在外部,true返回实际距离
    )
    
    返回数据是double类型
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    示例

    #include 
    #include 
    #include 
    
    using namespace std;
    using namespace cv;
    
    int main(int argc, char** argv) {
        // 创建一个空白的图像
        const int r = 100;
        Mat src = Mat::zeros(r * 4, r * 4, CV_8UC1);
    
        // 定义六边形的顶点
        vector<Point2f> vert(6);
        vert[0] = Point(3 * r / 2, static_cast<int>(1.34*r));   
        vert[1] = Point(1 * r, 2 * r);
        vert[2] = Point(3 * r / 2, static_cast<int>(2.866*r));   
        vert[3] = Point(5 * r / 2, static_cast<int>(2.866*r));
        vert[4] = Point(3 * r, 2 * r);   
        vert[5] = Point(5 * r / 2, static_cast<int>(1.34*r));
    
        // 在图像上绘制六边形
        for (int i = 0; i < 6; i++) {
            line(src, vert[i], vert[(i + 1) % 6], Scalar(255), 3, 8, 0);
        }
    
        // 查找轮廓
        vector<vector<Point>> contours;
        vector<Vec4i> hierachy;
        Mat csrc;
        src.copyTo(csrc);
        findContours(csrc, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
    
        // 计算每个像素点到轮廓的距离
        Mat raw_dist = Mat::zeros(csrc.size(), CV_32FC1);
        for (int row = 0; row < raw_dist.rows; row++) {
            for (int col = 0; col < raw_dist.cols; col++) {
                // 计算当前像素到轮廓的距离
                double dist = pointPolygonTest(contours[0], Point2f(static_cast<float>(col), static_cast<float>(row)), true);
                // 将距离值转换为float类型并存储到raw_dist图像中
                raw_dist.at<float>(row, col) = static_cast<float>(dist);
            }
        }
    
        // 将距离映射到颜色,并创建一个新的图像
        double minValue, maxValue;
        minMaxLoc(raw_dist, &minValue, &maxValue, 0, 0, Mat());
        Mat drawImg = Mat::zeros(src.size(), CV_8UC3);
        for (int row = 0; row < drawImg.rows; row++) {
            for (int col = 0; col < drawImg.cols; col++) {
                float dist = raw_dist.at<float>(row, col);
                if (dist > 0) {
                    // 正距离映射到蓝色通道
                    drawImg.at<Vec3b>(row, col)[0] = (uchar)(abs(1.0 - (dist / maxValue)) * 255);
                }
                else if (dist < 0) {
                    // 负距离映射到红色通道
                    drawImg.at<Vec3b>(row, col)[2] = (uchar)(abs(1.0 - (dist / minValue)) * 255);
                } else {
                    // 距离为0的像素点设为白色
                    drawImg.at<Vec3b>(row, col)[0] = (uchar)(abs(255 - dist));
                    drawImg.at<Vec3b>(row, col)[1] = (uchar)(abs(255 - dist));
                    drawImg.at<Vec3b>(row, col)[2] = (uchar)(abs(255 - dist));
                }
            }
        }
    
        // 创建窗口并显示图像
        const char* output_win = "point polygon test demo";
        char input_win[] = "input image";
        namedWindow(input_win, CV_WINDOW_AUTOSIZE);
        namedWindow(output_win, CV_WINDOW_AUTOSIZE);
    
        imshow(input_win, src);
        imshow(output_win, drawImg);
    
        waitKey(0);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79

    在这里插入图片描述

  • 相关阅读:
    【STM32】存储器和位带映射(bit band mapping)
    创建SpringBoot工程
    【python版CV】-图像处理(1)
    【centos7】centos7卸载gitlab
    淘宝app商品详情源数据API接口(解决滑块问题)可高并发采集
    04:输出保留3位小数的浮点数
    Mac上在vm虚拟机上搭建Hadoop集群并安装zookeeper hive hbase
    24v转5v稳压芯片-5A大电流输出ic
    低成本、高效率!华为云桌面助力企业数字化转型
    python:openpyxl 读取 Excel文件,显示在 wx.grid 表格中
  • 原文地址:https://blog.csdn.net/weixin_45672157/article/details/138202250