pointPolygonTest多边形检测

来源:互联网 发布:巴蒂斯图塔巅峰数据 编辑:程序博客网 时间:2024/05/29 15:26

根据官网提供的程序

#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>#include <stdio.h>#include <stdlib.h>using namespace cv;using namespace std;/** @function main */int main(int argc, char** argv){    /// 创建一个图形     const int r = 100;    Mat src = Mat::zeros(Size(4 * r, 4 * r), CV_8UC1);    /// 绘制一系列点创建一个轮廓:    vector<Point2f> vert(6);    vert[0] = Point(1.5*r, 1.34*r);    vert[1] = Point(1 * r, 2 * r);    vert[2] = Point(1.5*r, 2.866*r);    vert[3] = Point(2.5*r, 2.866*r);    vert[4] = Point(3 * r, 2 * r);    vert[5] = Point(2.5*r, 1.34*r);    for (int i = 0; i <= 5; i++)    {        cout << "vert[i]" << vert[i]<<endl;    }    /// 在src内部绘制    for (int j = 0; j < 6; j++)    {        line(src, vert[j], vert[(j + 1) % 6], Scalar(255), 3, 8);//画线不取余时,报错,显示vector out of range    }    /// 得到轮廓    vector<vector<Point> > contours;     vector<Vec4i> hierarchy;    Mat src_copy = src.clone();    findContours(src_copy, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);    /// 计算到轮廓的距离    Mat raw_dist(src.size(), CV_32FC1);    for (int j = 0; j < src.rows; j++)    {        for (int i = 0; i < src.cols; i++)        {            raw_dist.at<float>(j, i) = pointPolygonTest(contours[0], Point2f(i, j), true);        }    }    double minVal; double maxVal;    minMaxLoc(raw_dist, &minVal, &maxVal, 0, 0, Mat());    minVal = abs(minVal); maxVal = abs(maxVal);    cout << minVal << endl;    cout << maxVal << endl;    /// 图形化的显示距离    Mat drawing = Mat::zeros(src.size(), CV_8UC3);    for (int j = 0; j < src.rows; j++)    {        for (int i = 0; i < src.cols; i++)        {            if (raw_dist.at<float>(j, i) < 0)//表示在轮廓线外部,因为pointPolygonTest里的measureDist为true            {                drawing.at<Vec3b>(j, i)[0] = 255 - (int)abs(raw_dist.at<float>(j, i)) * 255 / minVal;            }            else if (raw_dist.at<float>(j, i) > 0)            {                drawing.at<Vec3b>(j, i)[1] = 255 - (int)abs(raw_dist.at<float>(j, i) )* 255 / maxVal;            }            else            {                drawing.at<Vec3b>(j, i)[0] = 255; drawing.at<Vec3b>(j, i)[1] = 255; drawing.at<Vec3b>(j, i)[2] = 255;            }        }    }    /// 创建窗口显示结果    char* source_window = "Source";    namedWindow(source_window, WINDOW_AUTOSIZE);    imshow(source_window, src);    namedWindow("Distance", WINDOW_AUTOSIZE);    imshow("Distance", drawing);    waitKey(0);    return(0);}

这里写图片描述
根据图中所示,在轮廓线内的为绿色,因为是通道1,外面是蓝色,通道为0

不知道为什么,画线不取余时,即vert[(j + 1) % 6改成vert[(j + 1) 报错,显示vector out of range 。希望过路大神能告知。
/// 在src内部绘制
for (int j = 0; j < 6; j++)
{
line(src, vert[j], vert[(j + 1) % 6], Scalar(255), 3, 8);
}

0 0